]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge branch 'master' of git://git.denx.de/u-boot-fsl-qoriq
authorTom Rini <trini@konsulko.com>
Wed, 27 Jan 2016 20:05:36 +0000 (15:05 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 27 Jan 2016 20:05:36 +0000 (15:05 -0500)
459 files changed:
.checkpatch.conf
.mailmap
Kconfig
Makefile
README
arch/arm/Kconfig
arch/arm/config.mk
arch/arm/cpu/armv7/mx6/clock.c
arch/arm/cpu/armv7/mx7/soc.c
arch/arm/cpu/armv7/sunxi/Makefile
arch/arm/cpu/armv7/sunxi/board.c
arch/arm/cpu/armv7/sunxi/clock.c
arch/arm/cpu/armv7/sunxi/clock_sun6i.c
arch/arm/cpu/armv7/sunxi/dram_sun8i_a83t.c
arch/arm/cpu/armv7/sunxi/psci_sun6i.S
arch/arm/cpu/armv7/sunxi/tzpc.c
arch/arm/cpu/armv8/zynqmp/Kconfig
arch/arm/cpu/armv8/zynqmp/clk.c
arch/arm/cpu/armv8/zynqmp/cpu.c
arch/arm/dts/Makefile
arch/arm/dts/armada-xp-theadorable.dts [new file with mode: 0644]
arch/arm/dts/sun8i-a83t-sinovoip-bpi-m3.dts [new file with mode: 0644]
arch/arm/dts/zynq-7000.dtsi
arch/arm/dts/zynq-zc770-xm010.dts
arch/arm/dts/zynq-zc770-xm011.dts
arch/arm/dts/zynq-zc770-xm012.dts
arch/arm/dts/zynq-zc770-xm013.dts
arch/arm/dts/zynqmp-ep108.dts
arch/arm/dts/zynqmp.dtsi
arch/arm/include/asm/arch-mx6/crm_regs.h
arch/arm/include/asm/arch-mx7/imx-regs.h
arch/arm/include/asm/arch-sunxi/clock.h
arch/arm/include/asm/arch-sunxi/clock_sun6i.h
arch/arm/include/asm/arch-sunxi/dram_sun8i_a83t.h
arch/arm/include/asm/arch-sunxi/tzpc.h
arch/arm/include/asm/arch-zynqmp/clk.h
arch/arm/include/asm/arch-zynqmp/hardware.h
arch/arm/include/asm/imx-common/dma.h
arch/arm/include/asm/imx-common/regs-apbh.h
arch/arm/include/asm/imx-common/regs-bch.h
arch/arm/mach-mvebu/Kconfig
arch/arm/mach-mvebu/include/mach/cpu.h
arch/arm/mach-mvebu/include/mach/soc.h
arch/arm/mach-tegra/ap.c
arch/arm/mach-zynq/ddrc.c
arch/microblaze/Kconfig
arch/microblaze/cpu/Makefile
arch/microblaze/cpu/cpu.c [deleted file]
arch/microblaze/cpu/start.S
arch/mips/include/asm/io.h
arch/openrisc/lib/board.c
arch/powerpc/config.mk
arch/powerpc/cpu/mpc512x/serial.c
arch/powerpc/cpu/mpc5xxx/serial.c
arch/powerpc/cpu/mpc83xx/law.c
arch/powerpc/cpu/mpc85xx/cpu_init.c
arch/powerpc/cpu/mpc8xxx/law.c
arch/powerpc/cpu/ppc4xx/Kconfig
arch/powerpc/cpu/ppc4xx/interrupts.c
arch/powerpc/cpu/ppc4xx/uic.c
arch/powerpc/cpu/ppc4xx/xilinx_irq.c
arch/powerpc/dts/Makefile
arch/powerpc/dts/xilinx-ppc405-generic.dts [new file with mode: 0644]
arch/powerpc/dts/xilinx-ppc440-generic.dts [new file with mode: 0644]
arch/powerpc/include/asm/interrupt.h
arch/powerpc/include/asm/xilinx_irq.h
arch/x86/cpu/baytrail/valleyview.c
arch/x86/cpu/coreboot/pci.c
arch/x86/cpu/cpu.c
arch/x86/cpu/interrupts.c
arch/x86/cpu/irq.c
arch/x86/cpu/ivybridge/Makefile
arch/x86/cpu/ivybridge/bd82x6x.c
arch/x86/cpu/ivybridge/cpu.c
arch/x86/cpu/ivybridge/early_init.c [deleted file]
arch/x86/cpu/ivybridge/early_me.c
arch/x86/cpu/ivybridge/gma.c
arch/x86/cpu/ivybridge/lpc.c
arch/x86/cpu/ivybridge/model_206ax.c
arch/x86/cpu/ivybridge/northbridge.c
arch/x86/cpu/ivybridge/pch.c [deleted file]
arch/x86/cpu/ivybridge/pci.c [deleted file]
arch/x86/cpu/ivybridge/report_platform.c
arch/x86/cpu/ivybridge/sata.c
arch/x86/cpu/ivybridge/sdram.c
arch/x86/cpu/ivybridge/usb_ehci.c [deleted file]
arch/x86/cpu/ivybridge/usb_xhci.c [deleted file]
arch/x86/cpu/qemu/qemu.c
arch/x86/cpu/quark/Makefile
arch/x86/cpu/quark/irq.c [new file with mode: 0644]
arch/x86/cpu/quark/quark.c
arch/x86/cpu/queensbay/Makefile
arch/x86/cpu/queensbay/irq.c [new file with mode: 0644]
arch/x86/cpu/queensbay/tnc.c
arch/x86/dts/bayleybay.dts
arch/x86/dts/broadwell_som-6896.dts
arch/x86/dts/chromebook_link.dts
arch/x86/dts/chromebox_panther.dts
arch/x86/dts/crownbay.dts
arch/x86/dts/galileo.dts
arch/x86/dts/minnowmax.dts
arch/x86/dts/qemu-x86_i440fx.dts
arch/x86/dts/qemu-x86_q35.dts
arch/x86/include/asm/arch-ivybridge/bd82x6x.h
arch/x86/include/asm/arch-ivybridge/me.h
arch/x86/include/asm/arch-ivybridge/pch.h
arch/x86/include/asm/arch-ivybridge/sandybridge.h
arch/x86/include/asm/cpu.h
arch/x86/include/asm/irq.h
arch/x86/include/asm/u-boot-x86.h
arch/x86/lib/Makefile
arch/x86/lib/mpspec.c
arch/x86/lib/mrccache.c
arch/x86/lib/northbridge-uclass.c [new file with mode: 0644]
board/avnet/fx12mm/Kconfig [deleted file]
board/avnet/fx12mm/MAINTAINERS [deleted file]
board/avnet/fx12mm/Makefile [deleted file]
board/avnet/fx12mm/fx12mm.c [deleted file]
board/avnet/fx12mm/xparameters.h [deleted file]
board/avnet/v5fx30teval/Kconfig [deleted file]
board/avnet/v5fx30teval/MAINTAINERS [deleted file]
board/avnet/v5fx30teval/Makefile [deleted file]
board/avnet/v5fx30teval/v5fx30teval.c [deleted file]
board/avnet/v5fx30teval/xparameters.h [deleted file]
board/freescale/b4860qds/b4860qds.c
board/freescale/common/vid.c
board/freescale/common/vid.h
board/freescale/corenet_ds/corenet_ds.c
board/freescale/mx25pdk/Makefile
board/freescale/mx25pdk/lowlevel_init.S [deleted file]
board/freescale/mx25pdk/mx25pdk.c
board/freescale/mx7dsabresd/mx7dsabresd.c
board/freescale/p2041rdb/p2041rdb.c
board/freescale/t102xqds/t102xqds.c
board/freescale/t102xrdb/t102xrdb.c
board/freescale/t1040qds/t1040qds.c
board/freescale/t104xrdb/t104xrdb.c
board/freescale/t208xqds/t208xqds.c
board/freescale/t208xrdb/t208xrdb.c
board/freescale/t4qds/t4240emu.c
board/freescale/t4qds/t4240qds.c
board/freescale/t4rdb/t4240rdb.c
board/google/chromebook_link/link.c
board/renesas/sh7753evb/sh7753evb.c
board/sunxi/Kconfig
board/sunxi/MAINTAINERS
board/sunxi/board.c
board/theadorable/MAINTAINERS [new file with mode: 0644]
board/theadorable/Makefile [new file with mode: 0644]
board/theadorable/kwbimage.cfg [new file with mode: 0644]
board/theadorable/theadorable.c [new file with mode: 0644]
board/tqc/tqm834x/tqm834x.c
board/xilinx/microblaze-generic/microblaze-generic.c
board/xilinx/microblaze-generic/xparameters.h
board/xilinx/ml507/Kconfig [deleted file]
board/xilinx/ml507/MAINTAINERS [deleted file]
board/xilinx/ml507/Makefile [deleted file]
board/xilinx/ml507/ml507.c [deleted file]
board/xilinx/ml507/xparameters.h [deleted file]
board/xilinx/ppc405-generic/MAINTAINERS
board/xilinx/ppc405-generic/Makefile
board/xilinx/ppc405-generic/xilinx_ppc405_generic.c
board/xilinx/ppc405-generic/xparameters.h
board/xilinx/ppc440-generic/MAINTAINERS
board/xilinx/ppc440-generic/Makefile
board/xilinx/ppc440-generic/init.S
board/xilinx/ppc440-generic/xilinx_ppc440_generic.c
board/xilinx/ppc440-generic/xparameters.h
board/xilinx/zynq/board.c
board/xilinx/zynqmp/zynqmp.c
cmd/Kconfig [new file with mode: 0644]
cmd/Makefile [new file with mode: 0644]
cmd/aes.c [moved from common/cmd_aes.c with 100% similarity]
cmd/ambapp.c [moved from common/cmd_ambapp.c with 100% similarity]
cmd/armflash.c [moved from common/cmd_armflash.c with 100% similarity]
cmd/bdinfo.c [moved from common/cmd_bdinfo.c with 99% similarity]
cmd/bedbug.c [moved from common/cmd_bedbug.c with 100% similarity]
cmd/blob.c [moved from common/cmd_blob.c with 100% similarity]
cmd/bmp.c [moved from common/cmd_bmp.c with 100% similarity]
cmd/boot.c [moved from common/cmd_boot.c with 100% similarity]
cmd/bootldr.c [moved from common/cmd_bootldr.c with 100% similarity]
cmd/bootm.c [moved from common/cmd_bootm.c with 100% similarity]
cmd/bootmenu.c [moved from common/cmd_bootmenu.c with 100% similarity]
cmd/bootstage.c [moved from common/cmd_bootstage.c with 100% similarity]
cmd/cache.c [moved from common/cmd_cache.c with 100% similarity]
cmd/cbfs.c [moved from common/cmd_cbfs.c with 100% similarity]
cmd/clk.c [moved from common/cmd_clk.c with 100% similarity]
cmd/console.c [moved from common/cmd_console.c with 100% similarity]
cmd/cplbinfo.c [moved from common/cmd_cplbinfo.c with 100% similarity]
cmd/cpu.c [moved from common/cmd_cpu.c with 100% similarity]
cmd/cramfs.c [moved from common/cmd_cramfs.c with 100% similarity]
cmd/dataflash_mmc_mux.c [moved from common/cmd_dataflash_mmc_mux.c with 100% similarity]
cmd/date.c [moved from common/cmd_date.c with 100% similarity]
cmd/dcr.c [moved from common/cmd_dcr.c with 100% similarity]
cmd/demo.c [moved from common/cmd_demo.c with 100% similarity]
cmd/dfu.c [moved from common/cmd_dfu.c with 100% similarity]
cmd/diag.c [moved from common/cmd_diag.c with 100% similarity]
cmd/disk.c [moved from common/cmd_disk.c with 100% similarity]
cmd/display.c [moved from common/cmd_display.c with 100% similarity]
cmd/dtt.c [moved from common/cmd_dtt.c with 98% similarity]
cmd/echo.c [moved from common/cmd_echo.c with 100% similarity]
cmd/eeprom.c [moved from common/cmd_eeprom.c with 100% similarity]
cmd/efi.c [moved from common/cmd_efi.c with 100% similarity]
cmd/elf.c [moved from common/cmd_elf.c with 100% similarity]
cmd/ethsw.c [moved from common/cmd_ethsw.c with 100% similarity]
cmd/exit.c [moved from common/cmd_exit.c with 100% similarity]
cmd/ext2.c [moved from common/cmd_ext2.c with 100% similarity]
cmd/ext4.c [moved from common/cmd_ext4.c with 100% similarity]
cmd/fastboot.c [moved from common/cmd_fastboot.c with 100% similarity]
cmd/fat.c [moved from common/cmd_fat.c with 100% similarity]
cmd/fdc.c [moved from common/cmd_fdc.c with 100% similarity]
cmd/fdt.c [moved from common/cmd_fdt.c with 100% similarity]
cmd/fitupd.c [moved from common/cmd_fitupd.c with 100% similarity]
cmd/flash.c [moved from common/cmd_flash.c with 100% similarity]
cmd/fpga.c [moved from common/cmd_fpga.c with 98% similarity]
cmd/fpgad.c [moved from common/cmd_fpgad.c with 100% similarity]
cmd/fs.c [moved from common/cmd_fs.c with 100% similarity]
cmd/fs_uuid.c [moved from common/cmd_fs_uuid.c with 100% similarity]
cmd/fuse.c [moved from common/cmd_fuse.c with 100% similarity]
cmd/gettime.c [moved from common/cmd_gettime.c with 100% similarity]
cmd/gpio.c [moved from common/cmd_gpio.c with 100% similarity]
cmd/gpt.c [moved from common/cmd_gpt.c with 100% similarity]
cmd/hash.c [moved from common/cmd_hash.c with 100% similarity]
cmd/help.c [moved from common/cmd_help.c with 100% similarity]
cmd/host.c [moved from common/cmd_host.c with 100% similarity]
cmd/i2c.c [moved from common/cmd_i2c.c with 100% similarity]
cmd/ide.c [moved from common/cmd_ide.c with 100% similarity]
cmd/immap.c [moved from common/cmd_immap.c with 100% similarity]
cmd/ini.c [moved from common/cmd_ini.c with 100% similarity]
cmd/io.c [moved from common/cmd_io.c with 100% similarity]
cmd/iotrace.c [moved from common/cmd_iotrace.c with 100% similarity]
cmd/irq.c [moved from common/cmd_irq.c with 100% similarity]
cmd/itest.c [moved from common/cmd_itest.c with 100% similarity]
cmd/jffs2.c [moved from common/cmd_jffs2.c with 100% similarity]
cmd/ldrinfo.c [moved from common/cmd_ldrinfo.c with 100% similarity]
cmd/led.c [moved from common/cmd_led.c with 100% similarity]
cmd/license.c [moved from common/cmd_license.c with 100% similarity]
cmd/load.c [moved from common/cmd_load.c with 100% similarity]
cmd/log.c [moved from common/cmd_log.c with 100% similarity]
cmd/lzmadec.c [moved from common/cmd_lzmadec.c with 100% similarity]
cmd/mac.c [moved from common/cmd_mac.c with 100% similarity]
cmd/md5sum.c [moved from common/cmd_md5sum.c with 100% similarity]
cmd/mdio.c [moved from common/cmd_mdio.c with 100% similarity]
cmd/mem.c [moved from common/cmd_mem.c with 100% similarity]
cmd/mfsl.c [moved from common/cmd_mfsl.c with 100% similarity]
cmd/mii.c [moved from common/cmd_mii.c with 100% similarity]
cmd/misc.c [moved from common/cmd_misc.c with 100% similarity]
cmd/mmc.c [moved from common/cmd_mmc.c with 100% similarity]
cmd/mmc_spi.c [moved from common/cmd_mmc_spi.c with 100% similarity]
cmd/mp.c [moved from common/cmd_mp.c with 100% similarity]
cmd/mtdparts.c [moved from common/cmd_mtdparts.c with 100% similarity]
cmd/nand.c [moved from common/cmd_nand.c with 100% similarity]
cmd/net.c [moved from common/cmd_net.c with 100% similarity]
cmd/nvedit.c [moved from common/cmd_nvedit.c with 100% similarity]
cmd/onenand.c [moved from common/cmd_onenand.c with 100% similarity]
cmd/otp.c [moved from common/cmd_otp.c with 100% similarity]
cmd/part.c [moved from common/cmd_part.c with 100% similarity]
cmd/pci.c [moved from common/cmd_pci.c with 100% similarity]
cmd/pcmcia.c [moved from common/cmd_pcmcia.c with 100% similarity]
cmd/pmic.c [moved from common/cmd_pmic.c with 100% similarity]
cmd/portio.c [moved from common/cmd_portio.c with 100% similarity]
cmd/pxe.c [moved from common/cmd_pxe.c with 100% similarity]
cmd/read.c [moved from common/cmd_read.c with 100% similarity]
cmd/reginfo.c [moved from common/cmd_reginfo.c with 100% similarity]
cmd/regulator.c [moved from common/cmd_regulator.c with 100% similarity]
cmd/reiser.c [moved from common/cmd_reiser.c with 100% similarity]
cmd/remoteproc.c [moved from common/cmd_remoteproc.c with 100% similarity]
cmd/sata.c [moved from common/cmd_sata.c with 100% similarity]
cmd/scsi.c [moved from common/cmd_scsi.c with 100% similarity]
cmd/setexpr.c [moved from common/cmd_setexpr.c with 100% similarity]
cmd/sf.c [moved from common/cmd_sf.c with 100% similarity]
cmd/sha1sum.c [moved from common/cmd_sha1sum.c with 100% similarity]
cmd/softswitch.c [moved from common/cmd_softswitch.c with 100% similarity]
cmd/sound.c [moved from common/cmd_sound.c with 100% similarity]
cmd/source.c [moved from common/cmd_source.c with 100% similarity]
cmd/spi.c [moved from common/cmd_spi.c with 100% similarity]
cmd/spibootldr.c [moved from common/cmd_spibootldr.c with 100% similarity]
cmd/spl.c [moved from common/cmd_spl.c with 100% similarity]
cmd/strings.c [moved from common/cmd_strings.c with 100% similarity]
cmd/terminal.c [moved from common/cmd_terminal.c with 100% similarity]
cmd/test.c [moved from common/cmd_test.c with 100% similarity]
cmd/thordown.c [moved from common/cmd_thordown.c with 100% similarity]
cmd/time.c [moved from common/cmd_time.c with 100% similarity]
cmd/tpm.c [moved from common/cmd_tpm.c with 100% similarity]
cmd/tpm_test.c [moved from common/cmd_tpm_test.c with 100% similarity]
cmd/trace.c [moved from common/cmd_trace.c with 100% similarity]
cmd/tsi148.c [moved from common/cmd_tsi148.c with 100% similarity]
cmd/ubi.c [moved from common/cmd_ubi.c with 100% similarity]
cmd/ubifs.c [moved from common/cmd_ubifs.c with 100% similarity]
cmd/universe.c [moved from common/cmd_universe.c with 100% similarity]
cmd/unzip.c [moved from common/cmd_unzip.c with 100% similarity]
cmd/usb.c [moved from common/cmd_usb.c with 100% similarity]
cmd/usb_mass_storage.c [moved from common/cmd_usb_mass_storage.c with 100% similarity]
cmd/version.c [moved from common/cmd_version.c with 100% similarity]
cmd/ximg.c [moved from common/cmd_ximg.c with 100% similarity]
cmd/yaffs2.c [moved from common/cmd_yaffs2.c with 100% similarity]
cmd/zfs.c [moved from common/cmd_zfs.c with 100% similarity]
cmd/zip.c [moved from common/cmd_zip.c with 100% similarity]
common/Kconfig
common/Makefile
common/bootm.c
common/console.c
common/env_mmc.c
common/lcd.c
common/usb_kbd.c
configs/Bananapro_defconfig
configs/Sinovoip_BPI_M3_defconfig [new file with mode: 0644]
configs/chromebook_jerry_defconfig
configs/chromebook_link_defconfig
configs/chromebox_panther_defconfig
configs/firefly-rk3288_defconfig
configs/fx12mm_defconfig [deleted file]
configs/fx12mm_flash_defconfig [deleted file]
configs/h8_homlet_v2_defconfig
configs/microblaze-generic_defconfig
configs/ml507_defconfig [deleted file]
configs/ml507_flash_defconfig [deleted file]
configs/nyan-big_defconfig
configs/rock2_defconfig
configs/theadorable_debug_defconfig [new file with mode: 0644]
configs/theadorable_defconfig [new file with mode: 0644]
configs/v5fx30teval_defconfig [deleted file]
configs/v5fx30teval_flash_defconfig [deleted file]
configs/xilinx-ppc405-generic_defconfig
configs/xilinx-ppc405-generic_flash_defconfig [deleted file]
configs/xilinx-ppc440-generic_defconfig
configs/xilinx-ppc440-generic_flash_defconfig [deleted file]
configs/zynq_microzed_defconfig
configs/zynq_picozed_defconfig
configs/zynq_zc702_defconfig
configs/zynq_zc706_defconfig
configs/zynq_zc770_xm010_defconfig
configs/zynq_zc770_xm011_defconfig
configs/zynq_zc770_xm012_defconfig
configs/zynq_zc770_xm013_defconfig
configs/zynq_zed_defconfig
configs/zynq_zybo_defconfig
doc/device-tree-bindings/serial/8250.txt [new file with mode: 0644]
doc/device-tree-bindings/serial/ns16550.txt [deleted file]
doc/device-tree-bindings/serial/omap_serial.txt [new file with mode: 0644]
doc/device-tree-bindings/serial/snps-dw-apb-uart.txt [new file with mode: 0644]
doc/device-tree-bindings/serial/xilinx_uartlite.txt [new file with mode: 0644]
doc/driver-model/serial-howto.txt
drivers/Makefile
drivers/bios_emulator/atibios.c
drivers/bios_emulator/bios.c
drivers/block/Kconfig
drivers/block/Makefile
drivers/block/disk-uclass.c [new file with mode: 0644]
drivers/core/lists.c
drivers/core/syscon-uclass.c
drivers/dma/apbh_dma.c
drivers/fpga/xilinx.c
drivers/gpio/gpio-uclass.c
drivers/hwmon/adt7460.c
drivers/i2c/Kconfig
drivers/i2c/Makefile
drivers/i2c/intel_i2c.c [new file with mode: 0644]
drivers/i2c/mvtwsi.c
drivers/mmc/sdhci.c
drivers/mmc/zynq_sdhci.c
drivers/mtd/nand/mxs_nand.c
drivers/mtd/ubi/build.c
drivers/net/Kconfig
drivers/net/eepro100.c
drivers/net/fsl-mc/mc.c
drivers/net/phy/ti.c
drivers/net/xilinx_axi_emac.c
drivers/net/xilinx_emaclite.c
drivers/net/xilinx_ll_temac.c
drivers/net/zynq_gem.c
drivers/pch/Makefile [new file with mode: 0644]
drivers/pch/pch-uclass.c [moved from arch/x86/lib/pch-uclass.c with 50% similarity]
drivers/pch/pch7.c [new file with mode: 0644]
drivers/pch/pch9.c [new file with mode: 0644]
drivers/pci/pci-uclass.c
drivers/pci/pci_auto.c
drivers/pci/pci_compat.c
drivers/pci/pci_internal.h
drivers/pci/pci_rom.c
drivers/pinctrl/uniphier/pinctrl-uniphier.h
drivers/power/Kconfig
drivers/power/axp152.c
drivers/power/axp209.c
drivers/power/axp221.c
drivers/power/axp818.c
drivers/serial/Kconfig
drivers/serial/ns16550.c
drivers/serial/serial_ns16550.c
drivers/serial/serial_xuartlite.c
drivers/serial/serial_zynq.c
drivers/spi/ich.c
drivers/usb/dwc3/gadget.c
drivers/usb/dwc3/linux-compat.h
drivers/usb/eth/Makefile
drivers/usb/eth/r8152.c [new file with mode: 0644]
drivers/usb/eth/r8152.h [new file with mode: 0644]
drivers/usb/eth/r8152_fw.c [new file with mode: 0644]
drivers/usb/eth/usb_ether.c
drivers/usb/host/dwc2.c
drivers/usb/host/dwc2.h
drivers/usb/host/ehci-generic.c
drivers/usb/host/ehci-mx6.c
drivers/usb/host/ehci-pci.c
drivers/usb/host/ohci-lpc32xx.c
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/mvebu_lcd.c [new file with mode: 0644]
dts/Makefile
fs/ubifs/replay.c
fs/ubifs/super.c
include/axp221.h
include/axp818.h
include/axp_pmic.h
include/bios_emul.h
include/common.h
include/configs/T4240RDB.h
include/configs/chromebook_jerry.h
include/configs/firefly-rk3288.h
include/configs/fx12mm.h [deleted file]
include/configs/imx6_spl.h
include/configs/microblaze-generic.h
include/configs/ml507.h [deleted file]
include/configs/mx6_common.h
include/configs/mx6ul_14x14_evk.h
include/configs/mx7_common.h
include/configs/mx7dsabresd.h
include/configs/nyan-big.h
include/configs/omap3_igep00x0.h
include/configs/omap3_logic.h
include/configs/qemu-x86.h
include/configs/rock2.h
include/configs/rpi-common.h
include/configs/theadorable.h [new file with mode: 0644]
include/configs/v5fx30teval.h [deleted file]
include/configs/xilinx-ppc.h
include/configs/xilinx-ppc405-generic.h
include/configs/xilinx-ppc405.h [deleted file]
include/configs/xilinx-ppc440-generic.h
include/configs/xilinx-ppc440.h [deleted file]
include/configs/xilinx_zynqmp.h
include/configs/xilinx_zynqmp_ep.h
include/configs/zynq-common.h
include/dm/uclass-id.h
include/fdtdec.h
include/fpga.h
include/lcd.h
include/linux/bug.h [new file with mode: 0644]
include/netdev.h
include/part.h
include/pch.h [new file with mode: 0644]
include/pci.h
include/syscon.h
include/usb_ether.h
include/wait_bit.h [new file with mode: 0644]
lib/fdtdec.c
scripts/Kbuild.include
scripts/Makefile.spl
test/dm/syscon.c

index 35167e12015b202a910be77ed075af4dd8425b12..d1d32fac9db5314562db5ecd60ae907a5386ba79 100644 (file)
@@ -21,3 +21,7 @@
 
 # Ignore networking block comment style
 --ignore NETWORKING_BLOCK_COMMENT_STYLE
+
+# Ignore "WARNING: Prefer ether_addr_copy() over memcpy() if the Ethernet
+# addresses are __aligned(2)".
+--ignore PREFER_ETHER_ADDR_COPY
index 02dccfc1aee7ff5fd29007bf9daad769da5ea5e4..f72fef1748252774d5bbb640468b025539b9a26e 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -21,6 +21,9 @@ Jagan Teki <jagannadha.sutradharudu-teki@xilinx.com>
 Markus Klotzbuecher <mk@denx.de>
 Prabhakar Kushwaha <prabhakar@freescale.com>
 Rajeshwari Shinde <rajeshwari.s@samsung.com>
+Ricardo Ribalda Delgado <ricardo.ribalda@uam.es>
+Ricardo Ribalda <ricardo.ribalda@uam.es>
+Ricardo Ribalda <ricardo.ribalda@gmail.com>
 Sandeep Paulraj <s-paulraj@ti.com>
 Shaohui Xie <Shaohui.Xie@freescale.com>
 Stefan Roese <stroese>
diff --git a/Kconfig b/Kconfig
index ee4e060c286fab19bb1d82f5cf56cde0b1116050..3ce5ba1b522effe11d4dfdacf877cba0472ac006 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -225,6 +225,8 @@ endmenu             # Boot images
 
 source "common/Kconfig"
 
+source "cmd/Kconfig"
+
 source "dts/Kconfig"
 
 source "net/Kconfig"
index c9c2cbedc641853c7886ffb023e5798362152899..06996d49a2fdffced542782658a8e6c01ec86899 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -661,6 +661,7 @@ libs-y += drivers/usb/musb/
 libs-y += drivers/usb/musb-new/
 libs-y += drivers/usb/phy/
 libs-y += drivers/usb/ulpi/
+libs-y += cmd/
 libs-y += common/
 libs-$(CONFIG_API) += api/
 libs-$(CONFIG_HAS_POST) += post/
diff --git a/README b/README
index ece479315f4cb8152fa86a5e1cd0fca6d21e4603..864c7cccc3b7a7182612680eba3316889460008b 100644 (file)
--- a/README
+++ b/README
@@ -3712,12 +3712,6 @@ Modem Support:
 - RTS/CTS Flow control enable:
                CONFIG_HWFLOW
 
-- Modem debug support:
-               CONFIG_MODEM_SUPPORT_DEBUG
-
-               Enables debugging stuff (char screen[1024], dbg())
-               for modem support. Useful only with BDI2000.
-
 - Interrupt support (PPC):
 
                There are common interrupt_init() and timer_interrupt()
index 876a620cf197b343ad2fdc27a9864a0bc6ee71ab..d2dbb1a5c27f2db05ed2b5727dbfdcbee80adbfa 100644 (file)
@@ -558,15 +558,15 @@ config ARCH_ZYNQ
        select CPU_V7
        select SUPPORT_SPL
        select OF_CONTROL
-       select SPL_OF_CONTROL
+       select SPL_OF_CONTROL if SPL
        select DM
        select DM_ETH
-       select SPL_DM
+       select SPL_DM if SPL
        select DM_MMC
        select DM_SPI
        select DM_SERIAL
        select DM_SPI_FLASH
-       select SPL_SEPARATE_BSS
+       select SPL_SEPARATE_BSS if SPL
 
 config ARCH_ZYNQMP
        bool "Support Xilinx ZynqMP Platform"
index 0550225581f40f858cca4e88e7a6ad7cdcbc842e..a3e14a862b15af8267283d3ffa817172042db296 100644 (file)
@@ -40,7 +40,8 @@ ifeq ($(CONFIG_SYS_THUMB_BUILD),y)
 archprepare: checkthumb
 
 checkthumb:
-       @if test "$(call cc-version)" -lt "0404"; then \
+       @if test "$(call cc-name)" = "gcc" -a \
+                       "$(call cc-version)" -lt "0404"; then \
                echo -n '*** Your GCC does not produce working '; \
                echo 'binaries in THUMB mode.'; \
                echo '*** Your board is configured for THUMB mode.'; \
index 64514b16341088a93b6d71f636b55d96ec7d4ffc..27a3f2f4e68fc9af0b9838d91b0579a847bd5643 100644 (file)
@@ -18,6 +18,8 @@ enum pll_clocks {
        PLL_BUS,        /* System Bus PLL*/
        PLL_USBOTG,     /* OTG USB PLL */
        PLL_ENET,       /* ENET PLL */
+       PLL_AUDIO,      /* AUDIO PLL */
+       PLL_VIDEO,      /* AUDIO PLL */
 };
 
 struct mxc_ccm_reg *imx_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
@@ -204,7 +206,7 @@ int enable_spi_clk(unsigned char enable, unsigned spi_num)
 }
 static u32 decode_pll(enum pll_clocks pll, u32 infreq)
 {
-       u32 div;
+       u32 div, test_div, pll_num, pll_denom;
 
        switch (pll) {
        case PLL_SYS:
@@ -227,6 +229,44 @@ static u32 decode_pll(enum pll_clocks pll, u32 infreq)
                div &= BM_ANADIG_PLL_ENET_DIV_SELECT;
 
                return 25000000 * (div + (div >> 1) + 1);
+       case PLL_AUDIO:
+               div = __raw_readl(&imx_ccm->analog_pll_audio);
+               if (!(div & BM_ANADIG_PLL_AUDIO_ENABLE))
+                       return 0;
+               /* BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC is ignored */
+               if (div & BM_ANADIG_PLL_AUDIO_BYPASS)
+                       return MXC_HCLK;
+               pll_num = __raw_readl(&imx_ccm->analog_pll_audio_num);
+               pll_denom = __raw_readl(&imx_ccm->analog_pll_audio_denom);
+               test_div = (div & BM_ANADIG_PLL_AUDIO_TEST_DIV_SELECT) >>
+                       BP_ANADIG_PLL_AUDIO_TEST_DIV_SELECT;
+               div &= BM_ANADIG_PLL_AUDIO_DIV_SELECT;
+               if (test_div == 3) {
+                       debug("Error test_div\n");
+                       return 0;
+               }
+               test_div = 1 << (2 - test_div);
+
+               return infreq * (div + pll_num / pll_denom) / test_div;
+       case PLL_VIDEO:
+               div = __raw_readl(&imx_ccm->analog_pll_video);
+               if (!(div & BM_ANADIG_PLL_VIDEO_ENABLE))
+                       return 0;
+               /* BM_ANADIG_PLL_AUDIO_BYPASS_CLK_SRC is ignored */
+               if (div & BM_ANADIG_PLL_VIDEO_BYPASS)
+                       return MXC_HCLK;
+               pll_num = __raw_readl(&imx_ccm->analog_pll_video_num);
+               pll_denom = __raw_readl(&imx_ccm->analog_pll_video_denom);
+               test_div = (div & BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT) >>
+                       BP_ANADIG_PLL_VIDEO_POST_DIV_SELECT;
+               div &= BM_ANADIG_PLL_VIDEO_DIV_SELECT;
+               if (test_div == 3) {
+                       debug("Error test_div\n");
+                       return 0;
+               }
+               test_div = 1 << (2 - test_div);
+
+               return infreq * (div + pll_num / pll_denom) / test_div;
        default:
                return 0;
        }
@@ -437,7 +477,7 @@ static u32 get_mmdc_ch0_clk(void)
        u32 cbcmr = __raw_readl(&imx_ccm->cbcmr);
        u32 cbcdr = __raw_readl(&imx_ccm->cbcdr);
 
-       u32 freq, podf, per2_clk2_podf;
+       u32 freq, podf, per2_clk2_podf, pmu_misc2_audio_div;
 
        if (is_cpu_type(MXC_CPU_MX6SX) || is_cpu_type(MXC_CPU_MX6UL) ||
            is_cpu_type(MXC_CPU_MX6SL)) {
@@ -472,8 +512,21 @@ static u32 get_mmdc_ch0_clk(void)
                                freq = mxc_get_pll_pfd(PLL_BUS, 0);
                                break;
                        case 3:
-                               /* static / 2 divider */
-                               freq =  mxc_get_pll_pfd(PLL_BUS, 2) / 2;
+                               pmu_misc2_audio_div = PMU_MISC2_AUDIO_DIV(__raw_readl(&imx_ccm->pmu_misc2));
+                               switch (pmu_misc2_audio_div) {
+                               case 0:
+                               case 2:
+                                       pmu_misc2_audio_div = 1;
+                                       break;
+                               case 1:
+                                       pmu_misc2_audio_div = 2;
+                                       break;
+                               case 3:
+                                       pmu_misc2_audio_div = 4;
+                                       break;
+                               }
+                               freq = decode_pll(PLL_AUDIO, MXC_HCLK) /
+                                       pmu_misc2_audio_div;
                                break;
                        }
                }
index c777922e9d5258f799d35586ac2e25ea3195a05f..1d8e4709713ef9a7ae7ec9e9a137f97d07314fd8 100644 (file)
@@ -130,6 +130,24 @@ static void init_csu(void)
                writel(CSU_INIT_SEC_LEVEL0, CSU_IPS_BASE_ADDR + i * 4);
 }
 
+static void imx_enet_mdio_fixup(void)
+{
+       struct iomuxc_gpr_base_regs *gpr_regs =
+               (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
+
+       /*
+        * The management data input/output (MDIO) requires open-drain,
+        * i.MX7D TO1.0 ENET MDIO pin has no open drain, but TO1.1 supports
+        * this feature. So to TO1.1, need to enable open drain by setting
+        * bits GPR0[8:7].
+        */
+
+       if (soc_rev() >= CHIP_REV_1_1) {
+               setbits_le32(&gpr_regs->gpr[0],
+                            IOMUXC_GPR_GPR0_ENET_MDIO_OPEN_DRAIN_MASK);
+       }
+}
+
 int arch_cpu_init(void)
 {
        init_aips();
@@ -138,6 +156,8 @@ int arch_cpu_init(void)
        /* Disable PDE bit of WMCR register */
        imx_set_wdog_powerdown(false);
 
+       imx_enet_mdio_fixup();
+
 #ifdef CONFIG_APBH_DMA
        /* Start APBH DMA */
        mxs_dma_init();
index dfb0a3e3c099a5bd9615f3ff0bac0d8915279805..ce8e5717e702314961be4a57caa7b0db5d21138a 100644 (file)
@@ -33,6 +33,7 @@ obj-$(CONFIG_MACH_SUN8I)      += clock_sun6i.o
 endif
 obj-$(CONFIG_MACH_SUN9I)       += clock_sun9i.o
 obj-$(CONFIG_MACH_SUN6I)       += tzpc.o
+obj-$(CONFIG_MACH_SUN8I_H3)    += tzpc.o
 
 obj-$(CONFIG_AXP152_POWER)     += pmic_bus.o
 obj-$(CONFIG_AXP209_POWER)     += pmic_bus.o
index 7dfb7f5340dba4c93ff3ba7a67c33221aef613c7..eb5f4b686ea7416f02cb9377d2e4d78413ad350e 100644 (file)
@@ -127,8 +127,8 @@ void s_init(void)
                "orr r0, r0, #1 << 6\n"
                "mcr p15, 0, r0, c1, c0, 1\n");
 #endif
-#if defined CONFIG_MACH_SUN6I
-       /* Enable non-secure access to the RTC */
+#if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I_H3
+       /* Enable non-secure access to some peripherals */
        tzpc_init();
 #endif
 
index 47fb70ff7cf845b56b93029ce2a9fc235987cfac..5cc5d25d2bd3ee4dc3e8a12cfa17be6fd4a343fe 100644 (file)
 #include <asm/arch/gpio.h>
 #include <asm/arch/sys_proto.h>
 
+__weak void clock_init_sec(void)
+{
+}
+
 int clock_init(void)
 {
 #ifdef CONFIG_SPL_BUILD
        clock_init_safe();
 #endif
        clock_init_uart();
+       clock_init_sec();
 
        return 0;
 }
index 1da5455c9ad3bf4666c8892af02afaffab9dea74..700b605ab3a93936a8c638bab273aa22c9095fe2 100644 (file)
@@ -45,6 +45,19 @@ void clock_init_safe(void)
 }
 #endif
 
+void clock_init_sec(void)
+{
+#ifdef CONFIG_MACH_SUN8I_H3
+       struct sunxi_ccm_reg * const ccm =
+               (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
+
+       setbits_le32(&ccm->ccu_sec_switch,
+                    CCM_SEC_SWITCH_MBUS_NONSEC |
+                    CCM_SEC_SWITCH_BUS_NONSEC |
+                    CCM_SEC_SWITCH_PLL_NONSEC);
+#endif
+}
+
 void clock_init_uart(void)
 {
 #if CONFIG_CONS_INDEX < 5
index d757e403dc072ad4a70c48bc1ea5c27c0ac78109..7c46acdbf2ecf844a4a1036ba0aae0cd0e33fa56 100644 (file)
@@ -25,6 +25,7 @@ struct dram_para {
        u8 rank;
        u8 rows;
        u8 bus_width;
+       u8 dram_type;
        u16 page_size;
 };
 
@@ -34,7 +35,7 @@ static void mctl_set_cr(struct dram_para *para)
                        (struct sunxi_mctl_com_reg *)SUNXI_DRAM_COM_BASE;
 
        writel(MCTL_CR_CS1_CONTROL(para->cs1) | MCTL_CR_UNKNOWN |
-               MCTL_CR_CHANNEL(1) | MCTL_CR_DDR3 |
+               MCTL_CR_CHANNEL(1) | MCTL_CR_DRAM_TYPE(para->dram_type) |
                (para->seq ? MCTL_CR_SEQUENCE : 0) |
                ((para->bus_width == 16) ? MCTL_CR_BUSW16 : MCTL_CR_BUSW8) |
                MCTL_CR_PAGE_SIZE(para->page_size) | MCTL_CR_ROW(para->rows) |
@@ -86,6 +87,7 @@ static void auto_set_timing_para(struct dram_para *para)
 {
        struct sunxi_mctl_ctl_reg * const mctl_ctl =
                (struct sunxi_mctl_ctl_reg *)SUNXI_DRAM_CTL0_BASE;
+
        u32 reg_val;
 
        u8 tccd         = 2;
@@ -129,10 +131,42 @@ static void auto_set_timing_para(struct dram_para *para)
        /* Set work mode register */
        mctl_set_cr(para);
        /* Set mode register */
-       writel(MCTL_MR0, &mctl_ctl->mr0);
-       writel(MCTL_MR1, &mctl_ctl->mr1);
-       writel(MCTL_MR2, &mctl_ctl->mr2);
-       writel(MCTL_MR3, &mctl_ctl->mr3);
+       if (para->dram_type == DRAM_TYPE_DDR3) {
+               writel(MCTL_MR0, &mctl_ctl->mr0);
+               writel(MCTL_MR1, &mctl_ctl->mr1);
+               writel(MCTL_MR2, &mctl_ctl->mr2);
+               writel(MCTL_MR3, &mctl_ctl->mr3);
+       } else if (para->dram_type == DRAM_TYPE_LPDDR3) {
+               writel(MCTL_LPDDR3_MR0, &mctl_ctl->mr0);
+               writel(MCTL_LPDDR3_MR1, &mctl_ctl->mr1);
+               writel(MCTL_LPDDR3_MR2, &mctl_ctl->mr2);
+               writel(MCTL_LPDDR3_MR3, &mctl_ctl->mr3);
+
+               /* timing parameters for LPDDR3 */
+               tfaw = max(ns_to_t(50), 4);
+               trrd = max(ns_to_t(10), 2);
+               trcd = max(ns_to_t(24), 2);
+               trc = ns_to_t(70);
+               txp = max(ns_to_t(8), 2);
+               twtr = max(ns_to_t(8), 2);
+               trtp = max(ns_to_t(8), 2);
+               trp = max(ns_to_t(27), 2);
+               tras = ns_to_t(42);
+               trefi = ns_to_t(3900) / 32;
+               trfc = ns_to_t(210);
+               tmrw            = 5;
+               tmrd            = 5;
+               tckesr          = 5;
+               tcwl            = 3;    /* CWL 8 */
+               t_rdata_en      = 5;
+               tdinit0 = (200 * CONFIG_DRAM_CLK) + 1;          /* 200us */
+               tdinit1 = (100 * CONFIG_DRAM_CLK) / 1000 + 1;   /* 100ns */
+               tdinit2 = (11 * CONFIG_DRAM_CLK) + 1;   /* 200us */
+               tdinit3 = (1 * CONFIG_DRAM_CLK) + 1;    /* 1us */
+               twtp    = tcwl + 4 + twr + 1;   /* CWL + BL/2 + tWR */
+               twr2rd  = tcwl + 4 + 1 + twtr;  /* WL + BL / 2 + tWTR */
+               trd2wr  = tcl + 4 + 5 - tcwl + 1; /* RL + BL / 2 + 2 - WL */
+       }
        /* Set dram timing */
        reg_val = (twtp << 24) | (tfaw << 16) | (trasmax << 8) | (tras << 0);
        writel(reg_val, &mctl_ctl->dramtmg0);
@@ -287,6 +321,9 @@ static int mctl_channel_init(struct dram_para *para)
        clrbits_le32(&mctl_ctl->pgcr2, (0x3 << 6));
        clrbits_le32(&mctl_ctl->dqsgmr, (0x1 << 8) | (0x7));
 
+       if (para->dram_type == DRAM_TYPE_LPDDR3)
+               clrsetbits_le32(&mctl_ctl->dxccr, (0x1 << 27) | (0x3<<6) ,
+                               0x1 << 31);
        if (readl(&mctl_com->cr) & 0x1)
                writel(0x00000303, &mctl_ctl->odtmap);
        else
@@ -297,7 +334,11 @@ static int mctl_channel_init(struct dram_para *para)
        clrsetbits_le32(ZQnPR(0), 0x000000ff, CONFIG_DRAM_ZQ & 0xff);
        clrsetbits_le32(ZQnPR(1), 0x000000ff, (CONFIG_DRAM_ZQ >> 8) & 0xff);
        /* CA calibration */
-       mctl_set_pir(0x0201f3 | 0x1<<10);
+
+       if (para->dram_type == DRAM_TYPE_DDR3)
+               mctl_set_pir(0x0201f3 | 0x1<<10);
+       else
+               mctl_set_pir(0x020173 | 0x1<<10);
 
        /* DQS gate training */
        if (mctl_train_dram(para) != 0) {
@@ -357,6 +398,7 @@ static void mctl_sys_init(struct dram_para *para)
        clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MCTL);
        clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_RESET_OFFSET_MCTL);
        clrbits_le32(&ccm->pll5_cfg, CCM_PLL5_CTRL_EN);
+       udelay(1000);
        clrbits_le32(&ccm->dram_clk_cfg, 0x01<<31);
 
        clock_set_pll5(CONFIG_DRAM_CLK * 1000000 * DRAM_CLK_MUL);
@@ -366,16 +408,15 @@ static void mctl_sys_init(struct dram_para *para)
                        CCM_DRAMCLK_CFG_RST | CCM_DRAMCLK_CFG_UPD);
        mctl_await_completion(&ccm->dram_clk_cfg, CCM_DRAMCLK_CFG_UPD, 0);
 
-       setbits_le32(&ccm->ahb_reset0_cfg, 1 << 14);
-       setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MCTL);
-       setbits_le32(&ccm->mbus_reset, CCM_MBUS_RESET_RESET);
-       setbits_le32(&ccm->mbus_clk_cfg, MBUS_CLK_GATE);
-
        setbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_RESET_OFFSET_MCTL);
        setbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_MCTL);
        setbits_le32(&ccm->mbus_reset, CCM_MBUS_RESET_RESET);
        setbits_le32(&ccm->mbus_clk_cfg, MBUS_CLK_GATE);
 
+       para->rank = 2;
+       para->bus_width = 16;
+       mctl_set_cr(para);
+
        /* Set dram master access priority */
        writel(0x0000e00f, &mctl_ctl->clken);   /* normal */
 
@@ -398,6 +439,13 @@ unsigned long sunxi_dram_init(void)
                .page_size = 2048,
        };
 
+#if defined(CONFIG_MACH_SUN8I_A83T)
+#if (CONFIG_DRAM_TYPE == 3) || (CONFIG_DRAM_TYPE == 7)
+       para.dram_type = CONFIG_DRAM_TYPE;
+#else
+#error Unsupported DRAM type, Please set DRAM type (3:DDR3, 7:LPDDR3)
+#endif
+#endif
        setbits_le32(SUNXI_PRCM_BASE + 0x1e0, 0x1 << 8);
 
        writel(0, (SUNXI_PRCM_BASE + 0x1e8));
index 4ff46e4fc0b9c1a9020d605ac6f7dbcd407b6439..90b5bfd35947ed599fad2b6f9e0c4bfb49de8073 100644 (file)
@@ -106,7 +106,7 @@ psci_fiq_enter:
        str     r10, [r8, #0x100]
        timer_wait r10, ONE_MS
 
-#ifdef CONFIG_MACH_SUN6I
+#if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN8I_H3)
        @ Activate power clamp
        lsl     r12, r9, #2             @ x4
        add     r12, r12, r8
@@ -170,7 +170,7 @@ psci_cpu_on:
        movw    r0, #(SUNXI_PRCM_BASE & 0xffff)
        movt    r0, #(SUNXI_PRCM_BASE >> 16)
 
-#ifdef CONFIG_MACH_SUN6I
+#if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN8I_H3)
        @ Release power clamp
        lsl     r5, r1, #2      @ 1 register per CPU
        add     r5, r5, r0      @ PRCM
index 5c9c69b20bf89cee6c953525a1a0d0c798885e40..6c8a0fd9a25bab942a67a4118be9500726d75a32 100644 (file)
@@ -13,6 +13,15 @@ void tzpc_init(void)
 {
        struct sunxi_tzpc *tzpc = (struct sunxi_tzpc *)SUNXI_TZPC_BASE;
 
+#ifdef CONFIG_MACH_SUN6I
        /* Enable non-secure access to the RTC */
-       writel(SUNXI_TZPC_DECPORT0_RTC, &tzpc->decport0_set);
+       writel(SUN6I_TZPC_DECPORT0_RTC, &tzpc->decport0_set);
+#endif
+
+#ifdef CONFIG_MACH_SUN8I_H3
+       /* Enable non-secure access to all peripherals */
+       writel(SUN8I_H3_TZPC_DECPORT0_ALL, &tzpc->decport0_set);
+       writel(SUN8I_H3_TZPC_DECPORT1_ALL, &tzpc->decport1_set);
+       writel(SUN8I_H3_TZPC_DECPORT2_ALL, &tzpc->decport2_set);
+#endif
 }
index e5a4fdd0fda0924f74075b4f4d5dc199601ac457..9a19dfa77f797490af946863d29970404ce509a8 100644 (file)
@@ -20,10 +20,6 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "xilinx_zynqmp_ep" if TARGET_ZYNQMP_EP
 
-config SECURE_IOU
-       bool "Configure ZynqMP secure IOU"
-       default n
-
 config ZYNQMP_USB
        bool "Configure ZynqMP USB"
 
index 9218586e94a3bf0a26c92af13900856a32144f00..690c72dd66836190a5c709900d1d694d8d5fd02d 100644 (file)
@@ -21,9 +21,27 @@ unsigned long get_uart_clk(int dev_id)
                return 48000;
        case ZYNQMP_CSU_VERSION_EP108:
                return 25000000;
+       case ZYNQMP_CSU_VERSION_QEMU:
+               return 133000000;
        }
 
-       return 133000000;
+       return 100000000;
+}
+
+unsigned long zynqmp_get_system_timer_freq(void)
+{
+       u32 ver = zynqmp_get_silicon_version();
+
+       switch (ver) {
+       case ZYNQMP_CSU_VERSION_VELOCE:
+               return 10000;
+       case ZYNQMP_CSU_VERSION_EP108:
+               return 4000000;
+       case ZYNQMP_CSU_VERSION_QEMU:
+               return 50000000;
+       }
+
+       return 100000000;
 }
 
 #ifdef CONFIG_CLOCKS
index f90cca36aa72ab0f30d30af16a87bbc6f37bb8d4..c71f29152deed40d1d55683c57ad8db36a940ed7 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static unsigned int zynqmp_get_silicon_version_secure(void)
+{
+       u32 ver;
+
+       ver = readl(&csu_base->version);
+       ver &= ZYNQMP_SILICON_VER_MASK;
+       ver >>= ZYNQMP_SILICON_VER_SHIFT;
+
+       return ver;
+}
+
 unsigned int zynqmp_get_silicon_version(void)
 {
+       if (current_el() == 3)
+               return zynqmp_get_silicon_version_secure();
+
        gd->cpu_clk = get_tbclk();
 
        switch (gd->cpu_clk) {
@@ -24,9 +38,11 @@ unsigned int zynqmp_get_silicon_version(void)
                return ZYNQMP_CSU_VERSION_VELOCE;
        case 50000000:
                return ZYNQMP_CSU_VERSION_QEMU;
+       case 4000000:
+               return ZYNQMP_CSU_VERSION_EP108;
        }
 
-       return ZYNQMP_CSU_VERSION_EP108;
+       return ZYNQMP_CSU_VERSION_SILICON;
 }
 
 #ifndef CONFIG_SYS_DCACHE_OFF
index 4a01bf661415d941ce92b1be1d0c5b53778bdc8a..77efb292da0464cc4c434845e3bc61efbbb500c3 100644 (file)
@@ -53,7 +53,8 @@ dtb-$(CONFIG_ARCH_MVEBU) +=                   \
        armada-388-gp.dtb                       \
        armada-xp-gp.dtb                        \
        armada-xp-maxbcm.dtb                    \
-       armada-xp-synology-ds414.dtb
+       armada-xp-synology-ds414.dtb            \
+       armada-xp-theadorable.dtb
 
 dtb-$(CONFIG_ARCH_UNIPHIER) += \
        uniphier-ph1-ld4-ref.dtb \
@@ -184,7 +185,8 @@ dtb-$(CONFIG_MACH_SUN8I_A33) += \
        sun8i-a33-q8-tablet.dtb \
        sun8i-a33-sinlinx-sina33.dtb
 dtb-$(CONFIG_MACH_SUN8I_A83T) += \
-       sun8i-a83t-allwinner-h8homlet-v2.dtb
+       sun8i-a83t-allwinner-h8homlet-v2.dtb \
+       sun8i-a83t-sinovoip-bpi-m3.dtb
 dtb-$(CONFIG_MACH_SUN8I_H3) += \
        sun8i-h3-orangepi-pc.dtb \
        sun8i-h3-orangepi-plus.dtb
diff --git a/arch/arm/dts/armada-xp-theadorable.dts b/arch/arm/dts/armada-xp-theadorable.dts
new file mode 100644 (file)
index 0000000..cf1be2a
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Device Tree file for Marvell Armada XP theadorable board
+ *
+ * Copyright (C) 2013-2014 Marvell
+ *
+ * Lior Amsalem <alior@marvell.com>
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file 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 file 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.
+ *
+ * Or, alternatively
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Note: this Device Tree assumes that the bootloader has remapped the
+ * internal registers to 0xf1000000 (instead of the default
+ * 0xd0000000). The 0xf1000000 is the default used by the recent,
+ * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier
+ * boards were delivered with an older version of the bootloader that
+ * left internal registers mapped at 0xd0000000. If you are in this
+ * situation, you should either update your bootloader (preferred
+ * solution) or the below Device Tree should be adjusted.
+ */
+
+/dts-v1/;
+#include <dt-bindings/gpio/gpio.h>
+#include "armada-xp-mv78260.dtsi"
+
+/ {
+       model = "Marvell Armada XP theadorable";
+       compatible = "marvell,armadaxp-mv78260", "marvell,armadaxp", "marvell,armada-370-xp";
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       aliases {
+               spi0 = &spi0;
+               ethernet0 = &eth0;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x00000000 0x00000000 0x80000000>;
+       };
+
+       soc {
+               ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
+                         MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
+                         MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
+
+               internal-regs {
+                       serial@12000 {
+                               status = "okay";
+                               u-boot,dm-pre-reloc;
+                       };
+
+                       serial@12100 {
+                               status = "okay";
+                       };
+
+                       serial@12200 {
+                               status = "okay";
+                       };
+
+                       serial@12300 {
+                               status = "okay";
+                       };
+
+                       sata@a0000 {
+                               nr-ports = <2>;
+                               status = "okay";
+                       };
+
+                       mdio {
+                               phy0: ethernet-phy@0 {
+                                       reg = <0>;
+                               };
+                       };
+
+                       ethernet@70000 {
+                               status = "okay";
+                               phy = <&phy0>;
+                               phy-mode = "sgmii";
+                       };
+
+                       usb@50000 {
+                               status = "okay";
+                       };
+
+                       usb@51000 {
+                               status = "okay";
+                       };
+
+                       spi0: spi@10600 {
+                               status = "okay";
+                               u-boot,dm-pre-reloc;
+
+                               spi-flash@0 {
+                                       u-boot,dm-pre-reloc;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       compatible = "n25q128a13", "jedec,spi-nor";
+                                       reg = <0>; /* Chip select 0 */
+                                       spi-max-frequency = <27777777>;
+                               };
+                       };
+               };
+       };
+};
diff --git a/arch/arm/dts/sun8i-a83t-sinovoip-bpi-m3.dts b/arch/arm/dts/sun8i-a83t-sinovoip-bpi-m3.dts
new file mode 100644 (file)
index 0000000..91ff3a9
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2015 Vishnu Patekar
+ * Vishnu Patekar <vishnupatekar0510@gmail.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file 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 file 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.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "sun8i-a83t.dtsi"
+
+/ {
+       model = "Allwinner A83T BananaPi M3 Board v1.2";
+       compatible = "bananapi,m3v1.2", "allwinner,sun8i-a83t";
+
+       aliases {
+               serial0 = &uart0;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins_b>;
+       status = "okay";
+};
index 83be51ae9df65ee8c35d406d58d6dffaf25240b3..2d786f0fd15d0845a9ebd1dbff35208bc53a60dd 100644 (file)
                        interrupt-parent = <&intc>;
                        interrupts = <0 24 4>;
                        reg = <0xe0100000 0x1000>;
-               } ;
+               };
 
                sdhci1: sdhci@e0101000 {
                        compatible = "arasan,sdhci-8.9a";
                        interrupt-parent = <&intc>;
                        interrupts = <0 47 4>;
                        reg = <0xe0101000 0x1000>;
-               } ;
+               };
 
                slcr: slcr@f8000000 {
                        #address-cells = <1>;
 
                scutimer: timer@f8f00600 {
                        interrupt-parent = <&intc>;
-                       interrupts = < 1 13 0x301 >;
+                       interrupts = <1 13 0x301>;
                        compatible = "arm,cortex-a9-twd-timer";
-                       reg = < 0xf8f00600 0x20 >;
+                       reg = <0xf8f00600 0x20>;
                        clocks = <&clkc 4>;
-               } ;
+               };
 
                usb0: usb@e0002000 {
                        compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
index 07e2b7a7387de602fd383d7ab4f0325d9943cdb7..b6982c0c45dae9f3e03f527606476001a594c427 100644 (file)
@@ -21,9 +21,8 @@
        };
 
        chosen {
-               bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk";
-               linux,stdout-path = &uart1;
-               stdout-path = &uart1;
+               bootargs = "root=/dev/ram rw earlyprintk";
+               stdout-path = "serial0:115200n8";
        };
 
        memory {
index 77e3bb0e631050aeaeae2cfc07d1a312a983e6fb..4fed2215365cf2d0585cc5d3cb4b5e2e4b9a80c9 100644 (file)
@@ -18,9 +18,8 @@
        };
 
        chosen {
-               bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk";
-               linux,stdout-path = &uart1;
-               stdout-path = &uart1;
+               bootargs = "root=/dev/ram rw earlyprintk";
+               stdout-path = "serial0:115200n8";
        };
 
        memory {
        };
 };
 
-&spi0 {
-       status = "okay";
-       num-cs = <4>;
-       is-decoded-cs = <0>;
-};
-
 &can0 {
        status = "okay";
 };
        };
 };
 
+&spi0 {
+       status = "okay";
+       num-cs = <4>;
+       is-decoded-cs = <0>;
+};
+
 &uart1 {
        u-boot,dm-pre-reloc;
        status = "okay";
index 3e1769acb51f994c20a85f9353efc450563560aa..8d69f0e0f5ef4ecaaa1e459b0c8c75b5c9427160 100644 (file)
@@ -20,9 +20,8 @@
        };
 
        chosen {
-               bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk";
-               linux,stdout-path = &uart1;
-               stdout-path = &uart1;
+               bootargs = "root=/dev/ram rw earlyprintk";
+               stdout-path = "serial0:115200n8";
        };
 
        memory {
        };
 };
 
-&spi1 {
-       status = "okay";
-       num-cs = <4>;
-       is-decoded-cs = <0>;
-};
-
 &can1 {
        status = "okay";
 };
        };
 };
 
+&spi1 {
+       status = "okay";
+       num-cs = <4>;
+       is-decoded-cs = <0>;
+};
+
 &uart1 {
        u-boot,dm-pre-reloc;
        status = "okay";
index 288e248374795238464c53f15f2ca10f2ebd3d06..77fdfcc00947f1172898be96213aafa683fecee6 100644 (file)
@@ -20,9 +20,8 @@
        };
 
        chosen {
-               bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk";
-               linux,stdout-path = &uart0;
-               stdout-path = &uart0;
+               bootargs = "root=/dev/ram rw earlyprintk";
+               stdout-path = "serial0:115200n8";
        };
 
        memory {
        };
 };
 
-&spi0 {
-       status = "okay";
-       num-cs = <4>;
-       is-decoded-cs = <0>;
-       eeprom: at25@0 {
-               at25,byte-len = <8192>;
-               at25,addr-mode = <2>;
-               at25,page-size = <32>;
-
-               compatible = "atmel,at25";
-               reg = <2>;
-               spi-max-frequency = <1000000>;
-       };
-};
-
 &can1 {
        status = "okay";
 };
        };
 };
 
+&spi0 {
+       status = "okay";
+       num-cs = <4>;
+       is-decoded-cs = <0>;
+       eeprom: at25@0 {
+               at25,byte-len = <8192>;
+               at25,addr-mode = <2>;
+               at25,page-size = <32>;
+
+               compatible = "atmel,at25";
+               reg = <2>;
+               spi-max-frequency = <1000000>;
+       };
+};
+
 &uart0 {
        u-boot,dm-pre-reloc;
        status = "okay";
index 4481bd07c9e8debc552499dfc470875297832682..754604ea72519da1a8678183aceba55a0284a128 100644 (file)
@@ -41,7 +41,7 @@
        status = "okay";
        phy-handle = <&phy0>;
        phy-mode = "rgmii-id";
-       phy0: phy@0{
+       phy0: phy@0 {
                reg = <0>;
                max-speed = <100>;
        };
index 24a34e6d85d2e5c8ecf1e38a62f89608835a9154..8733604a57384eea27be29c8fac54c3b87a074c0 100644 (file)
                };
 
                uart0: serial@ff000000 {
-                       compatible = "cdns,uart-r1p8";
+                       compatible = "cdns,uart-r1p12";
                        status = "disabled";
                        interrupt-parent = <&gic>;
                        interrupts = <0 21 4>;
                };
 
                uart1: serial@ff010000 {
-                       compatible = "cdns,uart-r1p8";
+                       compatible = "cdns,uart-r1p12";
                        status = "disabled";
                        interrupt-parent = <&gic>;
                        interrupts = <0 22 4>;
                        compatible = "cdns,wdt-r1p2";
                        status = "disabled";
                        interrupt-parent = <&gic>;
-                       interrupts = <0 52 1>;
+                       interrupts = <0 113 1>;
                        reg = <0x0 0xfd4d0000 0x1000>;
                        timeout-sec = <10>;
                };
index 13e0a3d9074022481e30d1f2665bbbeb4a08f948..22212c2202ea399edbdffdc12e7c3b409ba5403c 100644 (file)
@@ -103,6 +103,97 @@ struct mxc_ccm_reg {
        u32 analog_pfd_528_set;
        u32 analog_pfd_528_clr;
        u32 analog_pfd_528_tog;
+       /* PMU Memory Map/Register Definition */
+       u32 pmu_reg_1p1;
+       u32 pmu_reg_1p1_set;
+       u32 pmu_reg_1p1_clr;
+       u32 pmu_reg_1p1_tog;
+       u32 pmu_reg_3p0;
+       u32 pmu_reg_3p0_set;
+       u32 pmu_reg_3p0_clr;
+       u32 pmu_reg_3p0_tog;
+       u32 pmu_reg_2p5;
+       u32 pmu_reg_2p5_set;
+       u32 pmu_reg_2p5_clr;
+       u32 pmu_reg_2p5_tog;
+       u32 pmu_reg_core;
+       u32 pmu_reg_core_set;
+       u32 pmu_reg_core_clr;
+       u32 pmu_reg_core_tog;
+       u32 pmu_misc0;
+       u32 pmu_misc0_set;
+       u32 pmu_misc0_clr;
+       u32 pmu_misc0_tog;
+       u32 pmu_misc1;
+       u32 pmu_misc1_set;
+       u32 pmu_misc1_clr;
+       u32 pmu_misc1_tog;
+       u32 pmu_misc2;
+       u32 pmu_misc2_set;
+       u32 pmu_misc2_clr;
+       u32 pmu_misc2_tog;
+       /* TEMPMON Memory Map/Register Definition */
+       u32 tempsense0;
+       u32 tempsense0_set;
+       u32 tempsense0_clr;
+       u32 tempsense0_tog;
+       u32 tempsense1;
+       u32 tempsense1_set;
+       u32 tempsense1_clr;
+       u32 tempsense1_tog;
+       /* USB Analog Memory Map/Register Definition */
+       u32 usb1_vbus_detect;
+       u32 usb1_vbus_detect_set;
+       u32 usb1_vbus_detect_clr;
+       u32 usb1_vbus_detect_tog;
+       u32 usb1_chrg_detect;
+       u32 usb1_chrg_detect_set;
+       u32 usb1_chrg_detect_clr;
+       u32 usb1_chrg_detect_tog;
+       u32 usb1_vbus_det_stat;
+       u32 usb1_vbus_det_stat_set;
+       u32 usb1_vbus_det_stat_clr;
+       u32 usb1_vbus_det_stat_tog;
+       u32 usb1_chrg_det_stat;
+       u32 usb1_chrg_det_stat_set;
+       u32 usb1_chrg_det_stat_clr;
+       u32 usb1_chrg_det_stat_tog;
+       u32 usb1_loopback;
+       u32 usb1_loopback_set;
+       u32 usb1_loopback_clr;
+       u32 usb1_loopback_tog;
+       u32 usb1_misc;
+       u32 usb1_misc_set;
+       u32 usb1_misc_clr;
+       u32 usb1_misc_tog;
+       u32 usb2_vbus_detect;
+       u32 usb2_vbus_detect_set;
+       u32 usb2_vbus_detect_clr;
+       u32 usb2_vbus_detect_tog;
+       u32 usb2_chrg_detect;
+       u32 usb2_chrg_detect_set;
+       u32 usb2_chrg_detect_clr;
+       u32 usb2_chrg_detect_tog;
+       u32 usb2_vbus_det_stat;
+       u32 usb2_vbus_det_stat_set;
+       u32 usb2_vbus_det_stat_clr;
+       u32 usb2_vbus_det_stat_tog;
+       u32 usb2_chrg_det_stat;
+       u32 usb2_chrg_det_stat_set;
+       u32 usb2_chrg_det_stat_clr;
+       u32 usb2_chrg_det_stat_tog;
+       u32 usb2_loopback;
+       u32 usb2_loopback_set;
+       u32 usb2_loopback_clr;
+       u32 usb2_loopback_tog;
+       u32 usb2_misc;
+       u32 usb2_misc_set;
+       u32 usb2_misc_clr;
+       u32 usb2_misc_tog;
+       u32 digprog;
+       u32 reserved1[7];
+       /* For i.MX 6SoloLite */
+       u32 digprog_sololite;
 };
 #endif
 
@@ -1136,4 +1227,16 @@ struct mxc_ccm_reg {
 
 #define BM_ANADIG_ANA_MISC0_REFTOP_SELBIASOFF 0x00000008
 
+#define BM_PMU_MISC2_AUDIO_DIV_MSB (1 << 23)
+#define BP_PMU_MISC2_AUDIO_DIV_MSB 23
+
+#define BM_PMU_MISC2_AUDIO_DIV_LSB (1 << 15)
+#define BP_PMU_MISC2_AUDIO_DIV_LSB 15
+
+#define PMU_MISC2_AUDIO_DIV(v) \
+       (((v & BM_PMU_MISC2_AUDIO_DIV_MSB) >> \
+       (BP_PMU_MISC2_AUDIO_DIV_MSB - 1)) | \
+       ((v & BM_PMU_MISC2_AUDIO_DIV_LSB) >> \
+        BP_PMU_MISC2_AUDIO_DIV_LSB))
+
 #endif /*__ARCH_ARM_MACH_MX6_CCM_REGS_H__ */
index e28a807ec2f7a3ca78cca5d066d8d1c84061eafb..58a25c7b16263dc9975b01f47901290a4d22594c 100644 (file)
@@ -272,6 +272,8 @@ struct src {
 #define IOMUXC_GPR_GPR0_DMAREQ_MUX_SEL5_SHIFT    5
 #define IOMUXC_GPR_GPR0_DMAREQ_MUX_SEL6_MASK     0x40u
 #define IOMUXC_GPR_GPR0_DMAREQ_MUX_SEL6_SHIFT    6
+#define IOMUXC_GPR_GPR0_ENET_MDIO_OPEN_DRAIN_MASK (3 << 7)
+#define IOMUXC_GPR_GPR0_ENET_MDIO_OPEN_DRAIN_SHIFT 7
 /* GPR1 Bit Fields */
 #define IOMUXC_GPR_GPR1_GPR_WEIM_ACT_CS0_MASK    0x1u
 #define IOMUXC_GPR_GPR1_GPR_WEIM_ACT_CS0_SHIFT   0
index 8ca58ae5216c1da000c7b8d4e599c274e4160601..6c0573fe5872a99a3af211b4781a55164bb3ffc0 100644 (file)
@@ -30,6 +30,7 @@ int clock_init(void);
 int clock_twi_onoff(int port, int state);
 void clock_set_de_mod_clock(u32 *clk_cfg, unsigned int hz);
 void clock_init_safe(void);
+void clock_init_sec(void);
 void clock_init_uart(void);
 #endif
 
index 5c762751126e4cdefd7f72065a2134b9f05486d8..554d8589ed55d7cd0c475a191e62fe14dd96b8a3 100644 (file)
@@ -137,6 +137,8 @@ struct sunxi_ccm_reg {
        u32 apb1_reset_cfg;     /* 0x2d0 APB1 Reset config */
        u32 reserved24;
        u32 apb2_reset_cfg;     /* 0x2d8 APB2 Reset config */
+       u32 reserved25[5];
+       u32 ccu_sec_switch;     /* 0x2f0 CCU Security Switch, H3 only */
 };
 
 /* apb2 bit field */
@@ -375,6 +377,11 @@ struct sunxi_ccm_reg {
 #define CCM_DE_CTRL_PLL10              (5 << 24)
 #define CCM_DE_CTRL_GATE               (1 << 31)
 
+/* CCU security switch, H3 only */
+#define CCM_SEC_SWITCH_MBUS_NONSEC     (1 << 2)
+#define CCM_SEC_SWITCH_BUS_NONSEC      (1 << 1)
+#define CCM_SEC_SWITCH_PLL_NONSEC      (1 << 0)
+
 #ifndef __ASSEMBLY__
 void clock_set_pll1(unsigned int hz);
 void clock_set_pll3(unsigned int hz);
index 2891b71b334eb144c7a0ec5715b0898533cc36d7..842ad3cc636ee83e784593826348a75e595ee811 100644 (file)
@@ -186,7 +186,7 @@ struct sunxi_mctl_ctl_reg {
 #define MCTL_CR_BUSW8                  (0 << 12)
 #define MCTL_CR_BUSW16                 (1 << 12)
 #define MCTL_CR_SEQUENCE               (1 << 15)
-#define MCTL_CR_DDR3                   (3 << 16)
+#define MCTL_CR_DRAM_TYPE(x)           ((x) << 16)
 #define MCTL_CR_CHANNEL_MASK           (1 << 19)
 #define MCTL_CR_CHANNEL(x)             (((x) - 1) << 19)
 #define MCTL_CR_UNKNOWN                        (0x4 << 20)
@@ -198,4 +198,11 @@ struct sunxi_mctl_ctl_reg {
 #define MCTL_MR2                       0x18 /* CWL=8 */
 #define MCTL_MR3                       0x0
 
+#define MCTL_LPDDR3_MR0                        0x0
+#define MCTL_LPDDR3_MR1                        0xc3    /* twr=8, bl=8 */
+#define MCTL_LPDDR3_MR2                        0xa     /* RL=12, CWL=6 */
+#define MCTL_LPDDR3_MR3                        0x0
+
+#define DRAM_TYPE_DDR3         3
+#define DRAM_TYPE_LPDDR3       7
 #endif /* _SUNXI_DRAM_SUN8I_A83T_H */
index ba4d43bc3a2ec248a830b6f23dc7b8a895921b5d..95c55cd4d1307d99c4c09f17e94de4429d2a3355 100644 (file)
@@ -13,10 +13,21 @@ struct sunxi_tzpc {
        u32 decport0_status;    /* 0x04 Status of decode protection port 0 */
        u32 decport0_set;       /* 0x08 Set decode protection port 0 */
        u32 decport0_clear;     /* 0x0c Clear decode protection port 0 */
+       /* For A80 and later SoCs */
+       u32 decport1_status;    /* 0x10 Status of decode protection port 1 */
+       u32 decport1_set;       /* 0x14 Set decode protection port 1 */
+       u32 decport1_clear;     /* 0x18 Clear decode protection port 1 */
+       u32 decport2_status;    /* 0x1c Status of decode protection port 2 */
+       u32 decport2_set;       /* 0x20 Set decode protection port 2 */
+       u32 decport2_clear;     /* 0x24 Clear decode protection port 2 */
 };
 #endif
 
-#define SUNXI_TZPC_DECPORT0_RTC        (1 << 1)
+#define SUN6I_TZPC_DECPORT0_RTC        (1 << 1)
+
+#define SUN8I_H3_TZPC_DECPORT0_ALL  0xbe
+#define SUN8I_H3_TZPC_DECPORT1_ALL  0xff
+#define SUN8I_H3_TZPC_DECPORT2_ALL  0x7f
 
 void tzpc_init(void);
 
index d55bc31c43993cb7ebbb3fb983e3faecb715b7c7..b18333d1ca25fd29bb13100d58646fe01adb8316 100644 (file)
@@ -9,5 +9,6 @@
 #define _ASM_ARCH_CLK_H_
 
 unsigned long get_uart_clk(int dev_id);
+unsigned long zynqmp_get_system_timer_freq(void);
 
 #endif /* _ASM_ARCH_CLK_H_ */
index bbf89d9dd7460cc013d42e3de764eae2a96590c8..587938249e8f7e3cd501463a6bd1c54cf57dc94f 100644 (file)
@@ -41,11 +41,8 @@ struct crlapb_regs {
 
 #define crlapb_base ((struct crlapb_regs *)ZYNQMP_CRL_APB_BASEADDR)
 
-#if defined(CONFIG_SECURE_IOU)
-#define ZYNQMP_IOU_SCNTR       0xFF260000
-#else
+#define ZYNQMP_IOU_SCNTR_SECURE        0xFF260000
 #define ZYNQMP_IOU_SCNTR       0xFF250000
-#endif
 #define ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN   0x1
 #define ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_HDBG 0x2
 
@@ -57,9 +54,21 @@ struct iou_scntr {
 
 #define iou_scntr ((struct iou_scntr *)ZYNQMP_IOU_SCNTR)
 
+struct iou_scntr_secure {
+       u32 counter_control_register;
+       u32 reserved0[7];
+       u32 base_frequency_id_register;
+};
+
+#define iou_scntr_secure ((struct iou_scntr_secure *)ZYNQMP_IOU_SCNTR_SECURE)
+
 /* Bootmode setting values */
 #define BOOT_MODES_MASK        0x0000000F
-#define SD_MODE                0x00000003
+#define QSPI_MODE_24BIT        0x00000001
+#define QSPI_MODE_32BIT        0x00000002
+#define SD_MODE                0x00000003 /* sd 0 */
+#define SD_MODE1       0x00000005 /* sd 1 */
+#define NAND_MODE      0x00000004
 #define EMMC_MODE      0x00000006
 #define JTAG_MODE      0x00000000
 
@@ -106,9 +115,20 @@ struct apu_regs {
 #define apu_base ((struct apu_regs *)ZYNQMP_APU_BASEADDR)
 
 /* Board version value */
+#define ZYNQMP_CSU_BASEADDR            0xFFCA0000
 #define ZYNQMP_CSU_VERSION_SILICON     0x0
 #define ZYNQMP_CSU_VERSION_EP108       0x1
 #define ZYNQMP_CSU_VERSION_VELOCE      0x2
 #define ZYNQMP_CSU_VERSION_QEMU                0x3
 
+#define ZYNQMP_SILICON_VER_MASK                0xF000
+#define ZYNQMP_SILICON_VER_SHIFT       12
+
+struct csu_regs {
+       u32 reserved0[17];
+       u32 version;
+};
+
+#define csu_base ((struct csu_regs *)ZYNQMP_CSU_BASEADDR)
+
 #endif /* _ASM_ARCH_HARDWARE_H */
index 7d421b3967cfb8295abfa4cb84d8f0d048879a5f..1aec4f9d5a2a8db0ffc9a25a61957dd7e733c720 100644 (file)
@@ -59,7 +59,7 @@ enum {
        MXS_DMA_CHANNEL_AHB_APBH_RESERVED1,
        MXS_MAX_DMA_CHANNELS,
 };
-#elif defined(CONFIG_MX6)
+#elif defined(CONFIG_MX6) || defined(CONFIG_MX7)
 enum {
        MXS_DMA_CHANNEL_AHB_APBH_GPMI0 = 0,
        MXS_DMA_CHANNEL_AHB_APBH_GPMI1,
index ca7743600420048b5f404130dd35fcafe52f1fbe..391452cc1241ac96e90a907fa5fd867c8ae59a8d 100644 (file)
@@ -96,7 +96,7 @@ struct mxs_apbh_regs {
        mxs_reg_32(hw_apbh_version)
 };
 
-#elif (defined(CONFIG_MX28) || defined(CONFIG_MX6))
+#elif (defined(CONFIG_MX28) || defined(CONFIG_MX6) || defined(CONFIG_MX7))
 struct mxs_apbh_regs {
        mxs_reg_32(hw_apbh_ctrl0)
        mxs_reg_32(hw_apbh_ctrl1)
@@ -275,7 +275,7 @@ 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)
+#elif (defined(CONFIG_MX6) || defined(CONFIG_MX7))
 #define        APBH_CTRL0_CLKGATE_CHANNEL_OFFSET               0
 #define        APBH_CTRL0_CLKGATE_CHANNEL_NAND0                0x0001
 #define        APBH_CTRL0_CLKGATE_CHANNEL_NAND1                0x0002
@@ -391,7 +391,7 @@ struct mxs_apbh_regs {
 #define        APBH_CHANNEL_CTRL_FREEZE_CHANNEL_LCDIF          0x2000
 #endif
 
-#if defined(CONFIG_MX6)
+#if (defined(CONFIG_MX6) || defined(CONFIG_MX7))
 #define        APBH_CHANNEL_CTRL_RESET_CHANNEL_OFFSET          16
 #endif
 
index 5c477835fc5a4de7432a0cecb0033a5bcdd58fae..adfbace05deb496ef91df145973c8bd8b961ec4f 100644 (file)
@@ -123,7 +123,7 @@ 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)
+#if (defined(CONFIG_MX6) || defined(CONFIG_MX7))
 #define        BCH_FLASHLAYOUT0_ECC0_MASK                      (0x1f << 11)
 #define        BCH_FLASHLAYOUT0_ECC0_OFFSET                    11
 #else
@@ -154,7 +154,7 @@ struct mxs_bch_regs {
 
 #define        BCH_FLASHLAYOUT1_PAGE_SIZE_MASK                 (0xffff << 16)
 #define        BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET               16
-#if defined(CONFIG_MX6)
+#if (defined(CONFIG_MX6) || defined(CONFIG_MX7))
 #define        BCH_FLASHLAYOUT1_ECCN_MASK                      (0x1f << 11)
 #define        BCH_FLASHLAYOUT1_ECCN_OFFSET                    11
 #else
index b9628462eab890e19e8d3725a30967a7a2f2c407..96a33133ae8332a7fb2398738e8b9ebbfeb5336a 100644 (file)
@@ -46,6 +46,10 @@ config TARGET_MAXBCM
        bool "Support maxbcm"
        select MV78460
 
+config TARGET_THEADORABLE
+       bool "Support theadorable Armada XP"
+       select MV78260
+
 endchoice
 
 config SYS_BOARD
@@ -54,6 +58,7 @@ config SYS_BOARD
        default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
        default "ds414" if TARGET_DS414
        default "maxbcm" if TARGET_MAXBCM
+       default "theadorable" if TARGET_THEADORABLE
 
 config SYS_CONFIG_NAME
        default "clearfog" if TARGET_CLEARFOG
@@ -61,6 +66,7 @@ config SYS_CONFIG_NAME
        default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
        default "ds414" if TARGET_DS414
        default "maxbcm" if TARGET_MAXBCM
+       default "theadorable" if TARGET_THEADORABLE
 
 config SYS_VENDOR
        default "Marvell" if TARGET_DB_MV784MP_GP
index 47f45c1512a8686f3df1d729f5cc8ba196cdc202..017d55f412ed01b9e871f7300c85a083cb5686dd 100644 (file)
@@ -145,5 +145,18 @@ int serdes_phy_config(void);
  * drivers/ddr/marvell
  */
 int ddr3_init(void);
+
+struct mvebu_lcd_info {
+       u32 fb_base;
+       int x_res;
+       int y_res;
+       int x_fp;               /* frontporch */
+       int y_fp;
+       int x_bp;               /* backporch */
+       int y_bp;
+};
+
+int mvebu_lcd_register_init(struct mvebu_lcd_info *lcd_info);
+
 #endif /* __ASSEMBLY__ */
 #endif /* _MVEBU_CPU_H */
index cb216bc2cc61d5c2a14139d4538afcaefa43f70a..b31794036691e4f6e0f6aa7e071682c02b5c8c65 100644 (file)
@@ -67,6 +67,7 @@
 #define MVEBU_SATA0_BASE       (MVEBU_REGISTER(0xa8000))
 #define MVEBU_NAND_BASE                (MVEBU_REGISTER(0xd0000))
 #define MVEBU_SDIO_BASE                (MVEBU_REGISTER(0xd8000))
+#define MVEBU_LCD_BASE         (MVEBU_REGISTER(0xe0000))
 
 #define SOC_COHERENCY_FABRIC_CTRL_REG  (MVEBU_REGISTER(0x20200))
 #define MBUS_ERR_PROP_EN       (1 << 8)
index b4229f4575e83b373385e465c09a08892a13ab9f..a4fa00c9adaefeea838dec87a5d3325cf6fea7cd 100644 (file)
@@ -8,6 +8,7 @@
 /* Tegra AP (Application Processor) code */
 
 #include <common.h>
+#include <linux/bug.h>
 #include <asm/io.h>
 #include <asm/arch/gp_padctrl.h>
 #include <asm/arch/mc.h>
index 5b20accbcb172d7e0e40dc7c92933f5123e1485a..d74f8dbbc45dfb9f6440ea38fa44552404f436ef 100644 (file)
@@ -42,8 +42,6 @@ void zynq_ddrc_init(void)
                 */
                /* cppcheck-suppress nullPointer */
                memset((void *)0, 0, 1 * 1024 * 1024);
-
-               gd->ram_size /= 2;
        } else {
                puts("ECC disabled ");
        }
index 604f6815af5b460a775557ecf4be19d5753fb4cf..30ea484f48aafe00d536634722d0b31bddc50c26 100644 (file)
@@ -13,6 +13,7 @@ config TARGET_MICROBLAZE_GENERIC
        select SUPPORT_SPL
        select OF_CONTROL
        select DM
+       select DM_SERIAL
 
 endchoice
 
index 4955e812360bdd9d9c1bf94024f3b21485db1d48..069721033f081a08b13b459d4c1c69b8070426cf 100644 (file)
@@ -7,5 +7,5 @@
 
 extra-y        = start.o
 obj-y  = irq.o
-obj-y  += cpu.o interrupts.o cache.o exception.o timer.o
+obj-y  += interrupts.o cache.o exception.o timer.o
 obj-$(CONFIG_SPL_BUILD)        += spl.o
diff --git a/arch/microblaze/cpu/cpu.c b/arch/microblaze/cpu/cpu.c
deleted file mode 100644 (file)
index 8e459d8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * (C) Copyright 2004 Atmark Techno, Inc.
- *
- * Yasushi SHOJI <yashi@atmark-techno.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-/* EMPTY FILE */
index 206be3e3ee588ed1192d3d4e5fc9e93b3645c602..e9923b65ef3237bd1e2a60d3db34e0c5ee537146 100644 (file)
@@ -155,6 +155,10 @@ clear_bss:
        cmp     r6, r5, r4 /* check if we have reach the end */
        bnei    r6, 2b
 3:     /* jumping to board_init */
+#ifdef CONFIG_DEBUG_UART
+       bralid  r15, debug_uart_init
+       nop
+#endif
 #ifndef CONFIG_SPL_BUILD
        or      r5, r0, r0      /* flags - empty */
        addi    r31, r0, _gd
index b8ac5a5ac5417b68c481c5019438587e907ca6f2..f71e34231bc79c642471a556ae86e5af42234b10 100644 (file)
@@ -10,6 +10,7 @@
 #ifndef _ASM_IO_H
 #define _ASM_IO_H
 
+#include <linux/bug.h>
 #include <linux/compiler.h>
 #include <linux/types.h>
 
index c26cc8f5031e4edad4b365d4a45505ff78d885cc..b7fbd2f125305f21802a68f8a32be312fb33a7fe 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <common.h>
+#include <console.h>
 #include <stdio_dev.h>
 #include <watchdog.h>
 #include <malloc.h>
index 6b44a3709a4afd58c7d765784a46eb816a9f718d..b0ed374563adb66f107fb127b0af328102b12109 100644 (file)
@@ -41,7 +41,8 @@ archprepare: checkgcc4
 # that U-Boot wants.
 # See http://lists.denx.de/pipermail/u-boot/2012-September/135156.html
 checkgcc4:
-       @if test $(call cc-version) -lt 0400; then \
+       @if test "$(call cc-name)" = "gcc" -a \
+                       $(call cc-version) -lt 0400; then \
                echo -n '*** Your GCC is too old, please upgrade to GCC 4.x or newer'; \
                false; \
        fi
index 4105a28509143d48f402ee7c2b43eb089b473c50..ac77ddcf4da0a939ac1ee306e14dad52552ec871 100644 (file)
@@ -203,18 +203,6 @@ void serial_putc_dev(unsigned int idx, const char c)
        out_8(&psc->tfdata_8, c);
 }
 
-void serial_putc_raw_dev(unsigned int idx, const char c)
-{
-       volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
-       volatile psc512x_t *psc = (psc512x_t *) &im->psc[idx];
-
-       /* Wait for last character to go. */
-       while (!(in_be16(&psc->psc_status) & PSC_SR_TXEMP))
-               ;
-
-       out_8(&psc->tfdata_8, c);
-}
-
 void serial_puts_dev(unsigned int idx, const char *s)
 {
        while (*s)
index cb5b0bfe9b0d3eeb18e69ad3ae7627b145ddfe12..bccdcf7973af7b601c8c0c00a7f643dbd2f0f8d6 100644 (file)
@@ -112,17 +112,6 @@ void serial_putc_dev (unsigned long dev_base, const char c)
        psc->psc_buffer_8 = c;
 }
 
-void serial_putc_raw_dev(unsigned long dev_base, const char c)
-{
-       volatile struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)dev_base;
-       /* Wait for last character to go. */
-       while (!(psc->psc_status & PSC_SR_TXEMP))
-               ;
-
-       psc->psc_buffer_8 = c;
-}
-
-
 void serial_puts_dev (unsigned long dev_base, const char *s)
 {
        while (*s) {
index 997aea488ff5836077e5f5245ec7a92b942432db..5659ab8d9201832bcc6c168dd6d27a3a9972d439 100644 (file)
@@ -19,7 +19,7 @@ int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id)
        if (start == 0)
                start_align = 1ull << (LAW_SIZE_2G + 1);
        else
-               start_align = 1ull << (__ffs64(start) - 1);
+               start_align = 1ull << (__ffs64(start));
        law_sz = min(start_align, sz);
        law_sz_enc = __ilog2_u64(law_sz) - 1;
 
@@ -39,7 +39,7 @@ int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id)
        if (sz) {
                start += law_sz;
 
-               start_align = 1ull << (__ffs64(start) - 1);
+               start_align = 1ull << (__ffs64(start));
                law_sz = min(start_align, sz);
                law_sz_enc = __ilog2_u64(law_sz) - 1;
                ecm = &immap->sysconf.ddrlaw[1];
index d51616ba22cfeffbd29afca8df93c8d8e1437aec..80bbc1805fbf0cfbd3b251216c15af8c95711db2 100644 (file)
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
 #include <asm/fsl_srio.h>
+#ifdef CONFIG_FSL_CORENET
+#include <asm/fsl_portals.h>
+#include <asm/fsl_liodn.h>
+#endif
 #include <fsl_usb.h>
 #include <hwconfig.h>
 #include <linux/compiler.h>
@@ -791,6 +795,13 @@ int cpu_init_r(void)
                spin_table_compat = 1;
 #endif
 
+#ifdef CONFIG_FSL_CORENET
+       set_liodns();
+#ifdef CONFIG_SYS_DPAA_QBMAN
+       setup_portals();
+#endif
+#endif
+
        l2cache_init();
 #if defined(CONFIG_RAMBOOT_PBL)
        disable_cpc_sram();
index 24baad442e4967d2b97cb690b96616f035c49c22..bd79297f0f7a562c28a83b7aeb8036f1f130c29a 100644 (file)
@@ -188,7 +188,7 @@ int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id)
        if (start == 0)
                start_align = 1ull << (LAW_SIZE_32G + 1);
        else
-               start_align = 1ull << (__ffs64(start) - 1);
+               start_align = 1ull << (__ffs64(start));
        law_sz = min(start_align, sz);
        law_sz_enc = __ilog2_u64(law_sz) - 1;
 
@@ -203,7 +203,7 @@ int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id)
        if (sz) {
                start += law_sz;
 
-               start_align = 1ull << (__ffs64(start) - 1);
+               start_align = 1ull << (__ffs64(start));
                law_sz = min(start_align, sz);
                law_sz_enc = __ilog2_u64(law_sz) - 1;
 
index efd316573ce6e9f8cf42acfc21af16c3c491ac11..36af1b9419b09f43d815b732fe8b36deb10e76c5 100644 (file)
@@ -55,12 +55,6 @@ config TARGET_YOSEMITE
 config TARGET_YUCCA
        bool "Support yucca"
 
-config TARGET_FX12MM
-       bool "Support fx12mm"
-
-config TARGET_V5FX30TEVAL
-       bool "Support v5fx30teval"
-
 config TARGET_CPCI2DP
        bool "Support CPCI2DP"
 
@@ -115,14 +109,19 @@ config TARGET_PIP405
 config TARGET_XPEDITE1000
        bool "Support xpedite1000"
 
-config TARGET_ML507
-       bool "Support ml507"
-
 config TARGET_XILINX_PPC405_GENERIC
        bool "Support xilinx-ppc405-generic"
+       select SUPPORT_SPL
+       select OF_CONTROL
+       select DM
+       select DM_SERIAL
 
 config TARGET_XILINX_PPC440_GENERIC
        bool "Support xilinx-ppc440-generic"
+       select SUPPORT_SPL
+       select OF_CONTROL
+       select DM
+       select DM_SERIAL
 
 endchoice
 
@@ -139,8 +138,6 @@ source "board/amcc/sequoia/Kconfig"
 source "board/amcc/walnut/Kconfig"
 source "board/amcc/yosemite/Kconfig"
 source "board/amcc/yucca/Kconfig"
-source "board/avnet/fx12mm/Kconfig"
-source "board/avnet/v5fx30teval/Kconfig"
 source "board/esd/cpci2dp/Kconfig"
 source "board/esd/cpci405/Kconfig"
 source "board/esd/plu405/Kconfig"
@@ -158,7 +155,6 @@ source "board/mpl/mip405/Kconfig"
 source "board/mpl/pip405/Kconfig"
 source "board/t3corp/Kconfig"
 source "board/xes/xpedite1000/Kconfig"
-source "board/xilinx/ml507/Kconfig"
 source "board/xilinx/ppc405-generic/Kconfig"
 source "board/xilinx/ppc440-generic/Kconfig"
 
index d9b565468b609869bbd10c38fd09c1cd3b84f183..45997d6eae0640dee7e36cffdcf1460afd336379 100644 (file)
@@ -9,7 +9,7 @@
  * Travis B. Sawyer, Sandburst Corporation, tsawyer@sandburst.com
  *
  * (C) Copyright 2008 (PPC440X05 port for Virtex 5 FX)
- * Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * Work supported by Qtechnology (htpp://qtec.com)
  *
  * SPDX-License-Identifier:    GPL-2.0+
index bd955ed83ff0b14f90485aa5c9b9443cfec4b6bc..fb453b1adfb51bdf09cb3fe229bd6652cde35a63 100644 (file)
@@ -9,7 +9,7 @@
  * Travis B. Sawyer, Sandburst Corporation, tsawyer@sandburst.com
  *
  * (C) Copyright 2008 (PPC440X05 port for Virtex 5 FX)
- * Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * Work supported by Qtechnology (htpp://qtec.com)
  *
  * SPDX-License-Identifier:    GPL-2.0+
index 71e1be02a6784a246d89ad28c62f69ec63f82b72..1a2e917eb23b032f83fc5c3cd6e00c9659c8ebab 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * Based on interrupts.c Wolfgang Denk-DENX Software Engineering-wd@denx.de
  * SPDX-License-Identifier:    GPL-2.0+
index 5d9f5c2822b26b0a40707eb781913ff3923e59d0..80b4c0c4e374f27cb0545845508ce51919df4e1f 100644 (file)
@@ -3,6 +3,8 @@
 #
 
 dtb-$(CONFIG_TARGET_CANYONLANDS) += arches.dtb canyonlands.dtb glacier.dtb
+dtb-$(CONFIG_TARGET_XILINX_PPC440_GENERIC) += xilinx-ppc440-generic.dtb
+dtb-$(CONFIG_TARGET_XILINX_PPC405_GENERIC) += xilinx-ppc405-generic.dtb
 
 targets += $(dtb-y)
 
diff --git a/arch/powerpc/dts/xilinx-ppc405-generic.dts b/arch/powerpc/dts/xilinx-ppc405-generic.dts
new file mode 100644 (file)
index 0000000..6498321
--- /dev/null
@@ -0,0 +1,15 @@
+/dts-v1/;
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               console = &uart0;
+       };
+
+       uart0: serial@84000000 {
+               compatible = "xlnx,xps-uartlite-1.00.a";
+               interrupts = <0 0>;
+               reg = <0x84000000 0x10000>;
+       };
+} ;
diff --git a/arch/powerpc/dts/xilinx-ppc440-generic.dts b/arch/powerpc/dts/xilinx-ppc440-generic.dts
new file mode 100644 (file)
index 0000000..c83523a
--- /dev/null
@@ -0,0 +1,15 @@
+/dts-v1/;
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               console = &uart0;
+       };
+
+       uart0: serial@8b000000 {
+               compatible = "xlnx,xps-uartlite-1.00.a";
+               interrupts = <0 0>;
+               reg = <0x8b000000 0x10000>;
+       };
+} ;
index 1a6a93384e76f696af3ac958ee4cd9245dddaf7b..9f370dd83c9d1d0f8f50bf4d7a53e107f694bc16 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * Based on interrupts.c Wolfgang Denk-DENX Software Engineering-wd@denx.de
  *
index 333a0372b7888efdb1ffe15fa6e5fbf49cadd86d..5766bde366cee8b4bb55de63f55eb8517c500fa4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * Based on interrupts.c Wolfgang Denk-DENX Software Engineering-wd@denx.de
  * SPDX-License-Identifier:    GPL-2.0+
index 7299f2cddc944de8edb25b3f7a40e62a4453a646..25382f9aab1efdb8e944b2094786fc64c8f0b570 100644 (file)
@@ -50,7 +50,7 @@ int arch_misc_init(void)
        mrccache_save();
 #endif
 
-       return pirq_init();
+       return 0;
 }
 
 int reserve_arch(void)
index 41e29a6086fdfb661ea521002c24f68426b119a2..7f5087a918386ab847cc2c25902bf78635116c9d 100644 (file)
@@ -14,7 +14,8 @@
 #include <pci.h>
 
 static const struct udevice_id generic_pch_ids[] = {
-       { .compatible = "intel,pch" },
+       { .compatible = "intel,pch7" },
+       { .compatible = "intel,pch9" },
        { }
 };
 
index 381d83526fbf63612f0fa8d27197a8e8af2fed6a..6c3a748f75388538fb61ca548718ddde25ae0c9e 100644 (file)
@@ -688,7 +688,7 @@ static int x86_mp_init(void)
 }
 #endif
 
-__weak int x86_init_cpus(void)
+static int x86_init_cpus(void)
 {
 #ifdef CONFIG_SMP
        debug("Init additional CPUs\n");
@@ -709,8 +709,24 @@ __weak int x86_init_cpus(void)
 
 int cpu_init_r(void)
 {
-       if (ll_boot_init())
-               return x86_init_cpus();
+       struct udevice *dev;
+       int ret;
+
+       if (!ll_boot_init())
+               return 0;
+
+       ret = x86_init_cpus();
+       if (ret)
+               return ret;
+
+       /*
+        * Set up the northbridge, PCH and LPC if available. Note that these
+        * may have had some limited pre-relocation init if they were probed
+        * before relocation, but this is post relocation.
+        */
+       uclass_first_device(UCLASS_NORTHBRIDGE, &dev);
+       uclass_first_device(UCLASS_PCH, &dev);
+       uclass_first_device(UCLASS_LPC, &dev);
 
        return 0;
 }
index b00ddc0cb488163e5e14c1a6127ddbbb1dc8a04f..c40200bf8587e86113888c98b40a23e23b17bb33 100644 (file)
@@ -12,6 +12,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <asm/cache.h>
 #include <asm/control_regs.h>
 #include <asm/interrupt.h>
@@ -244,6 +245,14 @@ int disable_interrupts(void)
 
 int interrupt_init(void)
 {
+       struct udevice *dev;
+       int ret;
+
+       /* Try to set up the interrupt router, but don't require one */
+       ret = uclass_first_device(UCLASS_IRQ, &dev);
+       if (ret && ret != -ENODEV)
+               return ret;
+
        /*
         * When running as an EFI application we are not in control of
         * interrupts and should leave them alone.
index 35b29f69d8459cceb0fbbc5c0f3dd4e12b992564..0b36ace0915565ab5795655408bca91c88d7ff2a 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <fdtdec.h>
 #include <malloc.h>
@@ -82,12 +83,7 @@ static inline void fill_irq_info(struct irq_info *slot, int bus, int device,
        slot->irq[pin - 1].bitmap = irq_router.irq_mask;
 }
 
-__weak void cpu_irq_init(void)
-{
-       return;
-}
-
-static int create_pirq_routing_table(void)
+static int create_pirq_routing_table(struct udevice *dev)
 {
        const void *blob = gd->fdt_blob;
        struct fdt_pci_addr addr;
@@ -97,16 +93,13 @@ static int create_pirq_routing_table(void)
        struct irq_routing_table *rt;
        struct irq_info *slot, *slot_base;
        int irq_entries = 0;
+       int parent;
        int i;
        int ret;
 
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_IRQ_ROUTER);
-       if (node < 0) {
-               debug("%s: Cannot find irq router node\n", __func__);
-               return -EINVAL;
-       }
-
-       ret = fdtdec_get_pci_addr(blob, node, FDT_PCI_SPACE_CONFIG,
+       node = dev->of_offset;
+       parent = dev->parent->of_offset;
+       ret = fdtdec_get_pci_addr(blob, parent, FDT_PCI_SPACE_CONFIG,
                                  "reg", &addr);
        if (ret)
                return ret;
@@ -225,13 +218,11 @@ static int create_pirq_routing_table(void)
        return 0;
 }
 
-int pirq_init(void)
+int irq_router_common_init(struct udevice *dev)
 {
        int ret;
 
-       cpu_irq_init();
-
-       ret = create_pirq_routing_table();
+       ret = create_pirq_routing_table(dev);
        if (ret) {
                debug("Failed to create pirq routing table\n");
                return ret;
@@ -243,6 +234,11 @@ int pirq_init(void)
        return 0;
 }
 
+int irq_router_probe(struct udevice *dev)
+{
+       return irq_router_common_init(dev);
+}
+
 u32 write_pirq_routing_table(u32 addr)
 {
        if (!pirq_routing_table)
@@ -250,3 +246,20 @@ u32 write_pirq_routing_table(u32 addr)
 
        return copy_pirq_routing_table(addr, pirq_routing_table);
 }
+
+static const struct udevice_id irq_router_ids[] = {
+       { .compatible = "intel,irq-router" },
+       { }
+};
+
+U_BOOT_DRIVER(irq_router_drv) = {
+       .name           = "intel_irq",
+       .id             = UCLASS_IRQ,
+       .of_match       = irq_router_ids,
+       .probe          = irq_router_probe,
+};
+
+UCLASS_DRIVER(irq) = {
+       .id             = UCLASS_IRQ,
+       .name           = "irq",
+};
index 0c7efaec7ceed9c9d43aeb40b4cb5c2470d5d646..45ef14187ea73cd30bfd6f856ca8fa565ec7c2b0 100644 (file)
@@ -7,7 +7,6 @@
 obj-y += bd82x6x.o
 obj-y += car.o
 obj-y += cpu.o
-obj-y += early_init.o
 obj-y += early_me.o
 obj-y += gma.o
 obj-y += lpc.o
@@ -15,10 +14,6 @@ obj-y += me_status.o
 obj-y += model_206ax.o
 obj-y += microcode_intel.o
 obj-y += northbridge.o
-obj-y += pch.o
-obj-y += pci.o
 obj-y += report_platform.o
 obj-y += sata.o
 obj-y += sdram.o
-obj-y += usb_ehci.o
-obj-y += usb_xhci.o
index 434dfd649f65853b3977e10f7c400a2346d6b150..2b172d49bade73704529abfbadd64beb28a932a7 100644 (file)
@@ -3,12 +3,15 @@
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
-
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
 #include <fdtdec.h>
 #include <malloc.h>
+#include <pch.h>
+#include <syscon.h>
+#include <asm/cpu.h>
+#include <asm/io.h>
 #include <asm/lapic.h>
 #include <asm/pci.h>
 #include <asm/arch/bd82x6x.h>
 #include <asm/arch/pch.h>
 #include <asm/arch/sandybridge.h>
 
-void bd82x6x_pci_init(pci_dev_t dev)
+#define BIOS_CTRL      0xdc
+
+static int pch_revision_id = -1;
+static int pch_type = -1;
+
+/**
+ * pch_silicon_revision() - Read silicon revision ID from the PCH
+ *
+ * @dev:       PCH device
+ * @return silicon revision ID
+ */
+static int pch_silicon_revision(struct udevice *dev)
 {
-       u16 reg16;
-       u8 reg8;
-
-       debug("bd82x6x PCI init.\n");
-       /* Enable Bus Master */
-       reg16 = x86_pci_read_config16(dev, PCI_COMMAND);
-       reg16 |= PCI_COMMAND_MASTER;
-       x86_pci_write_config16(dev, PCI_COMMAND, reg16);
-
-       /* This device has no interrupt */
-       x86_pci_write_config8(dev, INTR, 0xff);
-
-       /* disable parity error response and SERR */
-       reg16 = x86_pci_read_config16(dev, BCTRL);
-       reg16 &= ~(1 << 0);
-       reg16 &= ~(1 << 1);
-       x86_pci_write_config16(dev, BCTRL, reg16);
-
-       /* Master Latency Count must be set to 0x04! */
-       reg8 = x86_pci_read_config8(dev, SMLT);
-       reg8 &= 0x07;
-       reg8 |= (0x04 << 3);
-       x86_pci_write_config8(dev, SMLT, reg8);
-
-       /* Will this improve throughput of bus masters? */
-       x86_pci_write_config8(dev, PCI_MIN_GNT, 0x06);
-
-       /* Clear errors in status registers */
-       reg16 = x86_pci_read_config16(dev, PSTS);
-       /* reg16 |= 0xf900; */
-       x86_pci_write_config16(dev, PSTS, reg16);
-
-       reg16 = x86_pci_read_config16(dev, SECSTS);
-       /* reg16 |= 0xf900; */
-       x86_pci_write_config16(dev, SECSTS, reg16);
+       u8 val;
+
+       if (pch_revision_id < 0) {
+               dm_pci_read_config8(dev, PCI_REVISION_ID, &val);
+               pch_revision_id = val;
+       }
+
+       return pch_revision_id;
 }
 
-static int bd82x6x_probe(struct udevice *dev)
+int pch_silicon_type(struct udevice *dev)
 {
-       const void *blob = gd->fdt_blob;
-       struct pci_controller *hose;
-       struct x86_cpu_priv *cpu;
-       int sata_node, gma_node;
-       int ret;
+       u8 val;
 
-       hose = pci_bus_to_hose(0);
-       lpc_enable(PCH_LPC_DEV);
-       lpc_init(hose, PCH_LPC_DEV);
-       sata_node = fdtdec_next_compatible(blob, 0,
-                                          COMPAT_INTEL_PANTHERPOINT_AHCI);
-       if (sata_node < 0) {
-               debug("%s: Cannot find SATA node\n", __func__);
-               return -EINVAL;
+       if (pch_type < 0) {
+               dm_pci_read_config8(dev, PCI_DEVICE_ID + 1, &val);
+               pch_type = val;
        }
-       bd82x6x_sata_init(PCH_SATA_DEV, blob, sata_node);
-       bd82x6x_usb_ehci_init(PCH_EHCI1_DEV);
-       bd82x6x_usb_ehci_init(PCH_EHCI2_DEV);
-
-       cpu = calloc(1, sizeof(*cpu));
-       if (!cpu)
-               return -ENOMEM;
-       model_206ax_init(cpu);
-
-       gma_node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_GMA);
-       if (gma_node < 0) {
-               debug("%s: Cannot find GMA node\n", __func__);
-               return -EINVAL;
+
+       return pch_type;
+}
+
+/**
+ * pch_silicon_supported() - Check if a certain revision is supported
+ *
+ * @dev:       PCH device
+ * @type:      PCH type
+ * @rev:       Minimum required resion
+ * @return 0 if not supported, 1 if supported
+ */
+static int pch_silicon_supported(struct udevice *dev, int type, int rev)
+{
+       int cur_type = pch_silicon_type(dev);
+       int cur_rev = pch_silicon_revision(dev);
+
+       switch (type) {
+       case PCH_TYPE_CPT:
+               /* CougarPoint minimum revision */
+               if (cur_type == PCH_TYPE_CPT && cur_rev >= rev)
+                       return 1;
+               /* PantherPoint any revision */
+               if (cur_type == PCH_TYPE_PPT)
+                       return 1;
+               break;
+
+       case PCH_TYPE_PPT:
+               /* PantherPoint minimum revision */
+               if (cur_type == PCH_TYPE_PPT && cur_rev >= rev)
+                       return 1;
+               break;
+       }
+
+       return 0;
+}
+
+#define IOBP_RETRY 1000
+static inline int iobp_poll(void)
+{
+       unsigned try = IOBP_RETRY;
+       u32 data;
+
+       while (try--) {
+               data = readl(RCB_REG(IOBPS));
+               if ((data & 1) == 0)
+                       return 1;
+               udelay(10);
        }
-       ret = dm_pci_bus_find_bdf(PCH_VIDEO_DEV, &dev);
+
+       printf("IOBP timeout\n");
+       return 0;
+}
+
+void pch_iobp_update(struct udevice *dev, u32 address, u32 andvalue,
+                    u32 orvalue)
+{
+       u32 data;
+
+       /* Set the address */
+       writel(address, RCB_REG(IOBPIRI));
+
+       /* READ OPCODE */
+       if (pch_silicon_supported(dev, PCH_TYPE_CPT, PCH_STEP_B0))
+               writel(IOBPS_RW_BX, RCB_REG(IOBPS));
+       else
+               writel(IOBPS_READ_AX, RCB_REG(IOBPS));
+       if (!iobp_poll())
+               return;
+
+       /* Read IOBP data */
+       data = readl(RCB_REG(IOBPD));
+       if (!iobp_poll())
+               return;
+
+       /* Check for successful transaction */
+       if ((readl(RCB_REG(IOBPS)) & 0x6) != 0) {
+               printf("IOBP read 0x%08x failed\n", address);
+               return;
+       }
+
+       /* Update the data */
+       data &= andvalue;
+       data |= orvalue;
+
+       /* WRITE OPCODE */
+       if (pch_silicon_supported(dev, PCH_TYPE_CPT, PCH_STEP_B0))
+               writel(IOBPS_RW_BX, RCB_REG(IOBPS));
+       else
+               writel(IOBPS_WRITE_AX, RCB_REG(IOBPS));
+       if (!iobp_poll())
+               return;
+
+       /* Write IOBP data */
+       writel(data, RCB_REG(IOBPD));
+       if (!iobp_poll())
+               return;
+}
+
+static int bd82x6x_probe(struct udevice *dev)
+{
+       struct udevice *gma_dev;
+       int ret;
+
+       if (!(gd->flags & GD_FLG_RELOC))
+               return 0;
+
+       /* Cause the SATA device to do its init */
+       uclass_first_device(UCLASS_DISK, &dev);
+
+       ret = syscon_get_by_driver_data(X86_SYSCON_GMA, &gma_dev);
        if (ret)
                return ret;
-       ret = gma_func0_init(dev, blob, gma_node);
+       ret = gma_func0_init(gma_dev);
        if (ret)
                return ret;
 
        return 0;
 }
 
-int bd82x6x_init(void)
+static int bd82x6x_pch_get_sbase(struct udevice *dev, ulong *sbasep)
 {
-       const void *blob = gd->fdt_blob;
-       int sata_node;
-
-       sata_node = fdtdec_next_compatible(blob, 0,
-                                          COMPAT_INTEL_PANTHERPOINT_AHCI);
-       if (sata_node < 0) {
-               debug("%s: Cannot find SATA node\n", __func__);
-               return -EINVAL;
-       }
+       u32 rcba;
+
+       dm_pci_read_config32(dev, PCH_RCBA, &rcba);
+       /* Bits 31-14 are the base address, 13-1 are reserved, 0 is enable */
+       rcba = rcba & 0xffffc000;
+       *sbasep = rcba + 0x3800;
+
+       return 0;
+}
+
+static enum pch_version bd82x6x_pch_get_version(struct udevice *dev)
+{
+       return PCHV_9;
+}
 
-       bd82x6x_pci_init(PCH_DEV);
-       bd82x6x_sata_enable(PCH_SATA_DEV, blob, sata_node);
-       northbridge_enable(PCH_DEV);
-       northbridge_init(PCH_DEV);
+static int bd82x6x_set_spi_protect(struct udevice *dev, bool protect)
+{
+       uint8_t bios_cntl;
+
+       /* Adjust the BIOS write protect and SMM BIOS Write Protect Disable */
+       dm_pci_read_config8(dev, BIOS_CTRL, &bios_cntl);
+       if (protect) {
+               bios_cntl &= ~BIOS_CTRL_BIOSWE;
+               bios_cntl |= BIT(5);
+       } else {
+               bios_cntl |= BIOS_CTRL_BIOSWE;
+               bios_cntl &= ~BIT(5);
+       }
+       dm_pci_write_config8(dev, BIOS_CTRL, bios_cntl);
 
        return 0;
 }
 
+static const struct pch_ops bd82x6x_pch_ops = {
+       .get_sbase      = bd82x6x_pch_get_sbase,
+       .get_version    = bd82x6x_pch_get_version,
+       .set_spi_protect = bd82x6x_set_spi_protect,
+};
+
 static const struct udevice_id bd82x6x_ids[] = {
        { .compatible = "intel,bd82x6x" },
        { }
@@ -126,4 +221,5 @@ U_BOOT_DRIVER(bd82x6x_drv) = {
        .id             = UCLASS_PCH,
        .of_match       = bd82x6x_ids,
        .probe          = bd82x6x_probe,
+       .ops            = &bd82x6x_pch_ops,
 };
index 343bfb4e98e264a7e5fa91f7e9f58c89427f73f3..948833c02857e6d98de58e57232b3be156aed9b2 100644 (file)
@@ -15,6 +15,7 @@
 #include <dm.h>
 #include <errno.h>
 #include <fdtdec.h>
+#include <pch.h>
 #include <asm/cpu.h>
 #include <asm/io.h>
 #include <asm/lapic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static void enable_port80_on_lpc(struct pci_controller *hose, pci_dev_t dev)
-{
-       /* Enable port 80 POST on LPC */
-       pci_hose_write_config_dword(hose, dev, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
-       clrbits_le32(RCB_REG(GCS), 4);
-}
-
-/*
- * Enable Prefetching and Caching.
- */
-static void enable_spi_prefetch(struct pci_controller *hose, pci_dev_t dev)
-{
-       u8 reg8;
-
-       pci_hose_read_config_byte(hose, dev, 0xdc, &reg8);
-       reg8 &= ~(3 << 2);
-       reg8 |= (2 << 2); /* Prefetching and Caching Enabled */
-       pci_hose_write_config_byte(hose, dev, 0xdc, reg8);
-}
-
 static int set_flex_ratio_to_tdp_nominal(void)
 {
        msr_t flex_ratio, msr;
@@ -99,22 +80,6 @@ static int set_flex_ratio_to_tdp_nominal(void)
        return -EINVAL;
 }
 
-static void set_spi_speed(void)
-{
-       u32 fdod;
-
-       /* Observe SPI Descriptor Component Section 0 */
-       writel(0x1000, RCB_REG(SPI_DESC_COMP0));
-
-       /* Extract the1 Write/Erase SPI Frequency from descriptor */
-       fdod = readl(RCB_REG(SPI_FREQ_WR_ERA));
-       fdod >>= 24;
-       fdod &= 7;
-
-       /* Set Software Sequence frequency to match */
-       clrsetbits_8(RCB_REG(SPI_FREQ_SWSEQ), 7, fdod);
-}
-
 int arch_cpu_init(void)
 {
        post_code(POST_CPU_INIT);
@@ -124,10 +89,8 @@ int arch_cpu_init(void)
 
 int arch_cpu_init_dm(void)
 {
-       const void *blob = gd->fdt_blob;
        struct pci_controller *hose;
-       struct udevice *bus;
-       int node;
+       struct udevice *bus, *dev;
        int ret;
 
        post_code(0x70);
@@ -141,19 +104,9 @@ int arch_cpu_init_dm(void)
        /* TODO(sjg@chromium.org): Get rid of gd->hose */
        gd->hose = hose;
 
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_PCH);
-       if (node < 0)
-               return -ENOENT;
-       ret = lpc_early_init(gd->fdt_blob, node, PCH_LPC_DEV);
-       if (ret)
-               return ret;
-
-       enable_spi_prefetch(hose, PCH_LPC_DEV);
-
-       /* This is already done in start.S, but let's do it in C */
-       enable_port80_on_lpc(hose, PCH_LPC_DEV);
-
-       set_spi_speed();
+       ret = uclass_first_device(UCLASS_LPC, &dev);
+       if (!dev)
+               return -ENODEV;
 
        /*
         * We should do as little as possible before the serial console is
@@ -167,41 +120,6 @@ int arch_cpu_init_dm(void)
        return 0;
 }
 
-static int enable_smbus(void)
-{
-       pci_dev_t dev;
-       uint16_t value;
-
-       /* Set the SMBus device statically. */
-       dev = PCI_BDF(0x0, 0x1f, 0x3);
-
-       /* Check to make sure we've got the right device. */
-       value = x86_pci_read_config16(dev, 0x0);
-       if (value != 0x8086) {
-               printf("SMBus controller not found\n");
-               return -ENOSYS;
-       }
-
-       /* Set SMBus I/O base. */
-       x86_pci_write_config32(dev, SMB_BASE,
-                              SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
-
-       /* Set SMBus enable. */
-       x86_pci_write_config8(dev, HOSTC, HST_EN);
-
-       /* Set SMBus I/O space enable. */
-       x86_pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
-
-       /* Disable interrupt generation. */
-       outb(0, SMBUS_IO_BASE + SMBHSTCTL);
-
-       /* Clear any lingering errors, so transactions can run. */
-       outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
-       debug("SMBus controller enabled\n");
-
-       return 0;
-}
-
 #define PCH_EHCI0_TEMP_BAR0 0xe8000000
 #define PCH_EHCI1_TEMP_BAR0 0xe8000400
 #define PCH_XHCI_TEMP_BAR0  0xe8001000
@@ -215,33 +133,33 @@ static int enable_smbus(void)
  *
  * This is used to speed up the resume path.
  */
-static void enable_usb_bar(void)
+static void enable_usb_bar(struct udevice *bus)
 {
        pci_dev_t usb0 = PCH_EHCI1_DEV;
        pci_dev_t usb1 = PCH_EHCI2_DEV;
        pci_dev_t usb3 = PCH_XHCI_DEV;
-       u32 cmd;
+       ulong cmd;
 
        /* USB Controller 1 */
-       x86_pci_write_config32(usb0, PCI_BASE_ADDRESS_0,
-                              PCH_EHCI0_TEMP_BAR0);
-       cmd = x86_pci_read_config32(usb0, PCI_COMMAND);
+       pci_bus_write_config(bus, usb0, PCI_BASE_ADDRESS_0,
+                            PCH_EHCI0_TEMP_BAR0, PCI_SIZE_32);
+       pci_bus_read_config(bus, usb0, PCI_COMMAND, &cmd, PCI_SIZE_32);
        cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
-       x86_pci_write_config32(usb0, PCI_COMMAND, cmd);
+       pci_bus_write_config(bus, usb0, PCI_COMMAND, cmd, PCI_SIZE_32);
 
-       /* USB Controller 1 */
-       x86_pci_write_config32(usb1, PCI_BASE_ADDRESS_0,
-                              PCH_EHCI1_TEMP_BAR0);
-       cmd = x86_pci_read_config32(usb1, PCI_COMMAND);
+       /* USB Controller 2 */
+       pci_bus_write_config(bus, usb1, PCI_BASE_ADDRESS_0,
+                            PCH_EHCI1_TEMP_BAR0, PCI_SIZE_32);
+       pci_bus_read_config(bus, usb1, PCI_COMMAND, &cmd, PCI_SIZE_32);
        cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
-       x86_pci_write_config32(usb1, PCI_COMMAND, cmd);
+       pci_bus_write_config(bus, usb1, PCI_COMMAND, cmd, PCI_SIZE_32);
 
-       /* USB3 Controller */
-       x86_pci_write_config32(usb3, PCI_BASE_ADDRESS_0,
-                              PCH_XHCI_TEMP_BAR0);
-       cmd = x86_pci_read_config32(usb3, PCI_COMMAND);
+       /* USB3 Controller */
+       pci_bus_write_config(bus, usb3, PCI_BASE_ADDRESS_0,
+                            PCH_XHCI_TEMP_BAR0, PCI_SIZE_32);
+       pci_bus_read_config(bus, usb3, PCI_COMMAND, &cmd, PCI_SIZE_32);
        cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
-       x86_pci_write_config32(usb3, PCI_COMMAND, cmd);
+       pci_bus_write_config(bus, usb3, PCI_COMMAND, cmd, PCI_SIZE_32);
 }
 
 static int report_bist_failure(void)
@@ -259,6 +177,7 @@ int print_cpuinfo(void)
 {
        enum pei_boot_mode_t boot_mode = PEI_BOOT_NONE;
        char processor_name[CPU_MAX_NAME_LEN];
+       struct udevice *dev, *lpc;
        const char *name;
        uint32_t pm1_cnt;
        uint16_t pm1_sts;
@@ -289,7 +208,16 @@ int print_cpuinfo(void)
        }
 
        /* Early chipset init required before RAM init can work */
-       sandybridge_early_init(SANDYBRIDGE_MOBILE);
+       uclass_first_device(UCLASS_NORTHBRIDGE, &dev);
+
+       ret = uclass_first_device(UCLASS_LPC, &lpc);
+       if (ret)
+               return ret;
+       if (!dev)
+               return -ENODEV;
+
+       /* Cause the SATA device to do its early init */
+       uclass_first_device(UCLASS_DISK, &dev);
 
        /* Check PM1_STS[15] to see if we are waking from Sx */
        pm1_sts = inw(DEFAULT_PMBASE + PM1_STS);
@@ -308,20 +236,18 @@ int print_cpuinfo(void)
        post_code(POST_EARLY_INIT);
 
        /* Enable SPD ROMs and DDR-III DRAM */
-       ret = enable_smbus();
+       ret = uclass_first_device(UCLASS_I2C, &dev);
        if (ret)
                return ret;
+       if (!dev)
+               return -ENODEV;
 
        /* Prepare USB controller early in S3 resume */
        if (boot_mode == PEI_BOOT_RESUME)
-               enable_usb_bar();
+               enable_usb_bar(pci_get_controller(lpc->parent));
 
        gd->arch.pei_boot_mode = boot_mode;
 
-       /* TODO: Move this to the board or driver */
-       x86_pci_write_config32(PCH_LPC_DEV, GPIO_BASE, DEFAULT_GPIOBASE | 1);
-       x86_pci_write_config32(PCH_LPC_DEV, GPIO_CNTL, 0x10);
-
        /* Print processor name */
        name = cpu_get_name(processor_name);
        printf("CPU:   %s\n", name);
diff --git a/arch/x86/cpu/ivybridge/early_init.c b/arch/x86/cpu/ivybridge/early_init.c
deleted file mode 100644 (file)
index 9ca008e..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * From Coreboot
- *
- * Copyright (C) 2007-2010 coresystems GmbH
- * Copyright (C) 2011 Google Inc
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/pci.h>
-#include <asm/arch/pch.h>
-#include <asm/arch/sandybridge.h>
-
-static void sandybridge_setup_bars(pci_dev_t pch_dev, pci_dev_t lpc_dev)
-{
-       /* Setting up Southbridge. In the northbridge code. */
-       debug("Setting up static southbridge registers\n");
-       x86_pci_write_config32(lpc_dev, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
-
-       x86_pci_write_config32(lpc_dev, PMBASE, DEFAULT_PMBASE | 1);
-       x86_pci_write_config8(lpc_dev, ACPI_CNTL, 0x80); /* Enable ACPI BAR */
-
-       debug("Disabling watchdog reboot\n");
-       setbits_le32(RCB_REG(GCS), 1 >> 5);     /* No reset */
-       outw(1 << 11, DEFAULT_PMBASE | 0x60 | 0x08);    /* halt timer */
-
-       /* Set up all hardcoded northbridge BARs */
-       debug("Setting up static registers\n");
-       x86_pci_write_config32(pch_dev, EPBAR, DEFAULT_EPBAR | 1);
-       x86_pci_write_config32(pch_dev, EPBAR + 4, (0LL + DEFAULT_EPBAR) >> 32);
-       x86_pci_write_config32(pch_dev, MCHBAR, DEFAULT_MCHBAR | 1);
-       x86_pci_write_config32(pch_dev, MCHBAR + 4,
-                              (0LL + DEFAULT_MCHBAR) >> 32);
-       /* 64MB - busses 0-63 */
-       x86_pci_write_config32(pch_dev, PCIEXBAR, DEFAULT_PCIEXBAR | 5);
-       x86_pci_write_config32(pch_dev, PCIEXBAR + 4,
-                              (0LL + DEFAULT_PCIEXBAR) >> 32);
-       x86_pci_write_config32(pch_dev, DMIBAR, DEFAULT_DMIBAR | 1);
-       x86_pci_write_config32(pch_dev, DMIBAR + 4,
-                              (0LL + DEFAULT_DMIBAR) >> 32);
-
-       /* Set C0000-FFFFF to access RAM on both reads and writes */
-       x86_pci_write_config8(pch_dev, PAM0, 0x30);
-       x86_pci_write_config8(pch_dev, PAM1, 0x33);
-       x86_pci_write_config8(pch_dev, PAM2, 0x33);
-       x86_pci_write_config8(pch_dev, PAM3, 0x33);
-       x86_pci_write_config8(pch_dev, PAM4, 0x33);
-       x86_pci_write_config8(pch_dev, PAM5, 0x33);
-       x86_pci_write_config8(pch_dev, PAM6, 0x33);
-}
-
-static void sandybridge_setup_graphics(pci_dev_t pch_dev, pci_dev_t video_dev)
-{
-       u32 reg32;
-       u16 reg16;
-       u8 reg8;
-
-       reg16 = x86_pci_read_config16(video_dev, PCI_DEVICE_ID);
-       switch (reg16) {
-       case 0x0102: /* GT1 Desktop */
-       case 0x0106: /* GT1 Mobile */
-       case 0x010a: /* GT1 Server */
-       case 0x0112: /* GT2 Desktop */
-       case 0x0116: /* GT2 Mobile */
-       case 0x0122: /* GT2 Desktop >=1.3GHz */
-       case 0x0126: /* GT2 Mobile >=1.3GHz */
-       case 0x0156: /* IvyBridge */
-       case 0x0166: /* IvyBridge */
-               break;
-       default:
-               debug("Graphics not supported by this CPU/chipset\n");
-               return;
-       }
-
-       debug("Initialising Graphics\n");
-
-       /* Setup IGD memory by setting GGC[7:3] = 1 for 32MB */
-       reg16 = x86_pci_read_config16(pch_dev, GGC);
-       reg16 &= ~0x00f8;
-       reg16 |= 1 << 3;
-       /* Program GTT memory by setting GGC[9:8] = 2MB */
-       reg16 &= ~0x0300;
-       reg16 |= 2 << 8;
-       /* Enable VGA decode */
-       reg16 &= ~0x0002;
-       x86_pci_write_config16(pch_dev, GGC, reg16);
-
-       /* Enable 256MB aperture */
-       reg8 = x86_pci_read_config8(video_dev, MSAC);
-       reg8 &= ~0x06;
-       reg8 |= 0x02;
-       x86_pci_write_config8(video_dev, MSAC, reg8);
-
-       /* Erratum workarounds */
-       reg32 = readl(MCHBAR_REG(0x5f00));
-       reg32 |= (1 << 9) | (1 << 10);
-       writel(reg32, MCHBAR_REG(0x5f00));
-
-       /* Enable SA Clock Gating */
-       reg32 = readl(MCHBAR_REG(0x5f00));
-       writel(reg32 | 1, MCHBAR_REG(0x5f00));
-
-       /* GPU RC6 workaround for sighting 366252 */
-       reg32 = readl(MCHBAR_REG(0x5d14));
-       reg32 |= (1 << 31);
-       writel(reg32, MCHBAR_REG(0x5d14));
-
-       /* VLW */
-       reg32 = readl(MCHBAR_REG(0x6120));
-       reg32 &= ~(1 << 0);
-       writel(reg32, MCHBAR_REG(0x6120));
-
-       reg32 = readl(MCHBAR_REG(0x5418));
-       reg32 |= (1 << 4) | (1 << 5);
-       writel(reg32, MCHBAR_REG(0x5418));
-}
-
-void sandybridge_early_init(int chipset_type)
-{
-       pci_dev_t pch_dev = PCH_DEV;
-       pci_dev_t video_dev = PCH_VIDEO_DEV;
-       pci_dev_t lpc_dev = PCH_LPC_DEV;
-       u32 capid0_a;
-       u8 reg8;
-
-       /* Device ID Override Enable should be done very early */
-       capid0_a = x86_pci_read_config32(pch_dev, 0xe4);
-       if (capid0_a & (1 << 10)) {
-               reg8 = x86_pci_read_config8(pch_dev, 0xf3);
-               reg8 &= ~7; /* Clear 2:0 */
-
-               if (chipset_type == SANDYBRIDGE_MOBILE)
-                       reg8 |= 1; /* Set bit 0 */
-
-               x86_pci_write_config8(pch_dev, 0xf3, reg8);
-       }
-
-       /* Setup all BARs required for early PCIe and raminit */
-       sandybridge_setup_bars(pch_dev, lpc_dev);
-
-       /* Device Enable */
-       x86_pci_write_config32(pch_dev, DEVEN, DEVEN_HOST | DEVEN_IGD);
-
-       sandybridge_setup_graphics(pch_dev, video_dev);
-}
index 711470f36477d905e45cef93a69aa64343bbb001..b1df77d571b30ae08d7c91dcf779eefedfea7f11 100644 (file)
@@ -7,8 +7,10 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <asm/pci.h>
+#include <asm/cpu.h>
 #include <asm/processor.h>
 #include <asm/arch/me.h>
 #include <asm/arch/pch.h>
@@ -25,33 +27,36 @@ static const char *const me_ack_values[] = {
        [ME_HFS_ACK_CONTINUE]   = "Continue to boot"
 };
 
-static inline void pci_read_dword_ptr(void *ptr, int offset)
+static inline void pci_read_dword_ptr(struct udevice *me_dev, void *ptr,
+                                     int offset)
 {
        u32 dword;
 
-       dword = x86_pci_read_config32(PCH_ME_DEV, offset);
+       dm_pci_read_config32(me_dev, offset, &dword);
        memcpy(ptr, &dword, sizeof(dword));
 }
 
-static inline void pci_write_dword_ptr(void *ptr, int offset)
+static inline void pci_write_dword_ptr(struct udevice *me_dev, void *ptr,
+                                      int offset)
 {
        u32 dword = 0;
+
        memcpy(&dword, ptr, sizeof(dword));
-       x86_pci_write_config32(PCH_ME_DEV, offset, dword);
+       dm_pci_write_config32(me_dev, offset, dword);
 }
 
-void intel_early_me_status(void)
+void intel_early_me_status(struct udevice *me_dev)
 {
        struct me_hfs hfs;
        struct me_gmes gmes;
 
-       pci_read_dword_ptr(&hfs, PCI_ME_HFS);
-       pci_read_dword_ptr(&gmes, PCI_ME_GMES);
+       pci_read_dword_ptr(me_dev, &hfs, PCI_ME_HFS);
+       pci_read_dword_ptr(me_dev, &gmes, PCI_ME_GMES);
 
        intel_me_status(&hfs, &gmes);
 }
 
-int intel_early_me_init(void)
+int intel_early_me_init(struct udevice *me_dev)
 {
        int count;
        struct me_uma uma;
@@ -61,7 +66,7 @@ int intel_early_me_init(void)
 
        /* Wait for ME UMA SIZE VALID bit to be set */
        for (count = ME_RETRY; count > 0; --count) {
-               pci_read_dword_ptr(&uma, PCI_ME_UMA);
+               pci_read_dword_ptr(me_dev, &uma, PCI_ME_UMA);
                if (uma.valid)
                        break;
                udelay(ME_DELAY);
@@ -72,7 +77,7 @@ int intel_early_me_init(void)
        }
 
        /* Check for valid firmware */
-       pci_read_dword_ptr(&hfs, PCI_ME_HFS);
+       pci_read_dword_ptr(me_dev, &hfs, PCI_ME_HFS);
        if (hfs.fpt_bad) {
                printf("WARNING: ME has bad firmware\n");
                return -EBADF;
@@ -83,11 +88,11 @@ int intel_early_me_init(void)
        return 0;
 }
 
-int intel_early_me_uma_size(void)
+int intel_early_me_uma_size(struct udevice *me_dev)
 {
        struct me_uma uma;
 
-       pci_read_dword_ptr(&uma, PCI_ME_UMA);
+       pci_read_dword_ptr(me_dev, &uma, PCI_ME_UMA);
        if (uma.valid) {
                debug("ME: Requested %uMB UMA\n", uma.size);
                return uma.size;
@@ -97,11 +102,11 @@ int intel_early_me_uma_size(void)
        return -EINVAL;
 }
 
-static inline void set_global_reset(int enable)
+static inline void set_global_reset(struct udevice *dev, int enable)
 {
        u32 etr3;
 
-       etr3 = x86_pci_read_config32(PCH_LPC_DEV, ETR3);
+       dm_pci_read_config32(dev, ETR3, &etr3);
 
        /* Clear CF9 Without Resume Well Reset Enable */
        etr3 &= ~ETR3_CWORWRE;
@@ -112,10 +117,11 @@ static inline void set_global_reset(int enable)
        else
                etr3 &= ~ETR3_CF9GR;
 
-       x86_pci_write_config32(PCH_LPC_DEV, ETR3, etr3);
+       dm_pci_write_config32(dev, ETR3, etr3);
 }
 
-int intel_early_me_init_done(u8 status)
+int intel_early_me_init_done(struct udevice *dev, struct udevice *me_dev,
+                            uint status)
 {
        int count;
        u32 mebase_l, mebase_h;
@@ -126,8 +132,8 @@ int intel_early_me_init_done(u8 status)
        };
 
        /* MEBASE from MESEG_BASE[35:20] */
-       mebase_l = x86_pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_L);
-       mebase_h = x86_pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_H);
+       dm_pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_L, &mebase_l);
+       dm_pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_H, &mebase_h);
        mebase_h &= 0xf;
        did.uma_base = (mebase_l >> 20) | (mebase_h << 12);
 
@@ -135,25 +141,25 @@ int intel_early_me_init_done(u8 status)
        debug("ME: Sending Init Done with status: %d, UMA base: 0x%04x\n",
              status, did.uma_base);
 
-       pci_write_dword_ptr(&did, PCI_ME_H_GS);
+       pci_write_dword_ptr(me_dev, &did, PCI_ME_H_GS);
 
        /* Must wait for ME acknowledgement */
        for (count = ME_RETRY; count > 0; --count) {
-               pci_read_dword_ptr(&hfs, PCI_ME_HFS);
+               pci_read_dword_ptr(me_dev, &hfs, PCI_ME_HFS);
                if (hfs.bios_msg_ack)
                        break;
                udelay(ME_DELAY);
        }
        if (!count) {
                printf("ERROR: ME failed to respond\n");
-               return -1;
+               return -ETIMEDOUT;
        }
 
        /* Return the requested BIOS action */
        debug("ME: Requested BIOS Action: %s\n", me_ack_values[hfs.ack_data]);
 
        /* Check status after acknowledgement */
-       intel_early_me_status();
+       intel_early_me_status(me_dev);
 
        switch (hfs.ack_data) {
        case ME_HFS_ACK_CONTINUE:
@@ -161,17 +167,17 @@ int intel_early_me_init_done(u8 status)
                return 0;
        case ME_HFS_ACK_RESET:
                /* Non-power cycle reset */
-               set_global_reset(0);
+               set_global_reset(dev, 0);
                reset_cpu(0);
                break;
        case ME_HFS_ACK_PWR_CYCLE:
                /* Power cycle reset */
-               set_global_reset(0);
+               set_global_reset(dev, 0);
                x86_full_reset();
                break;
        case ME_HFS_ACK_GBL_RESET:
                /* Global reset */
-               set_global_reset(1);
+               set_global_reset(dev, 1);
                x86_full_reset();
                break;
        case ME_HFS_ACK_S3:
@@ -180,5 +186,17 @@ int intel_early_me_init_done(u8 status)
                break;
        }
 
-       return -1;
+       return -EINVAL;
 }
+
+static const struct udevice_id ivybridge_syscon_ids[] = {
+       { .compatible = "intel,me", .data = X86_SYSCON_ME },
+       { .compatible = "intel,gma", .data = X86_SYSCON_GMA },
+       { }
+};
+
+U_BOOT_DRIVER(syscon_intel_me) = {
+       .name = "intel_me_syscon",
+       .id = UCLASS_SYSCON,
+       .of_match = ivybridge_syscon_ids,
+};
index 85a09c64b6725024b35d294f94f0420ab88dcb1f..3b6291e9054d607c1c563e8541ebf143e7d1672e 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <bios_emul.h>
+#include <dm.h>
 #include <errno.h>
 #include <fdtdec.h>
 #include <pci_rom.h>
@@ -352,14 +353,13 @@ static int gtt_poll(void *bar, u32 reg, u32 mask, u32 value)
        return 0;
 }
 
-static int gma_pm_init_pre_vbios(void *gtt_bar)
+static int gma_pm_init_pre_vbios(void *gtt_bar, int rev)
 {
        u32 reg32;
 
-       debug("GT Power Management Init, silicon = %#x\n",
-             bridge_silicon_revision());
+       debug("GT Power Management Init, silicon = %#x\n", rev);
 
-       if (bridge_silicon_revision() < IVB_STEP_C0) {
+       if (rev < IVB_STEP_C0) {
                /* 1: Enable force wake */
                gtt_write(gtt_bar, 0xa18c, 0x00000001);
                gtt_poll(gtt_bar, 0x130090, (1 << 0), (1 << 0));
@@ -369,14 +369,14 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
                gtt_poll(gtt_bar, 0x130040, (1 << 0), (1 << 0));
        }
 
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_SNB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_SNB) {
                /* 1d: Set GTT+0x42004 [15:14]=11 (SnB C1+) */
                reg32 = gtt_read(gtt_bar, 0x42004);
                reg32 |= (1 << 14) | (1 << 15);
                gtt_write(gtt_bar, 0x42004, reg32);
        }
 
-       if (bridge_silicon_revision() >= IVB_STEP_A0) {
+       if (rev >= IVB_STEP_A0) {
                /* Display Reset Acknowledge Settings */
                reg32 = gtt_read(gtt_bar, 0x45010);
                reg32 |= (1 << 1) | (1 << 0);
@@ -385,7 +385,7 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
 
        /* 2: Get GT SKU from GTT+0x911c[13] */
        reg32 = gtt_read(gtt_bar, 0x911c);
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_SNB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_SNB) {
                if (reg32 & (1 << 13)) {
                        debug("SNB GT1 Power Meter Weights\n");
                        gtt_write_powermeter(gtt_bar, snb_pm_gt1);
@@ -434,13 +434,13 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
        reg32 = gtt_read(gtt_bar, 0xa180);
        reg32 |= (1 << 26) | (1 << 31);
        /* (bit 20=1 for SNB step D1+ / IVB A0+) */
-       if (bridge_silicon_revision() >= SNB_STEP_D1)
+       if (rev >= SNB_STEP_D1)
                reg32 |= (1 << 20);
        gtt_write(gtt_bar, 0xa180, reg32);
 
        /* 6a: for SnB step D2+ only */
-       if (((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_SNB) &&
-           (bridge_silicon_revision() >= SNB_STEP_D2)) {
+       if (((rev & BASE_REV_MASK) == BASE_REV_SNB) &&
+           (rev >= SNB_STEP_D2)) {
                reg32 = gtt_read(gtt_bar, 0x9400);
                reg32 |= (1 << 7);
                gtt_write(gtt_bar, 0x9400, reg32);
@@ -452,7 +452,7 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
                gtt_poll(gtt_bar, 0x941c, (1 << 1), (0 << 1));
        }
 
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_IVB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_IVB) {
                reg32 = gtt_read(gtt_bar, 0x907c);
                reg32 |= (1 << 16);
                gtt_write(gtt_bar, 0x907c, reg32);
@@ -504,7 +504,7 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
        gtt_write(gtt_bar, 0xa070, 0x0000000a); /* RP Idle Hysteresis */
 
        /* 11a: Enable Render Standby (RC6) */
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_IVB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_IVB) {
                /*
                 * IvyBridge should also support DeepRenderStandby.
                 *
@@ -538,14 +538,16 @@ static int gma_pm_init_pre_vbios(void *gtt_bar)
        return 0;
 }
 
-int gma_pm_init_post_vbios(void *gtt_bar, const void *blob, int node)
+int gma_pm_init_post_vbios(struct udevice *dev, int rev, void *gtt_bar)
 {
+       const void *blob = gd->fdt_blob;
+       int node = dev->of_offset;
        u32 reg32, cycle_delay;
 
        debug("GT Power Management Init (post VBIOS)\n");
 
        /* 15: Deassert Force Wake */
-       if (bridge_silicon_revision() < IVB_STEP_C0) {
+       if (rev < IVB_STEP_C0) {
                gtt_write(gtt_bar, 0xa18c, gtt_read(gtt_bar, 0xa18c) & ~1);
                gtt_poll(gtt_bar, 0x130090, (1 << 0), (0 << 0));
        } else {
@@ -728,15 +730,93 @@ static int int15_handler(void)
        return res;
 }
 
-int gma_func0_init(struct udevice *dev, const void *blob, int node)
+void sandybridge_setup_graphics(struct udevice *dev, struct udevice *video_dev)
+{
+       u32 reg32;
+       u16 reg16;
+       u8 reg8;
+
+       dm_pci_read_config16(video_dev, PCI_DEVICE_ID, &reg16);
+       switch (reg16) {
+       case 0x0102: /* GT1 Desktop */
+       case 0x0106: /* GT1 Mobile */
+       case 0x010a: /* GT1 Server */
+       case 0x0112: /* GT2 Desktop */
+       case 0x0116: /* GT2 Mobile */
+       case 0x0122: /* GT2 Desktop >=1.3GHz */
+       case 0x0126: /* GT2 Mobile >=1.3GHz */
+       case 0x0156: /* IvyBridge */
+       case 0x0166: /* IvyBridge */
+               break;
+       default:
+               debug("Graphics not supported by this CPU/chipset\n");
+               return;
+       }
+
+       debug("Initialising Graphics\n");
+
+       /* Setup IGD memory by setting GGC[7:3] = 1 for 32MB */
+       dm_pci_read_config16(dev, GGC, &reg16);
+       reg16 &= ~0x00f8;
+       reg16 |= 1 << 3;
+       /* Program GTT memory by setting GGC[9:8] = 2MB */
+       reg16 &= ~0x0300;
+       reg16 |= 2 << 8;
+       /* Enable VGA decode */
+       reg16 &= ~0x0002;
+       dm_pci_write_config16(dev, GGC, reg16);
+
+       /* Enable 256MB aperture */
+       dm_pci_read_config8(video_dev, MSAC, &reg8);
+       reg8 &= ~0x06;
+       reg8 |= 0x02;
+       dm_pci_write_config8(video_dev, MSAC, reg8);
+
+       /* Erratum workarounds */
+       reg32 = readl(MCHBAR_REG(0x5f00));
+       reg32 |= (1 << 9) | (1 << 10);
+       writel(reg32, MCHBAR_REG(0x5f00));
+
+       /* Enable SA Clock Gating */
+       reg32 = readl(MCHBAR_REG(0x5f00));
+       writel(reg32 | 1, MCHBAR_REG(0x5f00));
+
+       /* GPU RC6 workaround for sighting 366252 */
+       reg32 = readl(MCHBAR_REG(0x5d14));
+       reg32 |= (1 << 31);
+       writel(reg32, MCHBAR_REG(0x5d14));
+
+       /* VLW */
+       reg32 = readl(MCHBAR_REG(0x6120));
+       reg32 &= ~(1 << 0);
+       writel(reg32, MCHBAR_REG(0x6120));
+
+       reg32 = readl(MCHBAR_REG(0x5418));
+       reg32 |= (1 << 4) | (1 << 5);
+       writel(reg32, MCHBAR_REG(0x5418));
+}
+
+int gma_func0_init(struct udevice *dev)
 {
 #ifdef CONFIG_VIDEO
        ulong start;
 #endif
+       struct udevice *nbridge;
        void *gtt_bar;
        ulong base;
        u32 reg32;
        int ret;
+       int rev;
+
+       /* Enable PCH Display Port */
+       writew(0x0010, RCB_REG(DISPBDF));
+       setbits_le32(RCB_REG(FD2), PCH_ENABLE_DBDF);
+
+       ret = uclass_first_device(UCLASS_NORTHBRIDGE, &nbridge);
+       if (!nbridge)
+               return -ENODEV;
+       rev = bridge_silicon_revision(nbridge);
+       sandybridge_setup_graphics(nbridge, dev);
 
        /* IGD needs to be Bus Master */
        dm_pci_read_config32(dev, PCI_COMMAND, &reg32);
@@ -750,7 +830,7 @@ int gma_func0_init(struct udevice *dev, const void *blob, int node)
 
        gtt_bar = (void *)dm_pci_read_bar32(dev, 0);
        debug("GT bar %p\n", gtt_bar);
-       ret = gma_pm_init_pre_vbios(gtt_bar);
+       ret = gma_pm_init_pre_vbios(gtt_bar, rev);
        if (ret)
                return ret;
 
@@ -761,7 +841,7 @@ int gma_func0_init(struct udevice *dev, const void *blob, int node)
        debug("BIOS ran in %lums\n", get_timer(start));
 #endif
        /* Post VBIOS init */
-       ret = gma_pm_init_post_vbios(gtt_bar, blob, node);
+       ret = gma_pm_init_post_vbios(dev, rev, gtt_bar);
        if (ret)
                return ret;
 
index af5d4a89089bad99778d5aef6799af6781143e86..9ab5ed3ff97bb998e16bda391e7cfdff599e2d48 100644 (file)
 #define ENABLE_ACPI_MODE_IN_COREBOOT   0
 #define TEST_SMM_FLASH_LOCKDOWN                0
 
-static int pch_enable_apic(pci_dev_t dev)
+static int pch_enable_apic(struct udevice *pch)
 {
        u32 reg32;
        int i;
 
        /* Enable ACPI I/O and power management. Set SCI IRQ to IRQ9 */
-       x86_pci_write_config8(dev, ACPI_CNTL, 0x80);
+       dm_pci_write_config8(pch, ACPI_CNTL, 0x80);
 
        writel(0, IO_APIC_INDEX);
        writel(1 << 25, IO_APIC_DATA);
@@ -66,36 +66,36 @@ static int pch_enable_apic(pci_dev_t dev)
        return 0;
 }
 
-static void pch_enable_serial_irqs(pci_dev_t dev)
+static void pch_enable_serial_irqs(struct udevice *pch)
 {
        u32 value;
 
        /* Set packet length and toggle silent mode bit for one frame. */
        value = (1 << 7) | (1 << 6) | ((21 - 17) << 2) | (0 << 0);
 #ifdef CONFIG_SERIRQ_CONTINUOUS_MODE
-       x86_pci_write_config8(dev, SERIRQ_CNTL, value);
+       dm_pci_write_config8(pch, SERIRQ_CNTL, value);
 #else
-       x86_pci_write_config8(dev, SERIRQ_CNTL, value | (1 << 6));
+       dm_pci_write_config8(pch, SERIRQ_CNTL, value | (1 << 6));
 #endif
 }
 
-static int pch_pirq_init(const void *blob, int node, pci_dev_t dev)
+static int pch_pirq_init(struct udevice *pch)
 {
        uint8_t route[8], *ptr;
 
-       if (fdtdec_get_byte_array(blob, node, "intel,pirq-routing", route,
-                                 sizeof(route)))
+       if (fdtdec_get_byte_array(gd->fdt_blob, pch->of_offset,
+                                 "intel,pirq-routing", route, sizeof(route)))
                return -EINVAL;
        ptr = route;
-       x86_pci_write_config8(dev, PIRQA_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQB_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQC_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQD_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQA_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQB_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQC_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQD_ROUT, *ptr++);
 
-       x86_pci_write_config8(dev, PIRQE_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQF_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQG_ROUT, *ptr++);
-       x86_pci_write_config8(dev, PIRQH_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQE_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQF_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQG_ROUT, *ptr++);
+       dm_pci_write_config8(pch, PIRQH_ROUT, *ptr++);
 
        /*
         * TODO(sjg@chromium.org): U-Boot does not set up the interrupts
@@ -104,26 +104,28 @@ static int pch_pirq_init(const void *blob, int node, pci_dev_t dev)
        return 0;
 }
 
-static int pch_gpi_routing(const void *blob, int node, pci_dev_t dev)
+static int pch_gpi_routing(struct udevice *pch)
 {
        u8 route[16];
        u32 reg;
        int gpi;
 
-       if (fdtdec_get_byte_array(blob, node, "intel,gpi-routing", route,
-                                 sizeof(route)))
+       if (fdtdec_get_byte_array(gd->fdt_blob, pch->of_offset,
+                                 "intel,gpi-routing", route, sizeof(route)))
                return -EINVAL;
 
        for (reg = 0, gpi = 0; gpi < ARRAY_SIZE(route); gpi++)
                reg |= route[gpi] << (gpi * 2);
 
-       x86_pci_write_config32(dev, 0xb8, reg);
+       dm_pci_write_config32(pch, 0xb8, reg);
 
        return 0;
 }
 
-static int pch_power_options(const void *blob, int node, pci_dev_t dev)
+static int pch_power_options(struct udevice *pch)
 {
+       const void *blob = gd->fdt_blob;
+       int node = pch->of_offset;
        u8 reg8;
        u16 reg16, pmbase;
        u32 reg32;
@@ -142,7 +144,7 @@ static int pch_power_options(const void *blob, int node, pci_dev_t dev)
         */
        pwr_on = MAINBOARD_POWER_ON;
 
-       reg16 = x86_pci_read_config16(dev, GEN_PMCON_3);
+       dm_pci_read_config16(pch, GEN_PMCON_3, &reg16);
        reg16 &= 0xfffe;
        switch (pwr_on) {
        case MAINBOARD_POWER_OFF:
@@ -169,7 +171,7 @@ static int pch_power_options(const void *blob, int node, pci_dev_t dev)
 
        reg16 |= (1 << 12);     /* Disable SLP stretch after SUS well */
 
-       x86_pci_write_config16(dev, GEN_PMCON_3, reg16);
+       dm_pci_write_config16(pch, GEN_PMCON_3, reg16);
        debug("Set power %s after power failure.\n", state);
 
        /* Set up NMI on errors. */
@@ -193,21 +195,22 @@ static int pch_power_options(const void *blob, int node, pci_dev_t dev)
        outb(reg8, 0x70);
 
        /* Enable CPU_SLP# and Intel Speedstep, set SMI# rate down */
-       reg16 = x86_pci_read_config16(dev, GEN_PMCON_1);
+       dm_pci_read_config16(pch, GEN_PMCON_1, &reg16);
        reg16 &= ~(3 << 0);     /* SMI# rate 1 minute */
        reg16 &= ~(1 << 10);    /* Disable BIOS_PCI_EXP_EN for native PME */
 #if DEBUG_PERIODIC_SMIS
        /* Set DEBUG_PERIODIC_SMIS in pch.h to debug using periodic SMIs */
        reg16 |= (3 << 0);      /* Periodic SMI every 8s */
 #endif
-       x86_pci_write_config16(dev, GEN_PMCON_1, reg16);
+       dm_pci_write_config16(pch, GEN_PMCON_1, reg16);
 
        /* Set the board's GPI routing. */
-       ret = pch_gpi_routing(blob, node, dev);
+       ret = pch_gpi_routing(pch);
        if (ret)
                return ret;
 
-       pmbase = x86_pci_read_config16(dev, 0x40) & 0xfffe;
+       dm_pci_read_config16(pch, 0x40, &pmbase);
+       pmbase &= 0xfffe;
 
        writel(pmbase + GPE0_EN, fdtdec_get_int(blob, node,
                                                "intel,gpe0-enable", 0));
@@ -227,16 +230,16 @@ static int pch_power_options(const void *blob, int node, pci_dev_t dev)
        return 0;
 }
 
-static void pch_rtc_init(pci_dev_t dev)
+static void pch_rtc_init(struct udevice *pch)
 {
        int rtc_failed;
        u8 reg8;
 
-       reg8 = x86_pci_read_config8(dev, GEN_PMCON_3);
+       dm_pci_read_config8(pch, GEN_PMCON_3, &reg8);
        rtc_failed = reg8 & RTC_BATTERY_DEAD;
        if (rtc_failed) {
                reg8 &= ~RTC_BATTERY_DEAD;
-               x86_pci_write_config8(dev, GEN_PMCON_3, reg8);
+               dm_pci_write_config8(pch, GEN_PMCON_3, reg8);
        }
        debug("rtc_failed = 0x%x\n", rtc_failed);
 
@@ -246,10 +249,10 @@ static void pch_rtc_init(pci_dev_t dev)
 }
 
 /* CougarPoint PCH Power Management init */
-static void cpt_pm_init(pci_dev_t dev)
+static void cpt_pm_init(struct udevice *pch)
 {
        debug("CougarPoint PM init\n");
-       x86_pci_write_config8(dev, 0xa9, 0x47);
+       dm_pci_write_config8(pch, 0xa9, 0x47);
        setbits_le32(RCB_REG(0x2238), (1 << 6) | (1 << 0));
 
        setbits_le32(RCB_REG(0x228c), 1 << 0);
@@ -290,10 +293,10 @@ static void cpt_pm_init(pci_dev_t dev)
 }
 
 /* PantherPoint PCH Power Management init */
-static void ppt_pm_init(pci_dev_t dev)
+static void ppt_pm_init(struct udevice *pch)
 {
        debug("PantherPoint PM init\n");
-       x86_pci_write_config8(dev, 0xa9, 0x47);
+       dm_pci_write_config8(pch, 0xa9, 0x47);
        setbits_le32(RCB_REG(0x2238), 1 << 0);
        setbits_le32(RCB_REG(0x228c), 1 << 0);
        setbits_le16(RCB_REG(0x1100), (1 << 13) | (1 << 14));
@@ -340,21 +343,21 @@ static void enable_hpet(void)
        clrsetbits_le32(RCB_REG(HPTC), 3 << 0, 1 << 7);
 }
 
-static void enable_clock_gating(pci_dev_t dev)
+static void enable_clock_gating(struct udevice *pch)
 {
        u32 reg32;
        u16 reg16;
 
        setbits_le32(RCB_REG(0x2234), 0xf);
 
-       reg16 = x86_pci_read_config16(dev, GEN_PMCON_1);
+       dm_pci_read_config16(pch, GEN_PMCON_1, &reg16);
        reg16 |= (1 << 2) | (1 << 11);
-       x86_pci_write_config16(dev, GEN_PMCON_1, reg16);
+       dm_pci_write_config16(pch, GEN_PMCON_1, reg16);
 
-       pch_iobp_update(0xEB007F07, ~0UL, (1 << 31));
-       pch_iobp_update(0xEB004000, ~0UL, (1 << 7));
-       pch_iobp_update(0xEC007F07, ~0UL, (1 << 31));
-       pch_iobp_update(0xEC004000, ~0UL, (1 << 7));
+       pch_iobp_update(pch, 0xEB007F07, ~0UL, (1 << 31));
+       pch_iobp_update(pch, 0xEB004000, ~0UL, (1 << 7));
+       pch_iobp_update(pch, 0xEC007F07, ~0UL, (1 << 31));
+       pch_iobp_update(pch, 0xEC004000, ~0UL, (1 << 7));
 
        reg32 = readl(RCB_REG(CG));
        reg32 |= (1 << 31);
@@ -376,77 +379,24 @@ static void enable_clock_gating(pci_dev_t dev)
        setbits_le32(RCB_REG(0x3564), 0x3);
 }
 
-#if CONFIG_HAVE_SMI_HANDLER
-static void pch_lock_smm(pci_dev_t dev)
-{
-#if TEST_SMM_FLASH_LOCKDOWN
-       u8 reg8;
-#endif
-
-       if (acpi_slp_type != 3) {
-#if ENABLE_ACPI_MODE_IN_COREBOOT
-               debug("Enabling ACPI via APMC:\n");
-               outb(0xe1, 0xb2); /* Enable ACPI mode */
-               debug("done.\n");
-#else
-               debug("Disabling ACPI via APMC:\n");
-               outb(0x1e, 0xb2); /* Disable ACPI mode */
-               debug("done.\n");
-#endif
-       }
-
-       /* Don't allow evil boot loaders, kernels, or
-        * userspace applications to deceive us:
-        */
-       smm_lock();
-
-#if TEST_SMM_FLASH_LOCKDOWN
-       /* Now try this: */
-       debug("Locking BIOS to RO... ");
-       reg8 = x86_pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
-       debug(" BLE: %s; BWE: %s\n", (reg8 & 2) ? "on" : "off",
-             (reg8 & 1) ? "rw" : "ro");
-       reg8 &= ~(1 << 0);                      /* clear BIOSWE */
-       x86_pci_write_config8(dev, 0xdc, reg8);
-       reg8 |= (1 << 1);                       /* set BLE */
-       x86_pci_write_config8(dev, 0xdc, reg8);
-       debug("ok.\n");
-       reg8 = x86_pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
-       debug(" BLE: %s; BWE: %s\n", (reg8 & 2) ? "on" : "off",
-             (reg8 & 1) ? "rw" : "ro");
-
-       debug("Writing:\n");
-       writeb(0, 0xfff00000);
-       debug("Testing:\n");
-       reg8 |= (1 << 0);                       /* set BIOSWE */
-       x86_pci_write_config8(dev, 0xdc, reg8);
-
-       reg8 = x86_pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
-       debug(" BLE: %s; BWE: %s\n", (reg8 & 2) ? "on" : "off",
-             (reg8 & 1) ? "rw" : "ro");
-       debug("Done.\n");
-#endif
-}
-#endif
-
-static void pch_disable_smm_only_flashing(pci_dev_t dev)
+static void pch_disable_smm_only_flashing(struct udevice *pch)
 {
        u8 reg8;
 
        debug("Enabling BIOS updates outside of SMM... ");
-       reg8 = x86_pci_read_config8(dev, 0xdc); /* BIOS_CNTL */
+       dm_pci_read_config8(pch, 0xdc, &reg8);  /* BIOS_CNTL */
        reg8 &= ~(1 << 5);
-       x86_pci_write_config8(dev, 0xdc, reg8);
+       dm_pci_write_config8(pch, 0xdc, reg8);
 }
 
-static void pch_fixups(pci_dev_t dev)
+static void pch_fixups(struct udevice *pch)
 {
        u8 gen_pmcon_2;
 
        /* Indicate DRAM init done for MRC S3 to know it can resume */
-       gen_pmcon_2 = x86_pci_read_config8(dev, GEN_PMCON_2);
+       dm_pci_read_config8(pch, GEN_PMCON_2, &gen_pmcon_2);
        gen_pmcon_2 |= (1 << 7);
-       x86_pci_write_config8(dev, GEN_PMCON_2, gen_pmcon_2);
+       dm_pci_write_config8(pch, GEN_PMCON_2, gen_pmcon_2);
 
        /* Enable DMI ASPM in the PCH */
        clrbits_le32(RCB_REG(0x2304), 1 << 10);
@@ -454,7 +404,49 @@ static void pch_fixups(pci_dev_t dev)
        setbits_le32(RCB_REG(0x21a8), 0x3);
 }
 
-int lpc_early_init(const void *blob, int node, pci_dev_t dev)
+/*
+ * Enable Prefetching and Caching.
+ */
+static void enable_spi_prefetch(struct udevice *pch)
+{
+       u8 reg8;
+
+       dm_pci_read_config8(pch, 0xdc, &reg8);
+       reg8 &= ~(3 << 2);
+       reg8 |= (2 << 2); /* Prefetching and Caching Enabled */
+       dm_pci_write_config8(pch, 0xdc, reg8);
+}
+
+static void enable_port80_on_lpc(struct udevice *pch)
+{
+       /* Enable port 80 POST on LPC */
+       dm_pci_write_config32(pch, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
+       clrbits_le32(RCB_REG(GCS), 4);
+}
+
+static void set_spi_speed(void)
+{
+       u32 fdod;
+
+       /* Observe SPI Descriptor Component Section 0 */
+       writel(0x1000, RCB_REG(SPI_DESC_COMP0));
+
+       /* Extract the1 Write/Erase SPI Frequency from descriptor */
+       fdod = readl(RCB_REG(SPI_FREQ_WR_ERA));
+       fdod >>= 24;
+       fdod &= 7;
+
+       /* Set Software Sequence frequency to match */
+       clrsetbits_8(RCB_REG(SPI_FREQ_SWSEQ), 7, fdod);
+}
+
+/**
+ * lpc_early_init() - set up LPC serial ports and other early things
+ *
+ * @dev:       LPC device
+ * @return 0 if OK, -ve on error
+ */
+static int lpc_early_init(struct udevice *dev)
 {
        struct reg_info {
                u32 base;
@@ -463,17 +455,18 @@ int lpc_early_init(const void *blob, int node, pci_dev_t dev)
        int count;
        int i;
 
-       count = fdtdec_get_int_array_count(blob, node, "intel,gen-dec",
-                       (u32 *)values, sizeof(values) / sizeof(u32));
+       count = fdtdec_get_int_array_count(gd->fdt_blob, dev->of_offset,
+                       "intel,gen-dec", (u32 *)values,
+                       sizeof(values) / sizeof(u32));
        if (count < 0)
                return -EINVAL;
 
        /* Set COM1/COM2 decode range */
-       x86_pci_write_config16(dev, LPC_IO_DEC, 0x0010);
+       dm_pci_write_config16(dev->parent, LPC_IO_DEC, 0x0010);
 
        /* Enable PS/2 Keyboard/Mouse, EC areas and COM1 */
-       x86_pci_write_config16(dev, LPC_EN, KBC_LPC_EN | MC_LPC_EN |
-                          GAMEL_LPC_EN | COMA_LPC_EN);
+       dm_pci_write_config16(dev->parent, LPC_EN, KBC_LPC_EN | MC_LPC_EN |
+                             GAMEL_LPC_EN | COMA_LPC_EN);
 
        /* Write all registers but use 0 if we run out of data */
        count = count * sizeof(u32) / sizeof(values[0]);
@@ -482,81 +475,114 @@ int lpc_early_init(const void *blob, int node, pci_dev_t dev)
 
                if (i < count)
                        reg = ptr->base | PCI_COMMAND_IO | (ptr->size << 16);
-               x86_pci_write_config32(dev, LPC_GENX_DEC(i), reg);
+               dm_pci_write_config32(dev->parent, LPC_GENX_DEC(i), reg);
        }
 
+       enable_spi_prefetch(dev->parent);
+
+       /* This is already done in start.S, but let's do it in C */
+       enable_port80_on_lpc(dev->parent);
+
+       set_spi_speed();
+
        return 0;
 }
 
-int lpc_init(struct pci_controller *hose, pci_dev_t dev)
+static int lpc_init_extra(struct udevice *dev)
 {
+       struct udevice *pch = dev->parent;
        const void *blob = gd->fdt_blob;
        int node;
 
        debug("pch: lpc_init\n");
-       pci_write_bar32(hose, dev, 0, 0);
-       pci_write_bar32(hose, dev, 1, 0xff800000);
-       pci_write_bar32(hose, dev, 2, 0xfec00000);
-       pci_write_bar32(hose, dev, 3, 0x800);
-       pci_write_bar32(hose, dev, 4, 0x900);
+       dm_pci_write_bar32(pch, 0, 0);
+       dm_pci_write_bar32(pch, 1, 0xff800000);
+       dm_pci_write_bar32(pch, 2, 0xfec00000);
+       dm_pci_write_bar32(pch, 3, 0x800);
+       dm_pci_write_bar32(pch, 4, 0x900);
 
        node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_PCH);
        if (node < 0)
                return -ENOENT;
 
        /* Set the value for PCI command register. */
-       x86_pci_write_config16(dev, PCI_COMMAND, 0x000f);
+       dm_pci_write_config16(pch, PCI_COMMAND, 0x000f);
 
        /* IO APIC initialization. */
-       pch_enable_apic(dev);
+       pch_enable_apic(pch);
 
-       pch_enable_serial_irqs(dev);
+       pch_enable_serial_irqs(pch);
 
        /* Setup the PIRQ. */
-       pch_pirq_init(blob, node, dev);
+       pch_pirq_init(pch);
 
        /* Setup power options. */
-       pch_power_options(blob, node, dev);
+       pch_power_options(pch);
 
        /* Initialize power management */
-       switch (pch_silicon_type()) {
+       switch (pch_silicon_type(pch)) {
        case PCH_TYPE_CPT: /* CougarPoint */
-               cpt_pm_init(dev);
+               cpt_pm_init(pch);
                break;
        case PCH_TYPE_PPT: /* PantherPoint */
-               ppt_pm_init(dev);
+               ppt_pm_init(pch);
                break;
        default:
-               printf("Unknown Chipset: %#02x.%dx\n", PCI_DEV(dev),
-                      PCI_FUNC(dev));
+               printf("Unknown Chipset: %s\n", pch->name);
                return -ENOSYS;
        }
 
        /* Initialize the real time clock. */
-       pch_rtc_init(dev);
+       pch_rtc_init(pch);
 
        /* Initialize the High Precision Event Timers, if present. */
        enable_hpet();
 
        /* Initialize Clock Gating */
-       enable_clock_gating(dev);
+       enable_clock_gating(pch);
 
-       pch_disable_smm_only_flashing(dev);
+       pch_disable_smm_only_flashing(pch);
 
-#if CONFIG_HAVE_SMI_HANDLER
-       pch_lock_smm(dev);
-#endif
+       pch_fixups(pch);
 
-       pch_fixups(dev);
+       return 0;
+}
+
+static int bd82x6x_lpc_early_init(struct udevice *dev)
+{
+       /* Setting up Southbridge. In the northbridge code. */
+       debug("Setting up static southbridge registers\n");
+       dm_pci_write_config32(dev->parent, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
+       dm_pci_write_config32(dev->parent, PMBASE, DEFAULT_PMBASE | 1);
+
+       /* Enable ACPI BAR */
+       dm_pci_write_config8(dev->parent, ACPI_CNTL, 0x80);
+
+       debug("Disabling watchdog reboot\n");
+       setbits_le32(RCB_REG(GCS), 1 >> 5);     /* No reset */
+       outw(1 << 11, DEFAULT_PMBASE | 0x60 | 0x08);    /* halt timer */
+
+       dm_pci_write_config32(dev->parent, GPIO_BASE, DEFAULT_GPIOBASE | 1);
+       dm_pci_write_config32(dev->parent, GPIO_CNTL, 0x10);
 
        return 0;
 }
 
-void lpc_enable(pci_dev_t dev)
+static int bd82x6x_lpc_probe(struct udevice *dev)
 {
-       /* Enable PCH Display Port */
-       writew(0x0010, RCB_REG(DISPBDF));
-       setbits_le32(RCB_REG(FD2), PCH_ENABLE_DBDF);
+       int ret;
+
+       if (!(gd->flags & GD_FLG_RELOC)) {
+               ret = lpc_early_init(dev);
+               if (ret) {
+                       debug("%s: lpc_early_init() failed\n", __func__);
+                       return ret;
+               }
+
+               return bd82x6x_lpc_early_init(dev);
+       }
+
+       return lpc_init_extra(dev);
 }
 
 static const struct udevice_id bd82x6x_lpc_ids[] = {
@@ -568,4 +594,5 @@ U_BOOT_DRIVER(bd82x6x_lpc_drv) = {
        .name           = "lpc",
        .id             = UCLASS_LPC,
        .of_match       = bd82x6x_lpc_ids,
+       .probe          = bd82x6x_lpc_probe,
 };
index fd7db97cbdf1fff172f47cb22e03f42e95fc8555..9654600cf17866708698a3347a9fa6f7720ebec3 100644 (file)
@@ -8,10 +8,13 @@
  */
 
 #include <common.h>
+#include <cpu.h>
+#include <dm.h>
 #include <fdtdec.h>
 #include <malloc.h>
 #include <asm/acpi.h>
 #include <asm/cpu.h>
+#include <asm/cpu_x86.h>
 #include <asm/lapic.h>
 #include <asm/msr.h>
 #include <asm/mtrr.h>
@@ -280,18 +283,13 @@ static void configure_c_states(void)
        msr_write(MSR_PP1_CURRENT_CONFIG, msr);
 }
 
-static int configure_thermal_target(void)
+static int configure_thermal_target(struct udevice *dev)
 {
        int tcc_offset;
        msr_t msr;
-       int node;
 
-       /* Find pointer to CPU configuration */
-       node = fdtdec_next_compatible(gd->fdt_blob, 0,
-                                     COMPAT_INTEL_MODEL_206AX);
-       if (node < 0)
-               return -ENOENT;
-       tcc_offset = fdtdec_get_int(gd->fdt_blob, node, "tcc-offset", 0);
+       tcc_offset = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "tcc-offset",
+                                   0);
 
        /* Set TCC activaiton offset if supported */
        msr = msr_read(MSR_PLATFORM_INFO);
@@ -400,56 +398,7 @@ static void configure_mca(void)
 static unsigned ehci_debug_addr;
 #endif
 
-/*
- * Initialize any extra cores/threads in this package.
- */
-static int intel_cores_init(struct x86_cpu_priv *cpu)
-{
-       struct cpuid_result result;
-       unsigned threads_per_package, threads_per_core, i;
-
-       /* Logical processors (threads) per core */
-       result = cpuid_ext(0xb, 0);
-       threads_per_core = result.ebx & 0xffff;
-
-       /* Logical processors (threads) per package */
-       result = cpuid_ext(0xb, 1);
-       threads_per_package = result.ebx & 0xffff;
-
-       debug("CPU: %u has %u cores, %u threads per core\n",
-             cpu->apic_id, threads_per_package / threads_per_core,
-             threads_per_core);
-
-       for (i = 1; i < threads_per_package; ++i) {
-               struct x86_cpu_priv *new_cpu;
-
-               new_cpu = calloc(1, sizeof(*new_cpu));
-               if (!new_cpu)
-                       return -ENOMEM;
-
-               new_cpu->apic_id = cpu->apic_id + i;
-
-               /* Update APIC ID if no hyperthreading */
-               if (threads_per_core == 1)
-                       new_cpu->apic_id <<= 1;
-
-               debug("CPU: %u has core %u\n", cpu->apic_id, new_cpu->apic_id);
-
-#if 0 && CONFIG_SMP && CONFIG_MAX_CPUS > 1
-               /* TODO(sjg@chromium.org): Start the new cpu */
-               if (!start_cpu(new_cpu)) {
-                       /* Record the error in cpu? */
-                       printk(BIOS_ERR, "CPU %u would not start!\n",
-                              new_cpu->apic_id);
-                       new_cpu->start_err = 1;
-               }
-#endif
-       }
-
-       return 0;
-}
-
-int model_206ax_init(struct x86_cpu_priv *cpu)
+static int model_206ax_init(struct udevice *dev)
 {
        int ret;
 
@@ -463,16 +412,6 @@ int model_206ax_init(struct x86_cpu_priv *cpu)
        set_ehci_debug(0);
 #endif
 
-       /* Setup MTRRs based on physical address size */
-#if 0 /* TODO: Implement this */
-       struct cpuid_result cpuid_regs;
-
-       cpuid_regs = cpuid(0x80000008);
-       x86_setup_fixed_mtrrs();
-       x86_setup_var_mtrrs(cpuid_regs.eax & 0xff, 2);
-       x86_mtrr_check();
-#endif
-
 #if CONFIG_USBDEBUG
        set_ehci_debug(ehci_debug_addr);
 #endif
@@ -491,9 +430,11 @@ int model_206ax_init(struct x86_cpu_priv *cpu)
        configure_misc();
 
        /* Thermal throttle activation offset */
-       ret = configure_thermal_target();
-       if (ret)
+       ret = configure_thermal_target(dev);
+       if (ret) {
+               debug("Cannot set thermal target\n");
                return ret;
+       }
 
        /* Enable Direct Cache Access */
        configure_dca_cap();
@@ -507,8 +448,49 @@ int model_206ax_init(struct x86_cpu_priv *cpu)
        /* Enable Turbo */
        turbo_enable();
 
-       /* Start up extra cores */
-       intel_cores_init(cpu);
+       return 0;
+}
+
+static int model_206ax_get_info(struct udevice *dev, struct cpu_info *info)
+{
+       msr_t msr;
+
+       msr = msr_read(IA32_PERF_CTL);
+       info->cpu_freq = ((msr.lo >> 8) & 0xff) * SANDYBRIDGE_BCLK * 1000000;
+       info->features = 1 << CPU_FEAT_L1_CACHE | 1 << CPU_FEAT_MMU;
+
+       return 0;
+}
+
+static int model_206ax_get_count(struct udevice *dev)
+{
+       return 4;
+}
+
+static int cpu_x86_model_206ax_probe(struct udevice *dev)
+{
+       if (dev->seq == 0)
+               model_206ax_init(dev);
 
        return 0;
 }
+
+static const struct cpu_ops cpu_x86_model_206ax_ops = {
+       .get_desc       = cpu_x86_get_desc,
+       .get_info       = model_206ax_get_info,
+       .get_count      = model_206ax_get_count,
+};
+
+static const struct udevice_id cpu_x86_model_206ax_ids[] = {
+       { .compatible = "intel,core-gen3" },
+       { }
+};
+
+U_BOOT_DRIVER(cpu_x86_model_206ax_drv) = {
+       .name           = "cpu_x86_model_206ax",
+       .id             = UCLASS_CPU,
+       .of_match       = cpu_x86_model_206ax_ids,
+       .bind           = cpu_x86_bind,
+       .probe          = cpu_x86_model_206ax_probe,
+       .ops            = &cpu_x86_model_206ax_ops,
+};
index e3d8c139dfda3a3d6472a00f69b2f990b076537c..a066607a18d3d11a75f50c0848bf7de3738e1d78 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <asm/msr.h>
 #include <asm/acpi.h>
 #include <asm/cpu.h>
 #include <asm/arch/model_206ax.h>
 #include <asm/arch/sandybridge.h>
 
-static int bridge_revision_id = -1;
-
-int bridge_silicon_revision(void)
+int bridge_silicon_revision(struct udevice *dev)
 {
-       if (bridge_revision_id < 0) {
-               struct cpuid_result result;
-               uint8_t stepping, bridge_id;
-               pci_dev_t dev;
-
-               result = cpuid(1);
-               stepping = result.eax & 0xf;
-               dev = PCI_BDF(0, 0, 0);
-               bridge_id = x86_pci_read_config16(dev, PCI_DEVICE_ID) & 0xf0;
-               bridge_revision_id = bridge_id | stepping;
-       }
-
-       return bridge_revision_id;
+       struct cpuid_result result;
+       u16 bridge_id;
+       u8 stepping;
+
+       result = cpuid(1);
+       stepping = result.eax & 0xf;
+       dm_pci_read_config16(dev, PCI_DEVICE_ID, &bridge_id);
+       bridge_id &= 0xf0;
+       return bridge_id | stepping;
 }
 
 /*
@@ -47,15 +42,14 @@ int bridge_silicon_revision(void)
 static const int legacy_hole_base_k = 0xa0000 / 1024;
 static const int legacy_hole_size_k = 384;
 
-static int get_pcie_bar(u32 *base, u32 *len)
+static int get_pcie_bar(struct udevice *dev, u32 *base, u32 *len)
 {
-       pci_dev_t dev = PCI_BDF(0, 0, 0);
        u32 pciexbar_reg;
 
        *base = 0;
        *len = 0;
 
-       pciexbar_reg = x86_pci_read_config32(dev, PCIEXBAR);
+       dm_pci_read_config32(dev, PCIEXBAR, &pciexbar_reg);
 
        if (!(pciexbar_reg & (1 << 0)))
                return 0;
@@ -81,55 +75,55 @@ static int get_pcie_bar(u32 *base, u32 *len)
        return 0;
 }
 
-static void add_fixed_resources(pci_dev_t dev, int index)
+static void add_fixed_resources(struct udevice *dev, int index)
 {
        u32 pcie_config_base, pcie_config_size;
 
-       if (get_pcie_bar(&pcie_config_base, &pcie_config_size)) {
+       if (get_pcie_bar(dev, &pcie_config_base, &pcie_config_size)) {
                debug("Adding PCIe config bar base=0x%08x size=0x%x\n",
                      pcie_config_base, pcie_config_size);
        }
 }
 
-static void northbridge_dmi_init(pci_dev_t dev)
+static void northbridge_dmi_init(struct udevice *dev, int rev)
 {
        /* Clear error status bits */
        writel(0xffffffff, DMIBAR_REG(0x1c4));
        writel(0xffffffff, DMIBAR_REG(0x1d0));
 
        /* Steps prior to DMI ASPM */
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_SNB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_SNB) {
                clrsetbits_le32(DMIBAR_REG(0x250), (1 << 22) | (1 << 20),
                                1 << 21);
        }
 
        setbits_le32(DMIBAR_REG(0x238), 1 << 29);
 
-       if (bridge_silicon_revision() >= SNB_STEP_D0) {
+       if (rev >= SNB_STEP_D0) {
                setbits_le32(DMIBAR_REG(0x1f8), 1 << 16);
-       } else if (bridge_silicon_revision() >= SNB_STEP_D1) {
+       } else if (rev >= SNB_STEP_D1) {
                clrsetbits_le32(DMIBAR_REG(0x1f8), 1 << 26, 1 << 16);
                setbits_le32(DMIBAR_REG(0x1fc), (1 << 12) | (1 << 23));
        }
 
        /* Enable ASPM on SNB link, should happen before PCH link */
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_SNB)
+       if ((rev & BASE_REV_MASK) == BASE_REV_SNB)
                setbits_le32(DMIBAR_REG(0xd04), 1 << 4);
 
        setbits_le32(DMIBAR_REG(0x88), (1 << 1) | (1 << 0));
 }
 
-void northbridge_init(pci_dev_t dev)
+static void northbridge_init(struct udevice *dev, int rev)
 {
        u32 bridge_type;
 
        add_fixed_resources(dev, 6);
-       northbridge_dmi_init(dev);
+       northbridge_dmi_init(dev, rev);
 
        bridge_type = readl(MCHBAR_REG(0x5f10));
        bridge_type &= ~0xff;
 
-       if ((bridge_silicon_revision() & BASE_REV_MASK) == BASE_REV_IVB) {
+       if ((rev & BASE_REV_MASK) == BASE_REV_IVB) {
                /* Enable Power Aware Interrupt Routing - fixed priority */
                clrsetbits_8(MCHBAR_REG(0x5418), 0xf, 0x4);
 
@@ -167,6 +161,78 @@ void northbridge_init(pci_dev_t dev)
        writel(0x00100001, MCHBAR_REG(0x5500));
 }
 
-void northbridge_enable(pci_dev_t dev)
+static void sandybridge_setup_northbridge_bars(struct udevice *dev)
+{
+       /* Set up all hardcoded northbridge BARs */
+       debug("Setting up static registers\n");
+       dm_pci_write_config32(dev, EPBAR, DEFAULT_EPBAR | 1);
+       dm_pci_write_config32(dev, EPBAR + 4, (0LL + DEFAULT_EPBAR) >> 32);
+       dm_pci_write_config32(dev, MCHBAR, DEFAULT_MCHBAR | 1);
+       dm_pci_write_config32(dev, MCHBAR + 4, (0LL + DEFAULT_MCHBAR) >> 32);
+       /* 64MB - busses 0-63 */
+       dm_pci_write_config32(dev, PCIEXBAR, DEFAULT_PCIEXBAR | 5);
+       dm_pci_write_config32(dev, PCIEXBAR + 4,
+                             (0LL + DEFAULT_PCIEXBAR) >> 32);
+       dm_pci_write_config32(dev, DMIBAR, DEFAULT_DMIBAR | 1);
+       dm_pci_write_config32(dev, DMIBAR + 4, (0LL + DEFAULT_DMIBAR) >> 32);
+
+       /* Set C0000-FFFFF to access RAM on both reads and writes */
+       dm_pci_write_config8(dev, PAM0, 0x30);
+       dm_pci_write_config8(dev, PAM1, 0x33);
+       dm_pci_write_config8(dev, PAM2, 0x33);
+       dm_pci_write_config8(dev, PAM3, 0x33);
+       dm_pci_write_config8(dev, PAM4, 0x33);
+       dm_pci_write_config8(dev, PAM5, 0x33);
+       dm_pci_write_config8(dev, PAM6, 0x33);
+}
+
+static int bd82x6x_northbridge_early_init(struct udevice *dev)
+{
+       const int chipset_type = SANDYBRIDGE_MOBILE;
+       u32 capid0_a;
+       u8 reg8;
+
+       /* Device ID Override Enable should be done very early */
+       dm_pci_read_config32(dev, 0xe4, &capid0_a);
+       if (capid0_a & (1 << 10)) {
+               dm_pci_read_config8(dev, 0xf3, &reg8);
+               reg8 &= ~7; /* Clear 2:0 */
+
+               if (chipset_type == SANDYBRIDGE_MOBILE)
+                       reg8 |= 1; /* Set bit 0 */
+
+               dm_pci_write_config8(dev, 0xf3, reg8);
+       }
+
+       sandybridge_setup_northbridge_bars(dev);
+
+       /* Device Enable */
+       dm_pci_write_config32(dev, DEVEN, DEVEN_HOST | DEVEN_IGD);
+
+       return 0;
+}
+
+static int bd82x6x_northbridge_probe(struct udevice *dev)
 {
+       int rev;
+
+       if (!(gd->flags & GD_FLG_RELOC))
+               return bd82x6x_northbridge_early_init(dev);
+
+       rev = bridge_silicon_revision(dev);
+       northbridge_init(dev, rev);
+
+       return 0;
 }
+
+static const struct udevice_id bd82x6x_northbridge_ids[] = {
+       { .compatible = "intel,bd82x6x-northbridge" },
+       { }
+};
+
+U_BOOT_DRIVER(bd82x6x_northbridge_drv) = {
+       .name           = "bd82x6x_northbridge",
+       .id             = UCLASS_NORTHBRIDGE,
+       .of_match       = bd82x6x_northbridge_ids,
+       .probe          = bd82x6x_northbridge_probe,
+};
diff --git a/arch/x86/cpu/ivybridge/pch.c b/arch/x86/cpu/ivybridge/pch.c
deleted file mode 100644 (file)
index bbab646..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * From Coreboot
- * Copyright (C) 2008-2009 coresystems GmbH
- * Copyright (C) 2012 The Chromium OS Authors.
- *
- * SPDX-License-Identifier:    GPL-2.0
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/pci.h>
-#include <asm/arch/pch.h>
-
-static int pch_revision_id = -1;
-static int pch_type = -1;
-
-int pch_silicon_revision(void)
-{
-       pci_dev_t dev;
-
-       dev = PCH_LPC_DEV;
-
-       if (pch_revision_id < 0)
-               pch_revision_id = x86_pci_read_config8(dev, PCI_REVISION_ID);
-       return pch_revision_id;
-}
-
-int pch_silicon_type(void)
-{
-       pci_dev_t dev;
-
-       dev = PCH_LPC_DEV;
-
-       if (pch_type < 0)
-               pch_type = x86_pci_read_config8(dev, PCI_DEVICE_ID + 1);
-       return pch_type;
-}
-
-int pch_silicon_supported(int type, int rev)
-{
-       int cur_type = pch_silicon_type();
-       int cur_rev = pch_silicon_revision();
-
-       switch (type) {
-       case PCH_TYPE_CPT:
-               /* CougarPoint minimum revision */
-               if (cur_type == PCH_TYPE_CPT && cur_rev >= rev)
-                       return 1;
-               /* PantherPoint any revision */
-               if (cur_type == PCH_TYPE_PPT)
-                       return 1;
-               break;
-
-       case PCH_TYPE_PPT:
-               /* PantherPoint minimum revision */
-               if (cur_type == PCH_TYPE_PPT && cur_rev >= rev)
-                       return 1;
-               break;
-       }
-
-       return 0;
-}
-
-#define IOBP_RETRY 1000
-static inline int iobp_poll(void)
-{
-       unsigned try = IOBP_RETRY;
-       u32 data;
-
-       while (try--) {
-               data = readl(RCB_REG(IOBPS));
-               if ((data & 1) == 0)
-                       return 1;
-               udelay(10);
-       }
-
-       printf("IOBP timeout\n");
-       return 0;
-}
-
-void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
-{
-       u32 data;
-
-       /* Set the address */
-       writel(address, RCB_REG(IOBPIRI));
-
-       /* READ OPCODE */
-       if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
-               writel(IOBPS_RW_BX, RCB_REG(IOBPS));
-       else
-               writel(IOBPS_READ_AX, RCB_REG(IOBPS));
-       if (!iobp_poll())
-               return;
-
-       /* Read IOBP data */
-       data = readl(RCB_REG(IOBPD));
-       if (!iobp_poll())
-               return;
-
-       /* Check for successful transaction */
-       if ((readl(RCB_REG(IOBPS)) & 0x6) != 0) {
-               printf("IOBP read 0x%08x failed\n", address);
-               return;
-       }
-
-       /* Update the data */
-       data &= andvalue;
-       data |= orvalue;
-
-       /* WRITE OPCODE */
-       if (pch_silicon_supported(PCH_TYPE_CPT, PCH_STEP_B0))
-               writel(IOBPS_RW_BX, RCB_REG(IOBPS));
-       else
-               writel(IOBPS_WRITE_AX, RCB_REG(IOBPS));
-       if (!iobp_poll())
-               return;
-
-       /* Write IOBP data */
-       writel(data, RCB_REG(IOBPD));
-       if (!iobp_poll())
-               return;
-}
diff --git a/arch/x86/cpu/ivybridge/pci.c b/arch/x86/cpu/ivybridge/pci.c
deleted file mode 100644 (file)
index 5e90f30..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2011 The Chromium OS Authors.
- * (C) Copyright 2008,2009
- * Graeme Russ, <graeme.russ@gmail.com>
- *
- * (C) Copyright 2002
- * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <dm.h>
-#include <pci.h>
-#include <asm/pci.h>
-#include <asm/post.h>
-#include <asm/arch/bd82x6x.h>
-#include <asm/arch/pch.h>
-
-static int pci_ivybridge_probe(struct udevice *bus)
-{
-       struct pci_controller *hose = dev_get_uclass_priv(bus);
-       pci_dev_t dev;
-       u16 reg16;
-
-       if (!(gd->flags & GD_FLG_RELOC))
-               return 0;
-       post_code(0x50);
-       bd82x6x_init();
-       post_code(0x51);
-
-       reg16 = 0xff;
-       dev = PCH_DEV;
-       reg16 = x86_pci_read_config16(dev, PCI_COMMAND);
-       reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
-       x86_pci_write_config16(dev, PCI_COMMAND, reg16);
-
-       /*
-       * Clear non-reserved bits in status register.
-       */
-       pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff);
-       pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
-       pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
-
-       pci_write_bar32(hose, dev, 0, 0xf0000000);
-       post_code(0x52);
-
-       return 0;
-}
-
-static const struct dm_pci_ops pci_ivybridge_ops = {
-       .read_config    = pci_x86_read_config,
-       .write_config   = pci_x86_write_config,
-};
-
-static const struct udevice_id pci_ivybridge_ids[] = {
-       { .compatible = "intel,pci-ivybridge" },
-       { }
-};
-
-U_BOOT_DRIVER(pci_ivybridge_drv) = {
-       .name           = "pci_ivybridge",
-       .id             = UCLASS_PCI,
-       .of_match       = pci_ivybridge_ids,
-       .ops            = &pci_ivybridge_ops,
-       .probe          = pci_ivybridge_probe,
-};
index 44938709c9bccc086a05ce376ad44d9a6c1d725a..c78322aef99b9a5a5bdf4fa5fd7c7a3fbd99911e 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/cpu.h>
 #include <asm/pci.h>
 #include <asm/arch/pch.h>
+#include <asm/arch/sandybridge.h>
 
 static void report_cpu_info(void)
 {
@@ -63,27 +64,27 @@ static struct {
        {0x1E5F, "NM70"},
 };
 
-static void report_pch_info(void)
+static void report_pch_info(struct udevice *dev)
 {
        const char *pch_type = "Unknown";
        int i;
        u16 dev_id;
        uint8_t rev_id;
 
-       dev_id = x86_pci_read_config16(PCH_LPC_DEV, 2);
+       dm_pci_read_config16(dev, 2, &dev_id);
        for (i = 0; i < ARRAY_SIZE(pch_table); i++) {
                if (pch_table[i].dev_id == dev_id) {
                        pch_type = pch_table[i].dev_name;
                        break;
                }
        }
-       rev_id = x86_pci_read_config8(PCH_LPC_DEV, 8);
+       dm_pci_read_config8(dev, 8, &rev_id);
        debug("PCH type: %s, device id: %x, rev id %x\n", pch_type, dev_id,
              rev_id);
 }
 
-void report_platform_info(void)
+void report_platform_info(struct udevice *dev)
 {
        report_cpu_info();
-       report_pch_info();
+       report_pch_info(dev);
 }
index e7bf03c1dc7913971b160b6d5f5d14700caf4ded..a59d9edce5f57edd2c4167404cc27247c68b1304 100644 (file)
@@ -6,48 +6,56 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <fdtdec.h>
 #include <asm/io.h>
 #include <asm/pci.h>
 #include <asm/arch/pch.h>
 #include <asm/arch/bd82x6x.h>
 
-static inline u32 sir_read(pci_dev_t dev, int idx)
+DECLARE_GLOBAL_DATA_PTR;
+
+static inline u32 sir_read(struct udevice *dev, int idx)
 {
-       x86_pci_write_config32(dev, SATA_SIRI, idx);
-       return x86_pci_read_config32(dev, SATA_SIRD);
+       u32 data;
+
+       dm_pci_write_config32(dev, SATA_SIRI, idx);
+       dm_pci_read_config32(dev, SATA_SIRD, &data);
+
+       return data;
 }
 
-static inline void sir_write(pci_dev_t dev, int idx, u32 value)
+static inline void sir_write(struct udevice *dev, int idx, u32 value)
 {
-       x86_pci_write_config32(dev, SATA_SIRI, idx);
-       x86_pci_write_config32(dev, SATA_SIRD, value);
+       dm_pci_write_config32(dev, SATA_SIRI, idx);
+       dm_pci_write_config32(dev, SATA_SIRD, value);
 }
 
-static void common_sata_init(pci_dev_t dev, unsigned int port_map)
+static void common_sata_init(struct udevice *dev, unsigned int port_map)
 {
        u32 reg32;
        u16 reg16;
 
        /* Set IDE I/O Configuration */
        reg32 = SIG_MODE_PRI_NORMAL | FAST_PCB1 | FAST_PCB0 | PCB1 | PCB0;
-       x86_pci_write_config32(dev, IDE_CONFIG, reg32);
+       dm_pci_write_config32(dev, IDE_CONFIG, reg32);
 
        /* Port enable */
-       reg16 = x86_pci_read_config16(dev, 0x92);
+       dm_pci_read_config16(dev, 0x92, &reg16);
        reg16 &= ~0x3f;
        reg16 |= port_map;
-       x86_pci_write_config16(dev, 0x92, reg16);
+       dm_pci_write_config16(dev, 0x92, reg16);
 
        /* SATA Initialization register */
        port_map &= 0xff;
-       x86_pci_write_config32(dev, 0x94, ((port_map ^ 0x3f) << 24) | 0x183);
+       dm_pci_write_config32(dev, 0x94, ((port_map ^ 0x3f) << 24) | 0x183);
 }
 
-void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node)
+static void bd82x6x_sata_init(struct udevice *dev, struct udevice *pch)
 {
        unsigned int port_map, speed_support, port_tx;
-       struct pci_controller *hose = pci_bus_to_hose(0);
+       const void *blob = gd->fdt_blob;
+       int node = dev->of_offset;
        const char *mode;
        u32 reg32;
        u16 reg16;
@@ -59,33 +67,27 @@ void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node)
        speed_support = fdtdec_get_int(blob, node,
                                       "sata_interface_speed_support", 0);
 
-       /* Enable BARs */
-       x86_pci_write_config16(dev, PCI_COMMAND, 0x0007);
-
        mode = fdt_getprop(blob, node, "intel,sata-mode", NULL);
        if (!mode || !strcmp(mode, "ahci")) {
                u32 abar;
 
                debug("SATA: Controller in AHCI mode\n");
 
-               /* Set Interrupt Line, Interrupt Pin is set by D31IP.PIP */
-               x86_pci_write_config8(dev, INTR_LN, 0x0a);
-
                /* Set timings */
-               x86_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
                                IDE_ISP_3_CLOCKS | IDE_RCT_1_CLOCKS |
                                IDE_PPE0 | IDE_IE0 | IDE_TIME0);
-               x86_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
                                IDE_ISP_5_CLOCKS | IDE_RCT_4_CLOCKS);
 
                /* Sync DMA */
-               x86_pci_write_config16(dev, IDE_SDMA_CNT, IDE_PSDE0);
-               x86_pci_write_config16(dev, IDE_SDMA_TIM, 0x0001);
+               dm_pci_write_config16(dev, IDE_SDMA_CNT, IDE_PSDE0);
+               dm_pci_write_config16(dev, IDE_SDMA_TIM, 0x0001);
 
                common_sata_init(dev, 0x8000 | port_map);
 
                /* Initialize AHCI memory-mapped space */
-               abar = pci_read_bar32(hose, dev, 5);
+               abar = dm_pci_read_bar32(dev, 5);
                debug("ABAR: %08X\n", abar);
                /* CAP (HBA Capabilities) : enable power management */
                reg32 = readl(abar + 0x00);
@@ -113,59 +115,54 @@ void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node)
                debug("SATA: Controller in combined mode\n");
 
                /* No AHCI: clear AHCI base */
-               pci_write_bar32(hose, dev, 5, 0x00000000);
+               dm_pci_write_bar32(dev, 5, 0x00000000);
                /* And without AHCI BAR no memory decoding */
-               reg16 = x86_pci_read_config16(dev, PCI_COMMAND);
+               dm_pci_read_config16(dev, PCI_COMMAND, &reg16);
                reg16 &= ~PCI_COMMAND_MEMORY;
-               x86_pci_write_config16(dev, PCI_COMMAND, reg16);
+               dm_pci_write_config16(dev, PCI_COMMAND, reg16);
 
-               x86_pci_write_config8(dev, 0x09, 0x80);
+               dm_pci_write_config8(dev, 0x09, 0x80);
 
                /* Set timings */
-               x86_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
                                IDE_ISP_5_CLOCKS | IDE_RCT_4_CLOCKS);
-               x86_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
                                IDE_ISP_3_CLOCKS | IDE_RCT_1_CLOCKS |
                                IDE_PPE0 | IDE_IE0 | IDE_TIME0);
 
                /* Sync DMA */
-               x86_pci_write_config16(dev, IDE_SDMA_CNT, IDE_SSDE0);
-               x86_pci_write_config16(dev, IDE_SDMA_TIM, 0x0200);
+               dm_pci_write_config16(dev, IDE_SDMA_CNT, IDE_SSDE0);
+               dm_pci_write_config16(dev, IDE_SDMA_TIM, 0x0200);
 
                common_sata_init(dev, port_map);
        } else {
                debug("SATA: Controller in plain-ide mode\n");
 
                /* No AHCI: clear AHCI base */
-               pci_write_bar32(hose, dev, 5, 0x00000000);
+               dm_pci_write_bar32(dev, 5, 0x00000000);
 
                /* And without AHCI BAR no memory decoding */
-               reg16 = x86_pci_read_config16(dev, PCI_COMMAND);
+               dm_pci_read_config16(dev, PCI_COMMAND, &reg16);
                reg16 &= ~PCI_COMMAND_MEMORY;
-               x86_pci_write_config16(dev, PCI_COMMAND, reg16);
+               dm_pci_write_config16(dev, PCI_COMMAND, reg16);
 
                /*
                 * Native mode capable on both primary and secondary (0xa)
                 * OR'ed with enabled (0x50) = 0xf
                 */
-               x86_pci_write_config8(dev, 0x09, 0x8f);
-
-               /* Set Interrupt Line */
-               /* Interrupt Pin is set by D31IP.PIP */
-               x86_pci_write_config8(dev, INTR_LN, 0xff);
+               dm_pci_write_config8(dev, 0x09, 0x8f);
 
                /* Set timings */
-               x86_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_PRI, IDE_DECODE_ENABLE |
                                IDE_ISP_3_CLOCKS | IDE_RCT_1_CLOCKS |
                                IDE_PPE0 | IDE_IE0 | IDE_TIME0);
-               x86_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
+               dm_pci_write_config16(dev, IDE_TIM_SEC, IDE_DECODE_ENABLE |
                                IDE_SITRE | IDE_ISP_3_CLOCKS |
                                IDE_RCT_1_CLOCKS | IDE_IE0 | IDE_TIME0);
 
                /* Sync DMA */
-               x86_pci_write_config16(dev, IDE_SDMA_CNT,
-                                      IDE_SSDE0 | IDE_PSDE0);
-               x86_pci_write_config16(dev, IDE_SDMA_TIM, 0x0201);
+               dm_pci_write_config16(dev, IDE_SDMA_CNT, IDE_SSDE0 | IDE_PSDE0);
+               dm_pci_write_config16(dev, IDE_SDMA_TIM, 0x0201);
 
                common_sata_init(dev, port_map);
        }
@@ -173,11 +170,11 @@ void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node)
        /* Set Gen3 Transmitter settings if needed */
        port_tx = fdtdec_get_int(blob, node, "intel,sata-port0-gen3-tx", 0);
        if (port_tx)
-               pch_iobp_update(SATA_IOBP_SP0G3IR, 0, port_tx);
+               pch_iobp_update(pch, SATA_IOBP_SP0G3IR, 0, port_tx);
 
        port_tx = fdtdec_get_int(blob, node, "intel,sata-port1-gen3-tx", 0);
        if (port_tx)
-               pch_iobp_update(SATA_IOBP_SP1G3IR, 0, port_tx);
+               pch_iobp_update(pch, SATA_IOBP_SP1G3IR, 0, port_tx);
 
        /* Additional Programming Requirements */
        sir_write(dev, 0x04, 0x00001600);
@@ -202,12 +199,14 @@ void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node)
        sir_write(dev, 0xc8, 0x0c0c0c0c);
        sir_write(dev, 0xd4, 0x10000000);
 
-       pch_iobp_update(0xea004001, 0x3fffffff, 0xc0000000);
-       pch_iobp_update(0xea00408a, 0xfffffcff, 0x00000100);
+       pch_iobp_update(pch, 0xea004001, 0x3fffffff, 0xc0000000);
+       pch_iobp_update(pch, 0xea00408a, 0xfffffcff, 0x00000100);
 }
 
-void bd82x6x_sata_enable(pci_dev_t dev, const void *blob, int node)
+static void bd82x6x_sata_enable(struct udevice *dev)
 {
+       const void *blob = gd->fdt_blob;
+       int node = dev->of_offset;
        unsigned port_map;
        const char *mode;
        u16 map = 0;
@@ -222,5 +221,36 @@ void bd82x6x_sata_enable(pci_dev_t dev, const void *blob, int node)
        port_map = fdtdec_get_int(blob, node, "intel,sata-port-map", 0);
 
        map |= (port_map ^ 0x3f) << 8;
-       x86_pci_write_config16(dev, 0x90, map);
+       dm_pci_write_config16(dev, 0x90, map);
 }
+
+static int bd82x6x_sata_probe(struct udevice *dev)
+{
+       struct udevice *pch;
+       int ret;
+
+       ret = uclass_first_device(UCLASS_PCH, &pch);
+       if (ret)
+               return ret;
+       if (!pch)
+               return -ENODEV;
+
+       if (!(gd->flags & GD_FLG_RELOC))
+               bd82x6x_sata_enable(dev);
+       else
+               bd82x6x_sata_init(dev, pch);
+
+       return 0;
+}
+
+static const struct udevice_id bd82x6x_ahci_ids[] = {
+       { .compatible = "intel,pantherpoint-ahci" },
+       { }
+};
+
+U_BOOT_DRIVER(ahci_ivybridge_drv) = {
+       .name           = "ahci_ivybridge",
+       .id             = UCLASS_DISK,
+       .of_match       = bd82x6x_ahci_ids,
+       .probe          = bd82x6x_sata_probe,
+};
index 4372a5caf2d23e8942a078e580cef4014d37e530..e23c422cd0ada61ff55189c6bc6390f0afa32226 100644 (file)
@@ -18,6 +18,8 @@
 #include <rtc.h>
 #include <spi.h>
 #include <spi_flash.h>
+#include <syscon.h>
+#include <asm/cpu.h>
 #include <asm/processor.h>
 #include <asm/gpio.h>
 #include <asm/global_data.h>
@@ -283,22 +285,24 @@ static int recovery_mode_enabled(void)
 /**
  * Find the PEI executable in the ROM and execute it.
  *
- * @param pei_data: configuration data for UEFI PEI reference code
+ * @dev: Northbridge device
+ * @pei_data: configuration data for UEFI PEI reference code
  */
-int sdram_initialise(struct pei_data *pei_data)
+int sdram_initialise(struct udevice *dev, struct udevice *me_dev,
+                    struct pei_data *pei_data)
 {
        unsigned version;
        const char *data;
        uint16_t done;
        int ret;
 
-       report_platform_info();
+       report_platform_info(dev);
 
        /* Wait for ME to be ready */
-       ret = intel_early_me_init();
+       ret = intel_early_me_init(me_dev);
        if (ret)
                return ret;
-       ret = intel_early_me_uma_size();
+       ret = intel_early_me_uma_size(me_dev);
        if (ret < 0)
                return ret;
 
@@ -374,12 +378,12 @@ int sdram_initialise(struct pei_data *pei_data)
         * Send ME init done for SandyBridge here.  This is done inside the
         * SystemAgent binary on IvyBridge
         */
-       done = x86_pci_read_config32(PCH_DEV, PCI_DEVICE_ID);
+       dm_pci_read_config16(dev, PCI_DEVICE_ID, &done);
        done &= BASE_REV_MASK;
        if (BASE_REV_SNB == done)
-               intel_early_me_init_done(ME_INIT_STATUS_SUCCESS);
+               intel_early_me_init_done(dev, me_dev, ME_INIT_STATUS_SUCCESS);
        else
-               intel_early_me_status();
+               intel_early_me_status(me_dev);
 
        post_system_agent_init(pei_data);
        report_memory_config();
@@ -495,8 +499,10 @@ static int add_memory_area(struct memory_info *info,
  *
  * This is a bit complicated since on x86 there are system memory holes all
  * over the place. We create a list of available memory blocks
+ *
+ * @dev:       Northbridge device
  */
-static int sdram_find(pci_dev_t dev)
+static int sdram_find(struct udevice *dev)
 {
        struct memory_info *info = &gd->arch.meminfo;
        uint32_t tseg_base, uma_size, tolud;
@@ -505,6 +511,7 @@ static int sdram_find(pci_dev_t dev)
        uint64_t uma_memory_size;
        unsigned long long tomk;
        uint16_t ggc;
+       u32 val;
 
        /* Total Memory 2GB example:
         *
@@ -533,24 +540,27 @@ static int sdram_find(pci_dev_t dev)
         */
 
        /* Top of Upper Usable DRAM, including remap */
-       touud = x86_pci_read_config32(dev, TOUUD+4);
-       touud <<= 32;
-       touud |= x86_pci_read_config32(dev, TOUUD);
+       dm_pci_read_config32(dev, TOUUD + 4, &val);
+       touud = (uint64_t)val << 32;
+       dm_pci_read_config32(dev, TOUUD, &val);
+       touud |= val;
 
        /* Top of Lower Usable DRAM */
-       tolud = x86_pci_read_config32(dev, TOLUD);
+       dm_pci_read_config32(dev, TOLUD, &tolud);
 
        /* Top of Memory - does not account for any UMA */
-       tom = x86_pci_read_config32(dev, 0xa4);
-       tom <<= 32;
-       tom |= x86_pci_read_config32(dev, 0xa0);
+       dm_pci_read_config32(dev, 0xa4, &val);
+       tom = (uint64_t)val << 32;
+       dm_pci_read_config32(dev, 0xa0, &val);
+       tom |= val;
 
        debug("TOUUD %llx TOLUD %08x TOM %llx\n", touud, tolud, tom);
 
        /* ME UMA needs excluding if total memory <4GB */
-       me_base = x86_pci_read_config32(dev, 0x74);
-       me_base <<= 32;
-       me_base |= x86_pci_read_config32(dev, 0x70);
+       dm_pci_read_config32(dev, 0x74, &val);
+       me_base = (uint64_t)val << 32;
+       dm_pci_read_config32(dev, 0x70, &val);
+       me_base |= val;
 
        debug("MEBASE %llx\n", me_base);
 
@@ -568,7 +578,7 @@ static int sdram_find(pci_dev_t dev)
        }
 
        /* Graphics memory comes next */
-       ggc = x86_pci_read_config16(dev, GGC);
+       dm_pci_read_config16(dev, GGC, &ggc);
        if (!(ggc & 2)) {
                debug("IGD decoded, subtracting ");
 
@@ -588,7 +598,7 @@ static int sdram_find(pci_dev_t dev)
        }
 
        /* Calculate TSEG size from its base which must be below GTT */
-       tseg_base = x86_pci_read_config32(dev, 0xb8);
+       dm_pci_read_config32(dev, 0xb8, &tseg_base);
        uma_size = (uma_memory_base - tseg_base) >> 10;
        tomk -= uma_size;
        uma_memory_base = tomk * 1024ULL;
@@ -723,15 +733,23 @@ int dram_init(void)
                        { 0, 4, 0x0000 }, /* P13= Empty */
                },
        };
-       pci_dev_t dev = PCI_BDF(0, 0, 0);
+       struct udevice *dev, *me_dev;
        int ret;
 
+       ret = uclass_first_device(UCLASS_NORTHBRIDGE, &dev);
+       if (ret)
+               return ret;
+       if (!dev)
+               return -ENODEV;
+       ret = syscon_get_by_driver_data(X86_SYSCON_ME, &me_dev);
+       if (ret)
+               return ret;
        debug("Boot mode %d\n", gd->arch.pei_boot_mode);
        debug("mrc_input %p\n", pei_data.mrc_input);
        pei_data.boot_mode = gd->arch.pei_boot_mode;
        ret = copy_spd(&pei_data);
        if (!ret)
-               ret = sdram_initialise(&pei_data);
+               ret = sdram_initialise(dev, me_dev, &pei_data);
        if (ret)
                return ret;
 
diff --git a/arch/x86/cpu/ivybridge/usb_ehci.c b/arch/x86/cpu/ivybridge/usb_ehci.c
deleted file mode 100644 (file)
index da11aee..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * From Coreboot
- * Copyright (C) 2008-2009 coresystems GmbH
- *
- * SPDX-License-Identifier:    GPL-2.0
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/pci.h>
-#include <asm/arch/pch.h>
-
-void bd82x6x_usb_ehci_init(pci_dev_t dev)
-{
-       u32 reg32;
-
-       /* Disable Wake on Disconnect in RMH */
-       reg32 = readl(RCB_REG(0x35b0));
-       reg32 |= 0x22;
-       writel(reg32, RCB_REG(0x35b0));
-
-       debug("EHCI: Setting up controller.. ");
-       reg32 = x86_pci_read_config32(dev, PCI_COMMAND);
-       reg32 |= PCI_COMMAND_MASTER;
-       /* reg32 |= PCI_COMMAND_SERR; */
-       x86_pci_write_config32(dev, PCI_COMMAND, reg32);
-
-       debug("done.\n");
-}
diff --git a/arch/x86/cpu/ivybridge/usb_xhci.c b/arch/x86/cpu/ivybridge/usb_xhci.c
deleted file mode 100644 (file)
index f77b804..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * From Coreboot
- * Copyright (C) 2008-2009 coresystems GmbH
- *
- * SPDX-License-Identifier:    GPL-2.0
- */
-
-#include <common.h>
-#include <asm/pci.h>
-#include <asm/arch/pch.h>
-
-void bd82x6x_usb_xhci_init(pci_dev_t dev)
-{
-       u32 reg32;
-
-       debug("XHCI: Setting up controller.. ");
-
-       /* lock overcurrent map */
-       reg32 = x86_pci_read_config32(dev, 0x44);
-       reg32 |= 1;
-       x86_pci_write_config32(dev, 0x44, reg32);
-
-       /* Enable clock gating */
-       reg32 = x86_pci_read_config32(dev, 0x40);
-       reg32 &= ~((1 << 20) | (1 << 21));
-       reg32 |= (1 << 19) | (1 << 18) | (1 << 17);
-       reg32 |= (1 << 10) | (1 << 9) | (1 << 8);
-       reg32 |= (1 << 31); /* lock */
-       x86_pci_write_config32(dev, 0x40, reg32);
-
-       debug("done.\n");
-}
index 46111c9cf058d82d35bf231c26d832f8d101bd15..5a7b92944a21501edd10b99824cb2eab337e0da1 100644 (file)
@@ -96,11 +96,6 @@ int arch_early_init_r(void)
        return 0;
 }
 
-int arch_misc_init(void)
-{
-       return pirq_init();
-}
-
 #ifdef CONFIG_GENERATE_MP_TABLE
 int mp_determine_pci_dstirq(int bus, int dev, int func, int pirq)
 {
index 8f1d018fb60841d700939a42d5f46298be443fa9..6d670d75c102443d1062dd01609bc667d1587f82 100644 (file)
@@ -4,5 +4,5 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y += car.o dram.o msg_port.o quark.o
+obj-y += car.o dram.o irq.o msg_port.o quark.o
 obj-y += mrc.o mrc_util.o hte.o smc.o
diff --git a/arch/x86/cpu/quark/irq.c b/arch/x86/cpu/quark/irq.c
new file mode 100644 (file)
index 0000000..1f8f909
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ * Copyright (C) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/irq.h>
+#include <asm/arch/device.h>
+#include <asm/arch/quark.h>
+
+int quark_irq_router_probe(struct udevice *dev)
+{
+       struct quark_rcba *rcba;
+       u32 base;
+
+       qrk_pci_read_config_dword(QUARK_LEGACY_BRIDGE, LB_RCBA, &base);
+       base &= ~MEM_BAR_EN;
+       rcba = (struct quark_rcba *)base;
+
+       /*
+        * Route Quark PCI device interrupt pin to PIRQ
+        *
+        * Route device#23's INTA/B/C/D to PIRQA/B/C/D
+        * Route device#20,21's INTA/B/C/D to PIRQE/F/G/H
+        */
+       writew(PIRQC, &rcba->rmu_ir);
+       writew(PIRQA | (PIRQB << 4) | (PIRQC << 8) | (PIRQD << 12),
+              &rcba->d23_ir);
+       writew(PIRQD, &rcba->core_ir);
+       writew(PIRQE | (PIRQF << 4) | (PIRQG << 8) | (PIRQH << 12),
+              &rcba->d20d21_ir);
+
+       return irq_router_common_init(dev);
+}
+
+static const struct udevice_id quark_irq_router_ids[] = {
+       { .compatible = "intel,quark-irq-router" },
+       { }
+};
+
+U_BOOT_DRIVER(quark_irq_router_drv) = {
+       .name           = "quark_intel_irq",
+       .id             = UCLASS_IRQ,
+       .of_match       = quark_irq_router_ids,
+       .probe          = quark_irq_router_probe,
+};
index 72c681dceabaece9c81d1983199d31cdcf9fca1d..6e20930a4d21940c1311d32d12a68c1cf3a236a1 100644 (file)
@@ -7,12 +7,10 @@
 #include <common.h>
 #include <mmc.h>
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/mrccache.h>
 #include <asm/mtrr.h>
 #include <asm/pci.h>
 #include <asm/post.h>
-#include <asm/processor.h>
 #include <asm/arch/device.h>
 #include <asm/arch/msg_port.h>
 #include <asm/arch/quark.h>
@@ -346,29 +344,6 @@ int cpu_mmc_init(bd_t *bis)
        return pci_mmc_init("Quark SDHCI", mmc_supported);
 }
 
-void cpu_irq_init(void)
-{
-       struct quark_rcba *rcba;
-       u32 base;
-
-       qrk_pci_read_config_dword(QUARK_LEGACY_BRIDGE, LB_RCBA, &base);
-       base &= ~MEM_BAR_EN;
-       rcba = (struct quark_rcba *)base;
-
-       /*
-        * Route Quark PCI device interrupt pin to PIRQ
-        *
-        * Route device#23's INTA/B/C/D to PIRQA/B/C/D
-        * Route device#20,21's INTA/B/C/D to PIRQE/F/G/H
-        */
-       writew(PIRQC, &rcba->rmu_ir);
-       writew(PIRQA | (PIRQB << 4) | (PIRQC << 8) | (PIRQD << 12),
-              &rcba->d23_ir);
-       writew(PIRQD, &rcba->core_ir);
-       writew(PIRQE | (PIRQF << 4) | (PIRQG << 8) | (PIRQH << 12),
-              &rcba->d20d21_ir);
-}
-
 int arch_misc_init(void)
 {
 #ifdef CONFIG_ENABLE_MRC_CACHE
@@ -380,7 +355,7 @@ int arch_misc_init(void)
        mrccache_save();
 #endif
 
-       return pirq_init();
+       return 0;
 }
 
 void board_final_cleanup(void)
index 660f9678bd303573ef506986f913382c4377e002..af3ffad385222ffb8ecafaca28d71d3b13eaba0e 100644 (file)
@@ -4,5 +4,5 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y += fsp_configs.o
+obj-y += fsp_configs.o irq.o
 obj-y += tnc.o topcliff.o
diff --git a/arch/x86/cpu/queensbay/irq.c b/arch/x86/cpu/queensbay/irq.c
new file mode 100644 (file)
index 0000000..44369f7
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
+ * Copyright (C) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/pci.h>
+#include <asm/arch/device.h>
+#include <asm/arch/tnc.h>
+
+int queensbay_irq_router_probe(struct udevice *dev)
+{
+       struct tnc_rcba *rcba;
+       u32 base;
+
+       base = x86_pci_read_config32(TNC_LPC, LPC_RCBA);
+       base &= ~MEM_BAR_EN;
+       rcba = (struct tnc_rcba *)base;
+
+       /* Make sure all internal PCI devices are using INTA */
+       writel(INTA, &rcba->d02ip);
+       writel(INTA, &rcba->d03ip);
+       writel(INTA, &rcba->d27ip);
+       writel(INTA, &rcba->d31ip);
+       writel(INTA, &rcba->d23ip);
+       writel(INTA, &rcba->d24ip);
+       writel(INTA, &rcba->d25ip);
+       writel(INTA, &rcba->d26ip);
+
+       /*
+        * Route TunnelCreek PCI device interrupt pin to PIRQ
+        *
+        * Since PCIe downstream ports received INTx are routed to PIRQ
+        * A/B/C/D directly and not configurable, we have to route PCIe
+        * root ports' INTx to PIRQ A/B/C/D as well. For other devices
+        * on TunneCreek, route them to PIRQ E/F/G/H.
+        */
+       writew(PIRQE, &rcba->d02ir);
+       writew(PIRQF, &rcba->d03ir);
+       writew(PIRQG, &rcba->d27ir);
+       writew(PIRQH, &rcba->d31ir);
+       writew(PIRQA, &rcba->d23ir);
+       writew(PIRQB, &rcba->d24ir);
+       writew(PIRQC, &rcba->d25ir);
+       writew(PIRQD, &rcba->d26ir);
+
+       return irq_router_common_init(dev);
+}
+
+static const struct udevice_id queensbay_irq_router_ids[] = {
+       { .compatible = "intel,queensbay-irq-router" },
+       { }
+};
+
+U_BOOT_DRIVER(queensbay_irq_router_drv) = {
+       .name           = "queensbay_intel_irq",
+       .id             = UCLASS_IRQ,
+       .of_match       = queensbay_irq_router_ids,
+       .probe          = queensbay_irq_router_probe,
+};
index fb81919c212fa2d678d2b17a4d3a6f94ce7264b8..75f7adb74cd622603c595cd228930a09a45e01f8 100644 (file)
@@ -69,46 +69,9 @@ int arch_early_init_r(void)
        return 0;
 }
 
-void cpu_irq_init(void)
-{
-       struct tnc_rcba *rcba;
-       u32 base;
-
-       base = x86_pci_read_config32(TNC_LPC, LPC_RCBA);
-       base &= ~MEM_BAR_EN;
-       rcba = (struct tnc_rcba *)base;
-
-       /* Make sure all internal PCI devices are using INTA */
-       writel(INTA, &rcba->d02ip);
-       writel(INTA, &rcba->d03ip);
-       writel(INTA, &rcba->d27ip);
-       writel(INTA, &rcba->d31ip);
-       writel(INTA, &rcba->d23ip);
-       writel(INTA, &rcba->d24ip);
-       writel(INTA, &rcba->d25ip);
-       writel(INTA, &rcba->d26ip);
-
-       /*
-        * Route TunnelCreek PCI device interrupt pin to PIRQ
-        *
-        * Since PCIe downstream ports received INTx are routed to PIRQ
-        * A/B/C/D directly and not configurable, we have to route PCIe
-        * root ports' INTx to PIRQ A/B/C/D as well. For other devices
-        * on TunneCreek, route them to PIRQ E/F/G/H.
-        */
-       writew(PIRQE, &rcba->d02ir);
-       writew(PIRQF, &rcba->d03ir);
-       writew(PIRQG, &rcba->d27ir);
-       writew(PIRQH, &rcba->d31ir);
-       writew(PIRQA, &rcba->d23ir);
-       writew(PIRQB, &rcba->d24ir);
-       writew(PIRQC, &rcba->d25ir);
-       writew(PIRQD, &rcba->d26ir);
-}
-
 int arch_misc_init(void)
 {
        unprotect_spi_flash();
 
-       return pirq_init();
+       return 0;
 }
index d3380dee6ccc4cd9244bd216a1c9b70baf4cb42a..9bf707bf0e84bdd43c05d7f97d8fbafddcd2b5d7 100644 (file)
                };
        };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       reg = <0>;
-                       compatible = "winbond,w25q64dw", "spi-flash";
-                       memory-map = <0xff800000 0x00800000>;
-                       rw-mrc-cache {
-                               label = "rw-mrc-cache";
-                               reg = <0x006e0000 0x00010000>;
-                       };
-               };
-       };
-
        gpioa {
                compatible = "intel,ich6-gpio";
                u-boot,dm-pre-reloc;
                          0x42000000 0x0 0xc0000000 0xc0000000 0 0x20000000
                          0x01000000 0x0 0x2000 0x2000 0 0xe000>;
 
-               irq-router@1f,0 {
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "ibase";
-                       intel,ibase-offset = <0x50>;
-                       intel,pirq-link = <8 8>;
-                       intel,pirq-mask = <0xdee0>;
-                       intel,pirq-routing = <
-                               /* BayTrail PCI devices */
-                               PCI_BDF(0, 2, 0) INTA PIRQA
-                               PCI_BDF(0, 3, 0) INTA PIRQA
-                               PCI_BDF(0, 16, 0) INTA PIRQA
-                               PCI_BDF(0, 17, 0) INTA PIRQA
-                               PCI_BDF(0, 18, 0) INTA PIRQA
-                               PCI_BDF(0, 19, 0) INTA PIRQA
-                               PCI_BDF(0, 20, 0) INTA PIRQA
-                               PCI_BDF(0, 21, 0) INTA PIRQA
-                               PCI_BDF(0, 22, 0) INTA PIRQA
-                               PCI_BDF(0, 23, 0) INTA PIRQA
-                               PCI_BDF(0, 24, 0) INTA PIRQA
-                               PCI_BDF(0, 24, 1) INTC PIRQC
-                               PCI_BDF(0, 24, 2) INTD PIRQD
-                               PCI_BDF(0, 24, 3) INTB PIRQB
-                               PCI_BDF(0, 24, 4) INTA PIRQA
-                               PCI_BDF(0, 24, 5) INTC PIRQC
-                               PCI_BDF(0, 24, 6) INTD PIRQD
-                               PCI_BDF(0, 24, 7) INTB PIRQB
-                               PCI_BDF(0, 26, 0) INTA PIRQA
-                               PCI_BDF(0, 27, 0) INTA PIRQA
-                               PCI_BDF(0, 28, 0) INTA PIRQA
-                               PCI_BDF(0, 28, 1) INTB PIRQB
-                               PCI_BDF(0, 28, 2) INTC PIRQC
-                               PCI_BDF(0, 28, 3) INTD PIRQD
-                               PCI_BDF(0, 29, 0) INTA PIRQA
-                               PCI_BDF(0, 30, 0) INTA PIRQA
-                               PCI_BDF(0, 30, 1) INTD PIRQD
-                               PCI_BDF(0, 30, 2) INTB PIRQB
-                               PCI_BDF(0, 30, 3) INTC PIRQC
-                               PCI_BDF(0, 30, 4) INTD PIRQD
-                               PCI_BDF(0, 30, 5) INTB PIRQB
-                               PCI_BDF(0, 31, 3) INTB PIRQB
-
-                               /* PCIe root ports downstream interrupts */
-                               PCI_BDF(1, 0, 0) INTA PIRQA
-                               PCI_BDF(1, 0, 0) INTB PIRQB
-                               PCI_BDF(1, 0, 0) INTC PIRQC
-                               PCI_BDF(1, 0, 0) INTD PIRQD
-                               PCI_BDF(2, 0, 0) INTA PIRQB
-                               PCI_BDF(2, 0, 0) INTB PIRQC
-                               PCI_BDF(2, 0, 0) INTC PIRQD
-                               PCI_BDF(2, 0, 0) INTD PIRQA
-                               PCI_BDF(3, 0, 0) INTA PIRQC
-                               PCI_BDF(3, 0, 0) INTB PIRQD
-                               PCI_BDF(3, 0, 0) INTC PIRQA
-                               PCI_BDF(3, 0, 0) INTD PIRQB
-                               PCI_BDF(4, 0, 0) INTA PIRQD
-                               PCI_BDF(4, 0, 0) INTB PIRQA
-                               PCI_BDF(4, 0, 0) INTC PIRQB
-                               PCI_BDF(4, 0, 0) INTD PIRQC
-                       >;
+                       compatible = "intel,pch9";
+
+                       irq-router {
+                               compatible = "intel,irq-router";
+                               intel,pirq-config = "ibase";
+                               intel,ibase-offset = <0x50>;
+                               intel,pirq-link = <8 8>;
+                               intel,pirq-mask = <0xdee0>;
+                               intel,pirq-routing = <
+                                       /* BayTrail PCI devices */
+                                       PCI_BDF(0, 2, 0) INTA PIRQA
+                                       PCI_BDF(0, 3, 0) INTA PIRQA
+                                       PCI_BDF(0, 16, 0) INTA PIRQA
+                                       PCI_BDF(0, 17, 0) INTA PIRQA
+                                       PCI_BDF(0, 18, 0) INTA PIRQA
+                                       PCI_BDF(0, 19, 0) INTA PIRQA
+                                       PCI_BDF(0, 20, 0) INTA PIRQA
+                                       PCI_BDF(0, 21, 0) INTA PIRQA
+                                       PCI_BDF(0, 22, 0) INTA PIRQA
+                                       PCI_BDF(0, 23, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 1) INTC PIRQC
+                                       PCI_BDF(0, 24, 2) INTD PIRQD
+                                       PCI_BDF(0, 24, 3) INTB PIRQB
+                                       PCI_BDF(0, 24, 4) INTA PIRQA
+                                       PCI_BDF(0, 24, 5) INTC PIRQC
+                                       PCI_BDF(0, 24, 6) INTD PIRQD
+                                       PCI_BDF(0, 24, 7) INTB PIRQB
+                                       PCI_BDF(0, 26, 0) INTA PIRQA
+                                       PCI_BDF(0, 27, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 1) INTB PIRQB
+                                       PCI_BDF(0, 28, 2) INTC PIRQC
+                                       PCI_BDF(0, 28, 3) INTD PIRQD
+                                       PCI_BDF(0, 29, 0) INTA PIRQA
+                                       PCI_BDF(0, 30, 0) INTA PIRQA
+                                       PCI_BDF(0, 30, 1) INTD PIRQD
+                                       PCI_BDF(0, 30, 2) INTB PIRQB
+                                       PCI_BDF(0, 30, 3) INTC PIRQC
+                                       PCI_BDF(0, 30, 4) INTD PIRQD
+                                       PCI_BDF(0, 30, 5) INTB PIRQB
+                                       PCI_BDF(0, 31, 3) INTB PIRQB
+
+                                       /*
+                                        * PCIe root ports downstream
+                                        * interrupts
+                                        */
+                                       PCI_BDF(1, 0, 0) INTA PIRQA
+                                       PCI_BDF(1, 0, 0) INTB PIRQB
+                                       PCI_BDF(1, 0, 0) INTC PIRQC
+                                       PCI_BDF(1, 0, 0) INTD PIRQD
+                                       PCI_BDF(2, 0, 0) INTA PIRQB
+                                       PCI_BDF(2, 0, 0) INTB PIRQC
+                                       PCI_BDF(2, 0, 0) INTC PIRQD
+                                       PCI_BDF(2, 0, 0) INTD PIRQA
+                                       PCI_BDF(3, 0, 0) INTA PIRQC
+                                       PCI_BDF(3, 0, 0) INTB PIRQD
+                                       PCI_BDF(3, 0, 0) INTC PIRQA
+                                       PCI_BDF(3, 0, 0) INTD PIRQB
+                                       PCI_BDF(4, 0, 0) INTA PIRQD
+                                       PCI_BDF(4, 0, 0) INTB PIRQA
+                                       PCI_BDF(4, 0, 0) INTC PIRQB
+                                       PCI_BDF(4, 0, 0) INTD PIRQC
+                               >;
+                       };
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       reg = <0>;
+                                       compatible = "winbond,w25q64dw",
+                                               "spi-flash";
+                                       memory-map = <0xff800000 0x00800000>;
+                                       rw-mrc-cache {
+                                               label = "rw-mrc-cache";
+                                               reg = <0x006e0000 0x00010000>;
+                                       };
+                               };
+                       };
                };
        };
 
index 194f0ebcda4b9995d43bb697641eb3c31c7a6413..4e9e410b706aac85ea31ad99e4f28904bc6a64f7 100644 (file)
                ranges = <0x02000000 0x0 0xe0000000 0xe0000000 0 0x10000000
                        0x42000000 0x0 0xd0000000 0xd0000000 0 0x10000000
                        0x01000000 0x0 0x2000 0x2000 0 0xe000>;
-       };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       reg = <0>;
-                       compatible = "winbond,w25q128", "spi-flash";
-                       memory-map = <0xff000000 0x01000000>;
+               pch@1f,0 {
+                       reg = <0x0000f800 0 0 0 0>;
+                       compatible = "intel,pch9";
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       reg = <0>;
+                                       compatible = "winbond,w25q128", "spi-flash";
+                                       memory-map = <0xff000000 0x01000000>;
+                               };
+                       };
                };
        };
+
 };
index c4469a97683d705fd303893144e4b7fa02ffc3f1..d148d6e349cd87f0d8c06395834aca3f52909e5e 100644 (file)
 
        aliases {
                spi0 = "/pci/pch/spi";
+               usb0 = &usb_0;
+               usb1 = &usb_1;
        };
 
        config {
               silent_console = <0>;
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "intel,core-gen3";
+                       reg = <0>;
+                       intel,apic-id = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "intel,core-gen3";
+                       reg = <1>;
+                       intel,apic-id = <1>;
+               };
+
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "intel,core-gen3";
+                       reg = <2>;
+                       intel,apic-id = <2>;
+               };
+
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "intel,core-gen3";
+                       reg = <3>;
+                       intel,apic-id = <3>;
+               };
+
+       };
+
        gpioa {
                compatible = "intel,ich6-gpio";
                u-boot,dm-pre-reloc;
        };
 
        pci {
-               compatible = "intel,pci-ivybridge", "pci-x86";
+               compatible = "pci-x86";
                #address-cells = <3>;
                #size-cells = <2>;
                u-boot,dm-pre-reloc;
                ranges = <0x02000000 0x0 0xe0000000 0xe0000000 0 0x10000000
                        0x42000000 0x0 0xd0000000 0xd0000000 0 0x10000000
                        0x01000000 0x0 0x1000 0x1000 0 0xefff>;
-               sata {
-                       compatible = "intel,pantherpoint-ahci";
-                       intel,sata-mode = "ahci";
-                       intel,sata-port-map = <1>;
-                       intel,sata-port0-gen3-tx = <0x00880a7f>;
+
+               northbridge@0,0 {
+                       reg = <0x00000000 0 0 0 0>;
+                       compatible = "intel,bd82x6x-northbridge";
+                       u-boot,dm-pre-reloc;
                };
 
-               gma {
+               gma@2,0 {
+                       reg = <0x00001000 0 0 0 0>;
                        compatible = "intel,gma";
                        intel,dp_hotplug = <0 0 0x06>;
                        intel,panel-port-select = <1>;
                        intel,pch-backlight = <0x04000000>;
                };
 
-               pch {
+               me@16,0 {
+                       reg = <0x0000b000 0 0 0 0>;
+                       compatible = "intel,me";
+                       u-boot,dm-pre-reloc;
+               };
+
+               usb_1: usb@1a,0 {
+                       reg = <0x0000d000 0 0 0 0>;
+                       compatible = "ehci-pci";
+               };
+
+               usb_0: usb@1d,0 {
+                       reg = <0x0000e800 0 0 0 0>;
+                       compatible = "ehci-pci";
+               };
+
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,bd82x6x", "intel,pch";
+                       compatible = "intel,bd82x6x", "intel,pch9";
                        u-boot,dm-pre-reloc;
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       gen-dec = <0x800 0xfc 0x900 0xfc>;
-                       intel,gen-dec = <0x800 0xfc 0x900 0xfc>;
                        intel,pirq-routing = <0x8b 0x8a 0x8b 0x8b
                                                0x80 0x80 0x80 0x80>;
                        intel,gpi-routing = <0 0 0 0 0 0 0 2
                                                1 0 0 0 0 0 0 0>;
                        /* Enable EC SMI source */
                        intel,alt-gp-smi-enable = <0x0100>;
+
                        spi {
                                #address-cells = <1>;
                                #size-cells = <0>;
                                compatible = "intel,bd82x6x-lpc";
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               u-boot,dm-pre-reloc;
+                               intel,gen-dec = <0x800 0xfc 0x900 0xfc>;
                                cros-ec@200 {
                                        compatible = "google,cros-ec";
                                        reg = <0x204 1 0x200 1 0x880 0x80>;
                                };
                        };
                };
+
+               sata@1f,2 {
+                       compatible = "intel,pantherpoint-ahci";
+                       reg = <0x0000fa00 0 0 0 0>;
+                       u-boot,dm-pre-reloc;
+                       intel,sata-mode = "ahci";
+                       intel,sata-port-map = <1>;
+                       intel,sata-port0-gen3-tx = <0x00880a7f>;
+               };
+
+               smbus: smbus@1f,3 {
+                       compatible = "intel,ich-i2c";
+                       reg = <0x0000fb00 0 0 0 0>;
+                       u-boot,dm-pre-reloc;
+               };
        };
 
        tpm {
index 4e2b51708b1915cc0f1a2bfe90ce8c5869bc2301..23027016e5746a51768974a2629f06ea906ceecc 100644 (file)
                ranges = <0x02000000 0x0 0xe0000000 0xe0000000 0 0x10000000
                        0x42000000 0x0 0xd0000000 0xd0000000 0 0x10000000
                        0x01000000 0x0 0x1000 0x1000 0 0xf000>;
-       };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       #size-cells = <1>;
-                       #address-cells = <1>;
-                       reg = <0>;
-                       compatible = "winbond,w25q64", "spi-flash";
-                       memory-map = <0xff800000 0x00800000>;
-                       rw-mrc-cache {
-                               label = "rw-mrc-cache";
-                               reg = <0x003e0000 0x00010000>;
+               pch@1f,0 {
+                       reg = <0x0000f800 0 0 0 0>;
+                       compatible = "intel,pch9";
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       #size-cells = <1>;
+                                       #address-cells = <1>;
+                                       reg = <0>;
+                                       compatible = "winbond,w25q64",
+                                               "spi-flash";
+                                       memory-map = <0xff800000 0x00800000>;
+                                       rw-mrc-cache {
+                                               label = "rw-mrc-cache";
+                                               reg = <0x003e0000 0x00010000>;
+                                       };
+                               };
                        };
                };
        };
index 84231b37783ea673c43b752e2bd285cd7e22ac0c..d6dd0b49f0fac3a64f9ec4192c3a2ed431d2610f 100644 (file)
                stdout-path = "/serial";
        };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       reg = <0>;
-                       compatible = "sst,25vf016b", "spi-flash";
-                       memory-map = <0xffe00000 0x00200000>;
-               };
-       };
-
        microcode {
                update@0 {
 #include "microcode/m0220661105_cv.dtsi"
                        };
                };
 
-               irq-router@1f,0 {
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "pci";
-                       intel,pirq-link = <0x60 8>;
-                       intel,pirq-mask = <0xcee0>;
-                       intel,pirq-routing = <
-                               /* TunnelCreek PCI devices */
-                               PCI_BDF(0, 2, 0) INTA PIRQE
-                               PCI_BDF(0, 3, 0) INTA PIRQF
-                               PCI_BDF(0, 23, 0) INTA PIRQA
-                               PCI_BDF(0, 23, 0) INTB PIRQB
-                               PCI_BDF(0, 23, 0) INTC PIRQC
-                               PCI_BDF(0, 23, 0) INTD PIRQD
-                               PCI_BDF(0, 24, 0) INTA PIRQB
-                               PCI_BDF(0, 24, 0) INTB PIRQC
-                               PCI_BDF(0, 24, 0) INTC PIRQD
-                               PCI_BDF(0, 24, 0) INTD PIRQA
-                               PCI_BDF(0, 25, 0) INTA PIRQC
-                               PCI_BDF(0, 25, 0) INTB PIRQD
-                               PCI_BDF(0, 25, 0) INTC PIRQA
-                               PCI_BDF(0, 25, 0) INTD PIRQB
-                               PCI_BDF(0, 26, 0) INTA PIRQD
-                               PCI_BDF(0, 26, 0) INTB PIRQA
-                               PCI_BDF(0, 26, 0) INTC PIRQB
-                               PCI_BDF(0, 26, 0) INTD PIRQC
-                               PCI_BDF(0, 27, 0) INTA PIRQG
-                               /*
-                                * Topcliff PCI devices
-                                *
-                                * Note on the Crown Bay board, Topcliff chipset
-                                * is connected to TunnelCreek PCIe port 0, so
-                                * its bus number is 1 for its PCIe port and 2
-                                * for its PCI devices per U-Boot current PCI
-                                * bus enumeration algorithm.
-                                */
-                               PCI_BDF(1, 0, 0) INTA PIRQA
-                               PCI_BDF(2, 0, 1) INTA PIRQA
-                               PCI_BDF(2, 0, 2) INTA PIRQA
-                               PCI_BDF(2, 2, 0) INTB PIRQD
-                               PCI_BDF(2, 2, 1) INTB PIRQD
-                               PCI_BDF(2, 2, 2) INTB PIRQD
-                               PCI_BDF(2, 2, 3) INTB PIRQD
-                               PCI_BDF(2, 2, 4) INTB PIRQD
-                               PCI_BDF(2, 4, 0) INTC PIRQC
-                               PCI_BDF(2, 4, 1) INTC PIRQC
-                               PCI_BDF(2, 6, 0) INTD PIRQB
-                               PCI_BDF(2, 8, 0) INTA PIRQA
-                               PCI_BDF(2, 8, 1) INTA PIRQA
-                               PCI_BDF(2, 8, 2) INTA PIRQA
-                               PCI_BDF(2, 8, 3) INTA PIRQA
-                               PCI_BDF(2, 10, 0) INTB PIRQD
-                               PCI_BDF(2, 10, 1) INTB PIRQD
-                               PCI_BDF(2, 10, 2) INTB PIRQD
-                               PCI_BDF(2, 10, 3) INTB PIRQD
-                               PCI_BDF(2, 10, 4) INTB PIRQD
-                               PCI_BDF(2, 12, 0) INTC PIRQC
-                               PCI_BDF(2, 12, 1) INTC PIRQC
-                               PCI_BDF(2, 12, 2) INTC PIRQC
-                               PCI_BDF(2, 12, 3) INTC PIRQC
-                               PCI_BDF(2, 12, 4) INTC PIRQC
-                       >;
+                       compatible = "intel,pch7";
+
+                       irq-router {
+                               compatible = "intel,queensbay-irq-router";
+                               intel,pirq-config = "pci";
+                               intel,pirq-link = <0x60 8>;
+                               intel,pirq-mask = <0xcee0>;
+                               intel,pirq-routing = <
+                                       /* TunnelCreek PCI devices */
+                                       PCI_BDF(0, 2, 0) INTA PIRQE
+                                       PCI_BDF(0, 3, 0) INTA PIRQF
+                                       PCI_BDF(0, 23, 0) INTA PIRQA
+                                       PCI_BDF(0, 23, 0) INTB PIRQB
+                                       PCI_BDF(0, 23, 0) INTC PIRQC
+                                       PCI_BDF(0, 23, 0) INTD PIRQD
+                                       PCI_BDF(0, 24, 0) INTA PIRQB
+                                       PCI_BDF(0, 24, 0) INTB PIRQC
+                                       PCI_BDF(0, 24, 0) INTC PIRQD
+                                       PCI_BDF(0, 24, 0) INTD PIRQA
+                                       PCI_BDF(0, 25, 0) INTA PIRQC
+                                       PCI_BDF(0, 25, 0) INTB PIRQD
+                                       PCI_BDF(0, 25, 0) INTC PIRQA
+                                       PCI_BDF(0, 25, 0) INTD PIRQB
+                                       PCI_BDF(0, 26, 0) INTA PIRQD
+                                       PCI_BDF(0, 26, 0) INTB PIRQA
+                                       PCI_BDF(0, 26, 0) INTC PIRQB
+                                       PCI_BDF(0, 26, 0) INTD PIRQC
+                                       PCI_BDF(0, 27, 0) INTA PIRQG
+                                       /*
+                                       * Topcliff PCI devices
+                                       *
+                                       * Note on the Crown Bay board, Topcliff
+                                       * chipset is connected to TunnelCreek
+                                       * PCIe port 0, so its bus number is 1
+                                       * for its PCIe port and 2 for its PCI
+                                       * devices per U-Boot current PCI bus
+                                       * enumeration algorithm.
+                                       */
+                                       PCI_BDF(1, 0, 0) INTA PIRQA
+                                       PCI_BDF(2, 0, 1) INTA PIRQA
+                                       PCI_BDF(2, 0, 2) INTA PIRQA
+                                       PCI_BDF(2, 2, 0) INTB PIRQD
+                                       PCI_BDF(2, 2, 1) INTB PIRQD
+                                       PCI_BDF(2, 2, 2) INTB PIRQD
+                                       PCI_BDF(2, 2, 3) INTB PIRQD
+                                       PCI_BDF(2, 2, 4) INTB PIRQD
+                                       PCI_BDF(2, 4, 0) INTC PIRQC
+                                       PCI_BDF(2, 4, 1) INTC PIRQC
+                                       PCI_BDF(2, 6, 0) INTD PIRQB
+                                       PCI_BDF(2, 8, 0) INTA PIRQA
+                                       PCI_BDF(2, 8, 1) INTA PIRQA
+                                       PCI_BDF(2, 8, 2) INTA PIRQA
+                                       PCI_BDF(2, 8, 3) INTA PIRQA
+                                       PCI_BDF(2, 10, 0) INTB PIRQD
+                                       PCI_BDF(2, 10, 1) INTB PIRQD
+                                       PCI_BDF(2, 10, 2) INTB PIRQD
+                                       PCI_BDF(2, 10, 3) INTB PIRQD
+                                       PCI_BDF(2, 10, 4) INTB PIRQD
+                                       PCI_BDF(2, 12, 0) INTC PIRQC
+                                       PCI_BDF(2, 12, 1) INTC PIRQC
+                                       PCI_BDF(2, 12, 2) INTC PIRQC
+                                       PCI_BDF(2, 12, 3) INTC PIRQC
+                                       PCI_BDF(2, 12, 4) INTC PIRQC
+                               >;
+                       };
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       reg = <0>;
+                                       compatible = "sst,25vf016b",
+                                               "spi-flash";
+                                       memory-map = <0xffe00000 0x00200000>;
+                               };
+                       };
                };
        };
 
index 55165e14646aa1c3720bc18f223b6b065acc1be8..a2f5a1f223427508c447225df87bdce965b91b4a 100644 (file)
                        current-speed = <115200>;
                };
 
-               irq-router@1f,0 {
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "pci";
-                       intel,pirq-link = <0x60 8>;
-                       intel,pirq-mask = <0xdef8>;
-                       intel,pirq-routing = <
-                               PCI_BDF(0, 20, 0) INTA PIRQE
-                               PCI_BDF(0, 20, 1) INTB PIRQF
-                               PCI_BDF(0, 20, 2) INTC PIRQG
-                               PCI_BDF(0, 20, 3) INTD PIRQH
-                               PCI_BDF(0, 20, 4) INTA PIRQE
-                               PCI_BDF(0, 20, 5) INTB PIRQF
-                               PCI_BDF(0, 20, 6) INTC PIRQG
-                               PCI_BDF(0, 20, 7) INTD PIRQH
-                               PCI_BDF(0, 21, 0) INTA PIRQE
-                               PCI_BDF(0, 21, 1) INTB PIRQF
-                               PCI_BDF(0, 21, 2) INTC PIRQG
-                               PCI_BDF(0, 23, 0) INTA PIRQA
-                               PCI_BDF(0, 23, 1) INTB PIRQB
-
-                               /* PCIe root ports downstream interrupts */
-                               PCI_BDF(1, 0, 0) INTA PIRQA
-                               PCI_BDF(1, 0, 0) INTB PIRQB
-                               PCI_BDF(1, 0, 0) INTC PIRQC
-                               PCI_BDF(1, 0, 0) INTD PIRQD
-                               PCI_BDF(2, 0, 0) INTA PIRQB
-                               PCI_BDF(2, 0, 0) INTB PIRQC
-                               PCI_BDF(2, 0, 0) INTC PIRQD
-                               PCI_BDF(2, 0, 0) INTD PIRQA
-                       >;
+                       compatible = "intel,pch7";
+
+                       irq-router {
+                               compatible = "intel,quark-irq-router";
+                               intel,pirq-config = "pci";
+                               intel,pirq-link = <0x60 8>;
+                               intel,pirq-mask = <0xdef8>;
+                               intel,pirq-routing = <
+                                       PCI_BDF(0, 20, 0) INTA PIRQE
+                                       PCI_BDF(0, 20, 1) INTB PIRQF
+                                       PCI_BDF(0, 20, 2) INTC PIRQG
+                                       PCI_BDF(0, 20, 3) INTD PIRQH
+                                       PCI_BDF(0, 20, 4) INTA PIRQE
+                                       PCI_BDF(0, 20, 5) INTB PIRQF
+                                       PCI_BDF(0, 20, 6) INTC PIRQG
+                                       PCI_BDF(0, 20, 7) INTD PIRQH
+                                       PCI_BDF(0, 21, 0) INTA PIRQE
+                                       PCI_BDF(0, 21, 1) INTB PIRQF
+                                       PCI_BDF(0, 21, 2) INTC PIRQG
+                                       PCI_BDF(0, 23, 0) INTA PIRQA
+                                       PCI_BDF(0, 23, 1) INTB PIRQB
+
+                                       /* PCIe root ports downstream interrupts */
+                                       PCI_BDF(1, 0, 0) INTA PIRQA
+                                       PCI_BDF(1, 0, 0) INTB PIRQB
+                                       PCI_BDF(1, 0, 0) INTC PIRQC
+                                       PCI_BDF(1, 0, 0) INTD PIRQD
+                                       PCI_BDF(2, 0, 0) INTA PIRQB
+                                       PCI_BDF(2, 0, 0) INTB PIRQC
+                                       PCI_BDF(2, 0, 0) INTC PIRQD
+                                       PCI_BDF(2, 0, 0) INTD PIRQA
+                               >;
+                       };
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       #size-cells = <1>;
+                                       #address-cells = <1>;
+                                       reg = <0>;
+                                       compatible = "winbond,w25q64",
+                                               "spi-flash";
+                                       memory-map = <0xff800000 0x00800000>;
+                                       rw-mrc-cache {
+                                               label = "rw-mrc-cache";
+                                               reg = <0x00010000 0x00010000>;
+                                       };
+                               };
+                       };
                };
        };
 
                bank-name = "B";
        };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       #size-cells = <1>;
-                       #address-cells = <1>;
-                       reg = <0>;
-                       compatible = "winbond,w25q64", "spi-flash";
-                       memory-map = <0xff800000 0x00800000>;
-                       rw-mrc-cache {
-                               label = "rw-mrc-cache";
-                               reg = <0x00010000 0x00010000>;
-                       };
-               };
-       };
-
 };
index bbfd6d4028086afe5077591cf93026c6b5975815..e7ef7c987b6226b525a1d40be3299ec5787a0d6e 100644 (file)
                          0x42000000 0x0 0xc0000000 0xc0000000 0 0x20000000
                          0x01000000 0x0 0x2000 0x2000 0 0xe000>;
 
-               irq-router@1f,0 {
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "ibase";
-                       intel,ibase-offset = <0x50>;
-                       intel,pirq-link = <8 8>;
-                       intel,pirq-mask = <0xdee0>;
-                       intel,pirq-routing = <
-                               /* BayTrail PCI devices */
-                               PCI_BDF(0, 2, 0) INTA PIRQA
-                               PCI_BDF(0, 3, 0) INTA PIRQA
-                               PCI_BDF(0, 16, 0) INTA PIRQA
-                               PCI_BDF(0, 17, 0) INTA PIRQA
-                               PCI_BDF(0, 18, 0) INTA PIRQA
-                               PCI_BDF(0, 19, 0) INTA PIRQA
-                               PCI_BDF(0, 20, 0) INTA PIRQA
-                               PCI_BDF(0, 21, 0) INTA PIRQA
-                               PCI_BDF(0, 22, 0) INTA PIRQA
-                               PCI_BDF(0, 23, 0) INTA PIRQA
-                               PCI_BDF(0, 24, 0) INTA PIRQA
-                               PCI_BDF(0, 24, 1) INTC PIRQC
-                               PCI_BDF(0, 24, 2) INTD PIRQD
-                               PCI_BDF(0, 24, 3) INTB PIRQB
-                               PCI_BDF(0, 24, 4) INTA PIRQA
-                               PCI_BDF(0, 24, 5) INTC PIRQC
-                               PCI_BDF(0, 24, 6) INTD PIRQD
-                               PCI_BDF(0, 24, 7) INTB PIRQB
-                               PCI_BDF(0, 26, 0) INTA PIRQA
-                               PCI_BDF(0, 27, 0) INTA PIRQA
-                               PCI_BDF(0, 28, 0) INTA PIRQA
-                               PCI_BDF(0, 28, 1) INTB PIRQB
-                               PCI_BDF(0, 28, 2) INTC PIRQC
-                               PCI_BDF(0, 28, 3) INTD PIRQD
-                               PCI_BDF(0, 29, 0) INTA PIRQA
-                               PCI_BDF(0, 30, 0) INTA PIRQA
-                               PCI_BDF(0, 30, 1) INTD PIRQD
-                               PCI_BDF(0, 30, 2) INTB PIRQB
-                               PCI_BDF(0, 30, 3) INTC PIRQC
-                               PCI_BDF(0, 30, 4) INTD PIRQD
-                               PCI_BDF(0, 30, 5) INTB PIRQB
-                               PCI_BDF(0, 31, 3) INTB PIRQB
+                       compatible = "pci8086,0f1c", "intel,pch9";
 
-                               /* PCIe root ports downstream interrupts */
-                               PCI_BDF(1, 0, 0) INTA PIRQA
-                               PCI_BDF(1, 0, 0) INTB PIRQB
-                               PCI_BDF(1, 0, 0) INTC PIRQC
-                               PCI_BDF(1, 0, 0) INTD PIRQD
-                               PCI_BDF(2, 0, 0) INTA PIRQB
-                               PCI_BDF(2, 0, 0) INTB PIRQC
-                               PCI_BDF(2, 0, 0) INTC PIRQD
-                               PCI_BDF(2, 0, 0) INTD PIRQA
-                               PCI_BDF(3, 0, 0) INTA PIRQC
-                               PCI_BDF(3, 0, 0) INTB PIRQD
-                               PCI_BDF(3, 0, 0) INTC PIRQA
-                               PCI_BDF(3, 0, 0) INTD PIRQB
-                               PCI_BDF(4, 0, 0) INTA PIRQD
-                               PCI_BDF(4, 0, 0) INTB PIRQA
-                               PCI_BDF(4, 0, 0) INTC PIRQB
-                               PCI_BDF(4, 0, 0) INTD PIRQC
-                       >;
+                       irq-router {
+                               compatible = "intel,irq-router";
+                               intel,pirq-config = "ibase";
+                               intel,ibase-offset = <0x50>;
+                               intel,pirq-link = <8 8>;
+                               intel,pirq-mask = <0xdee0>;
+                               intel,pirq-routing = <
+                                       /* BayTrail PCI devices */
+                                       PCI_BDF(0, 2, 0) INTA PIRQA
+                                       PCI_BDF(0, 3, 0) INTA PIRQA
+                                       PCI_BDF(0, 16, 0) INTA PIRQA
+                                       PCI_BDF(0, 17, 0) INTA PIRQA
+                                       PCI_BDF(0, 18, 0) INTA PIRQA
+                                       PCI_BDF(0, 19, 0) INTA PIRQA
+                                       PCI_BDF(0, 20, 0) INTA PIRQA
+                                       PCI_BDF(0, 21, 0) INTA PIRQA
+                                       PCI_BDF(0, 22, 0) INTA PIRQA
+                                       PCI_BDF(0, 23, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 1) INTC PIRQC
+                                       PCI_BDF(0, 24, 2) INTD PIRQD
+                                       PCI_BDF(0, 24, 3) INTB PIRQB
+                                       PCI_BDF(0, 24, 4) INTA PIRQA
+                                       PCI_BDF(0, 24, 5) INTC PIRQC
+                                       PCI_BDF(0, 24, 6) INTD PIRQD
+                                       PCI_BDF(0, 24, 7) INTB PIRQB
+                                       PCI_BDF(0, 26, 0) INTA PIRQA
+                                       PCI_BDF(0, 27, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 1) INTB PIRQB
+                                       PCI_BDF(0, 28, 2) INTC PIRQC
+                                       PCI_BDF(0, 28, 3) INTD PIRQD
+                                       PCI_BDF(0, 29, 0) INTA PIRQA
+                                       PCI_BDF(0, 30, 0) INTA PIRQA
+                                       PCI_BDF(0, 30, 1) INTD PIRQD
+                                       PCI_BDF(0, 30, 2) INTB PIRQB
+                                       PCI_BDF(0, 30, 3) INTC PIRQC
+                                       PCI_BDF(0, 30, 4) INTD PIRQD
+                                       PCI_BDF(0, 30, 5) INTB PIRQB
+                                       PCI_BDF(0, 31, 3) INTB PIRQB
+
+                                       /*
+                                        * PCIe root ports downstream
+                                        * interrupts
+                                        */
+                                       PCI_BDF(1, 0, 0) INTA PIRQA
+                                       PCI_BDF(1, 0, 0) INTB PIRQB
+                                       PCI_BDF(1, 0, 0) INTC PIRQC
+                                       PCI_BDF(1, 0, 0) INTD PIRQD
+                                       PCI_BDF(2, 0, 0) INTA PIRQB
+                                       PCI_BDF(2, 0, 0) INTB PIRQC
+                                       PCI_BDF(2, 0, 0) INTC PIRQD
+                                       PCI_BDF(2, 0, 0) INTD PIRQA
+                                       PCI_BDF(3, 0, 0) INTA PIRQC
+                                       PCI_BDF(3, 0, 0) INTB PIRQD
+                                       PCI_BDF(3, 0, 0) INTC PIRQA
+                                       PCI_BDF(3, 0, 0) INTD PIRQB
+                                       PCI_BDF(4, 0, 0) INTA PIRQD
+                                       PCI_BDF(4, 0, 0) INTB PIRQA
+                                       PCI_BDF(4, 0, 0) INTC PIRQB
+                                       PCI_BDF(4, 0, 0) INTD PIRQC
+                               >;
+                       };
+
+                       spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich-spi";
+                               spi-flash@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       reg = <0>;
+                                       compatible = "stmicro,n25q064a",
+                                               "spi-flash";
+                                       memory-map = <0xff800000 0x00800000>;
+                                       rw-mrc-cache {
+                                               label = "rw-mrc-cache";
+                                               reg = <0x006f0000 0x00010000>;
+                                       };
+                               };
+                       };
                };
        };
 
                };
        };
 
-       spi {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "intel,ich-spi";
-               spi-flash@0 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       reg = <0>;
-                       compatible = "stmicro,n25q064a", "spi-flash";
-                       memory-map = <0xff800000 0x00800000>;
-                       rw-mrc-cache {
-                               label = "rw-mrc-cache";
-                               reg = <0x006f0000 0x00010000>;
-                       };
-               };
-       };
-
        microcode {
                update@0 {
 #include "microcode/m0130673322.dtsi"
index 9086b461b9d1362745318d41f02cdf379a1a09e9..9c3f2a08e63721814c30065622f6d53e57eb7838 100644 (file)
                        0x42000000 0x0 0xd0000000 0xd0000000 0 0x10000000
                        0x01000000 0x0 0x2000 0x2000 0 0xe000>;
 
-               irq-router@1,0 {
+               pch@1,0 {
                        reg = <0x00000800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "pci";
-                       intel,pirq-link = <0x60 4>;
-                       intel,pirq-mask = <0x0e40>;
-                       intel,pirq-routing = <
-                               /* PIIX UHCI */
-                               PCI_BDF(0, 1, 2) INTD PIRQD
-                               /* e1000 NIC */
-                               PCI_BDF(0, 3, 0) INTA PIRQC
-                       >;
+                       compatible = "intel,pch7";
+
+                       irq-router {
+                               compatible = "intel,irq-router";
+                               intel,pirq-config = "pci";
+                               intel,pirq-link = <0x60 4>;
+                               intel,pirq-mask = <0x0e40>;
+                               intel,pirq-routing = <
+                                       /* PIIX UHCI */
+                                       PCI_BDF(0, 1, 2) INTD PIRQD
+                                       /* e1000 NIC */
+                                       PCI_BDF(0, 3, 0) INTA PIRQC
+                               >;
+                       };
                };
        };
 
index 145e8115cec96ef1e1845981464e56db20b3e1b7..5d601b344477ad4e1864951748a5f6cc9f49f951 100644 (file)
                        0x42000000 0x0 0xd0000000 0xd0000000 0 0x10000000
                        0x01000000 0x0 0x2000 0x2000 0 0xe000>;
 
-               irq-router@1f,0 {
+               pch@1f,0 {
                        reg = <0x0000f800 0 0 0 0>;
-                       compatible = "intel,irq-router";
-                       intel,pirq-config = "pci";
-                       intel,pirq-link = <0x60 8>;
-                       intel,pirq-mask = <0x0e40>;
-                       intel,pirq-routing = <
-                               /* e1000 NIC */
-                               PCI_BDF(0, 2, 0) INTA PIRQG
-                               /* ICH9 UHCI */
-                               PCI_BDF(0, 29, 0) INTA PIRQA
-                               PCI_BDF(0, 29, 1) INTB PIRQB
-                               PCI_BDF(0, 29, 2) INTC PIRQC
-                               /* ICH9 EHCI */
-                               PCI_BDF(0, 29, 7) INTD PIRQD
-                               /* ICH9 SATA */
-                               PCI_BDF(0, 31, 2) INTA PIRQA
-                       >;
+                       compatible = "intel,pch9";
+
+                       irq-router {
+                               compatible = "intel,irq-router";
+                               intel,pirq-config = "pci";
+                               intel,pirq-link = <0x60 8>;
+                               intel,pirq-mask = <0x0e40>;
+                               intel,pirq-routing = <
+                                       /* e1000 NIC */
+                                       PCI_BDF(0, 2, 0) INTA PIRQG
+                                       /* ICH9 UHCI */
+                                       PCI_BDF(0, 29, 0) INTA PIRQA
+                                       PCI_BDF(0, 29, 1) INTB PIRQB
+                                       PCI_BDF(0, 29, 2) INTC PIRQC
+                                       /* ICH9 EHCI */
+                                       PCI_BDF(0, 29, 7) INTD PIRQD
+                                       /* ICH9 SATA */
+                                       PCI_BDF(0, 31, 2) INTA PIRQA
+                               >;
+                       };
                };
        };
 
index fcdf6e26cbb2ef6b66cfe710c920388bc6242c30..e866580046619bfab3675b8455ba4cd1f0aea65a 100644 (file)
@@ -7,27 +7,6 @@
 #ifndef _ASM_ARCH_BD82X6X_H
 #define _ASM_ARCH_BD82X6X_H
 
-void bd82x6x_sata_init(pci_dev_t dev, const void *blob, int node);
-void bd82x6x_sata_enable(pci_dev_t dev, const void *blob, int node);
-void bd82x6x_pci_init(pci_dev_t dev);
-void bd82x6x_usb_ehci_init(pci_dev_t dev);
-void bd82x6x_usb_xhci_init(pci_dev_t dev);
-int gma_func0_init(struct udevice *dev, const void *blob, int node);
-int bd82x6x_init(void);
-
-/**
- * struct x86_cpu_priv - Information about a single CPU
- *
- * @apic_id: Advanced Programmable Interrupt Controller Identifier, which is
- * just a number representing the CPU core
- *
- * TODO: Move this to driver model once lifecycle is understood
- */
-struct x86_cpu_priv {
-       int apic_id;
-       int start_err;
-};
-
-int model_206ax_init(struct x86_cpu_priv *cpu);
+int gma_func0_init(struct udevice *dev);
 
 #endif
index 3a0809d6ece7c6438a5929f71e1f66de00883828..eb1b73f92e7469afc91894bd792304e8ebdd15bb 100644 (file)
@@ -345,12 +345,47 @@ struct __packed me_fwcaps {
        u8 reserved[3];
 };
 
-/* Defined in me_status.c for both romstage and ramstage */
+/**
+ * intel_me_status() - Check Intel Management Engine status
+ *
+ * struct hfs: Firmware status
+ * struct gmes:        Management engine status
+ */
 void intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes);
 
-void intel_early_me_status(void);
-int intel_early_me_init(void);
-int intel_early_me_uma_size(void);
-int intel_early_me_init_done(u8 status);
+/**
+ * intel_early_me_status() - Check early Management Engine Status
+ *
+ * @me_dev:    Management engine PCI device
+ */
+void intel_early_me_status(struct udevice *me_dev);
+
+/**
+ * intel_early_me_init() - Early Intel Management Engine init
+ *
+ * @me_dev:    Management engine PCI device
+ * @return 0 if OK, -ve on error
+ */
+int intel_early_me_init(struct udevice *me_dev);
+
+/**
+ * intel_early_me_uma_size() - Get UMA size from the Intel Management Engine
+ *
+ * @me_dev:    Management engine PCI device
+ * @return UMA size if OK, -EINVAL on error
+ */
+int intel_early_me_uma_size(struct udevice *me_dev);
+
+/**
+ * intel_early_me_init_done() - Complete Intel Management Engine init
+ *
+ * @dev:       Northbridge device
+ * @me_dev:    Management engine PCI device
+ * @status:    Status result (ME_INIT_...)
+ * @return 0 to continue to boot, -EINVAL on unknown result data, -ETIMEDOUT
+ * if ME did not respond
+ */
+int intel_early_me_init_done(struct udevice *dev, struct udevice *me_dev,
+                            uint status);
 
 #endif
index 31437c8618d13f6c40a772a06447dfe436ce223e..af3e8e747c1563108ee065709a41e2d287795590 100644 (file)
 
 #define SMBUS_IO_BASE          0x0400
 
-int pch_silicon_revision(void);
-int pch_silicon_type(void);
-int pch_silicon_supported(int type, int rev);
-void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
-
 #define MAINBOARD_POWER_OFF    0
 #define MAINBOARD_POWER_ON     1
 #define MAINBOARD_POWER_KEEP   2
@@ -470,17 +465,23 @@ void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue);
 #define   DMISCI_STS   (1 << 9)
 #define TCO2_STS       0x66
 
-int lpc_init(struct pci_controller *hose, pci_dev_t dev);
-void lpc_enable(pci_dev_t dev);
+/**
+ * pch_silicon_revision() - Read silicon device ID from the PCH
+ *
+ * @dev:       PCH device
+ * @return silicon device ID
+ */
+int pch_silicon_type(struct udevice *dev);
 
 /**
- * lpc_early_init() - set up LPC serial ports and other early things
+ * pch_pch_iobp_update() - Update a pch register
  *
- * @blob:      Device tree blob
- * @node:      Offset of LPC node
- * @dev:       PCH PCI device containing the LPC
- * @return 0 if OK, -ve on error
+ * @dev:       PCH device
+ * @address:   Address to update
+ * @andvalue:  Value to AND with existing value
+ * @orvalue:   Value to OR with existing value
  */
-int lpc_early_init(const void *blob, int node, pci_dev_t dev);
+void pch_iobp_update(struct udevice *dev, u32 address, u32 andvalue,
+                            u32 orvalue);
 
 #endif
index c9605258b59160853566518c0de5fea96d8e6586..d137d6786a938c23a2d3d604a43633c07bcdc06a 100644 (file)
 
 #define DMIBAR_REG(x)  (DEFAULT_DMIBAR + x)
 
-int bridge_silicon_revision(void);
-
-void northbridge_enable(pci_dev_t dev);
-void northbridge_init(pci_dev_t dev);
+/**
+ * bridge_silicon_revision() - Get the Northbridge revision
+ *
+ * @dev:       Northbridge device
+ * @return revision ID (bits 3:0) and bridge ID (bits 7:4)
+ */
+int bridge_silicon_revision(struct udevice *dev);
 
-void report_platform_info(void);
+void report_platform_info(struct udevice *dev);
 
 void sandybridge_early_init(int chipset_type);
 
index c70183ccefffba8effd9fdb080210328285b03a3..18b034598639059048ed1922b5ee961a465675b7 100644 (file)
@@ -45,6 +45,17 @@ enum {
        GDT_BASE_HIGH_MASK      = 0xf,
 };
 
+/*
+ * System controllers in an x86 system. We mostly need to just find these and
+ * use them on PCI. At some point these might have their own uclass (e.g.
+ * UCLASS_VIDEO for the GMA device).
+ */
+enum {
+       X86_NONE,
+       X86_SYSCON_ME,          /* Intel Management Engine */
+       X86_SYSCON_GMA,         /* Intel Graphics Media Accelerator */
+};
+
 struct cpuid_result {
        uint32_t eax;
        uint32_t ebx;
index 6697da3b859124d0bf69e00471e006b12180ba47..5b9e6737634e69ed3044fb037306b331eabf297c 100644 (file)
@@ -56,23 +56,10 @@ struct pirq_routing {
 #define PIRQ_BITMAP            0xdef8
 
 /**
- * cpu_irq_init() - Initialize CPU IRQ routing
+ * irq_router_common_init() - Perform common x86 interrupt init
  *
- * This initializes some platform-specific registers related to IRQ routing,
- * like configuring internal PCI devices to use which PCI interrupt pin,
- * and which PCI interrupt pin is mapped to which PIRQ line. Note on some
- * platforms, such IRQ routing might be hard-coded thus cannot configure.
+ * This creates the PIRQ routing table and routes the IRQs
  */
-void cpu_irq_init(void);
-
-/**
- * pirq_init() - Initialize platform PIRQ routing
- *
- * This initializes the PIRQ routing on the platform and configures all PCI
- * devices' interrupt line register to a working IRQ number on the 8259 PIC.
- *
- * @return 0 if OK, -ve on error
- */
-int pirq_init(void);
+int irq_router_common_init(struct udevice *dev);
 
 #endif /* _ARCH_IRQ_H_ */
index dbf8e95c1b3457fe8feb04d6915d05b04119fdd7..9c143caf670b84653d14eda57bf70b936b965c35 100644 (file)
@@ -77,8 +77,6 @@ uint64_t timer_get_tsc(void);
 
 void quick_ram_check(void);
 
-int x86_init_cpus(void);
-
 #define PCI_VGA_RAM_IMAGE_START                0xc0000
 
 #endif /* _U_BOOT_I386_H_ */
index cd5ecb60ea44da4b1a8f8d948b7b679dcc756804..d9fc296b6e4877a1a3b3a8766fe7d54f6ac54d67 100644 (file)
@@ -19,12 +19,12 @@ obj-y       += lpc-uclass.o
 obj-y  += mpspec.o
 obj-$(CONFIG_ENABLE_MRC_CACHE) += mrccache.o
 obj-y += cmd_mtrr.o
+obj-y  += northbridge-uclass.o
 obj-$(CONFIG_I8259_PIC) += i8259.o
 obj-$(CONFIG_I8254_TIMER) += i8254.o
 ifndef CONFIG_DM_PCI
 obj-$(CONFIG_PCI) += pci_type1.o
 endif
-obj-y  += pch-uclass.o
 obj-y  += pirq_routing.o
 obj-y  += relocate.o
 obj-y += physmem.o
index f3ad116316a9541953c39c0f13709d96a3e44777..0faa582d772d4608dea2b178e4330376e29ea629 100644 (file)
@@ -292,19 +292,19 @@ static int mptable_add_intsrc(struct mp_config_table *mc,
        struct mpc_config_intsrc *intsrc_base;
        int intsrc_entries = 0;
        const void *blob = gd->fdt_blob;
-       int node;
+       struct udevice *dev;
        int len, count;
        const u32 *cell;
-       int i;
+       int i, ret;
 
-       /* Get I/O interrupt information from device tree */
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_IRQ_ROUTER);
-       if (node < 0) {
+       ret = uclass_first_device(UCLASS_IRQ, &dev);
+       if (ret && ret != -ENODEV) {
                debug("%s: Cannot find irq router node\n", __func__);
-               return -ENOENT;
+               return ret;
        }
 
-       cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
+       /* Get I/O interrupt information from device tree */
+       cell = fdt_getprop(blob, dev->of_offset, "intel,pirq-routing", &len);
        if (!cell)
                return -ENOENT;
 
index 53a1259d095369aad533eef8ec63435b1bff6d95..67bace4f40df6bb06e1fc3ec8022c9b9fd6ec079 100644 (file)
@@ -243,8 +243,12 @@ int mrccache_save(void)
                goto err_entry;
        data  = (struct mrc_data_container *)gd->arch.mrc_output;
        ret = mrccache_update(sf, &entry, data);
-       if (!ret)
+       if (!ret) {
                debug("Saved MRC data with checksum %04x\n", data->checksum);
+       } else if (ret == -EEXIST) {
+               debug("MRC data is the same as last time, skipping save\n");
+               ret = 0;
+       }
 
 err_entry:
        if (ret)
diff --git a/arch/x86/lib/northbridge-uclass.c b/arch/x86/lib/northbridge-uclass.c
new file mode 100644 (file)
index 0000000..64b6257
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/root.h>
+
+UCLASS_DRIVER(northbridge) = {
+       .id             = UCLASS_NORTHBRIDGE,
+       .name           = "northbridge",
+};
diff --git a/board/avnet/fx12mm/Kconfig b/board/avnet/fx12mm/Kconfig
deleted file mode 100644 (file)
index 0b67ebd..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-if TARGET_FX12MM
-
-config SYS_BOARD
-       default "fx12mm"
-
-config SYS_VENDOR
-       default "avnet"
-
-config SYS_CONFIG_NAME
-       default "fx12mm"
-
-endif
diff --git a/board/avnet/fx12mm/MAINTAINERS b/board/avnet/fx12mm/MAINTAINERS
deleted file mode 100644 (file)
index c92e258..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-FX12MM BOARD
-M:     Georg Schardt <schardt@team-ctech.de>
-S:     Maintained
-F:     board/avnet/fx12mm/
-F:     include/configs/fx12mm.h
-F:     configs/fx12mm_defconfig
-F:     configs/fx12mm_flash_defconfig
diff --git a/board/avnet/fx12mm/Makefile b/board/avnet/fx12mm/Makefile
deleted file mode 100644 (file)
index 618b42f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# (C) Copyright 2008
-# Ricardo Ribalda,Universidad Autonoma de Madrid, ricardo.ribalda@uam.es
-# This work has been supported by: Qtechnology http://qtec.com/
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-obj-y  += fx12mm.o
-
-include $(srctree)/board/xilinx/ppc405-generic/Makefile
diff --git a/board/avnet/fx12mm/fx12mm.c b/board/avnet/fx12mm/fx12mm.c
deleted file mode 100644 (file)
index 92e1cfb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * (C) Copyright 2008
- *
- * Author: Xilinx Inc.
- *
- * Modified by:
- *  Georg Schardt <schardt@team-ctech.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <config.h>
-#include <common.h>
-#include <asm/processor.h>
-
-int checkboard(void)
-{
-       char buf[64];
-       int i;
-       int l = getenv_f("serial#", buf, sizeof(buf));
-
-       if (l < 0) {
-               printf("Avnet Virtex4 FX12 with no serial #");
-       } else {
-               printf("Avnet Virtex4 FX12 Minimodul # ");
-               for (i = 0; i < l; ++i) {
-                       if (buf[i] == ' ')
-                               break;
-                       putc(buf[i]);
-               }
-       }
-       putc('\n');
-       return 0;
-}
diff --git a/board/avnet/fx12mm/xparameters.h b/board/avnet/fx12mm/xparameters.h
deleted file mode 100644 (file)
index 94f682f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * (C) Copyright 2008
- *
- * Georg Schardt <schardt@team-ctech.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- *
- * CAUTION: This file is based on the xparameters.h automatically
- * generated by libgen. Version: Xilinx EDK 10.1.02 Build EDK_K_SP2.5
- */
-
-#ifndef __XPARAMETER_H__
-#define __XPARAMETER_H__
-
-/* RS232 */
-#define XPAR_UARTNS550_0_CLOCK_FREQ_HZ 100000000
-#define XPAR_UARTNS550_0_BASEADDR 0x83E00000
-
-
-/* INT_C */
-#define XPAR_XPS_INTC_0_DEVICE_ID 0
-#define XPAR_XPS_INTC_0_BASEADDR 0x81800000
-#define XPAR_INTC_MAX_NUM_INTR_INPUTS 2
-
-/* CPU core clock */
-#define XPAR_CORE_CLOCK_FREQ_HZ 300000000
-#define XPAR_PLB_CLOCK_FREQ_HZ  100000000
-
-/* RAM */
-#define XPAR_DDR2_SDRAM_MEM_BASEADDR 0x00000000
-
-/* FLASH */
-#define XPAR_FLASH_MEM0_BASEADDR 0xFFC00000
-
-#endif
diff --git a/board/avnet/v5fx30teval/Kconfig b/board/avnet/v5fx30teval/Kconfig
deleted file mode 100644 (file)
index 079387b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-if TARGET_V5FX30TEVAL
-
-config SYS_BOARD
-       default "v5fx30teval"
-
-config SYS_VENDOR
-       default "avnet"
-
-config SYS_CONFIG_NAME
-       default "v5fx30teval"
-
-endif
diff --git a/board/avnet/v5fx30teval/MAINTAINERS b/board/avnet/v5fx30teval/MAINTAINERS
deleted file mode 100644 (file)
index 91dde7a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-V5FX30TEVAL BOARD
-M:     Ricardo Ribalda <ricardo.ribalda@uam.es>
-S:     Maintained
-F:     board/avnet/v5fx30teval/
-F:     include/configs/v5fx30teval.h
-F:     configs/v5fx30teval_defconfig
-F:     configs/v5fx30teval_flash_defconfig
diff --git a/board/avnet/v5fx30teval/Makefile b/board/avnet/v5fx30teval/Makefile
deleted file mode 100644 (file)
index 8c41af0..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# (C) Copyright 2008
-# Ricardo Ribalda,Universidad Autonoma de Madrid, ricardo.ribalda@uam.es
-# This work has been supported by: Qtechnology http://qtec.com/
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-obj-y  += v5fx30teval.o
-
-include $(srctree)/board/xilinx/ppc440-generic/Makefile
diff --git a/board/avnet/v5fx30teval/v5fx30teval.c b/board/avnet/v5fx30teval/v5fx30teval.c
deleted file mode 100644 (file)
index 68b0eb9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology  http://qtec.com/
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#include <config.h>
-#include <common.h>
-#include <asm/processor.h>
-
-
-int checkboard(void)
-{
-       puts("Avnet Virtex 5 FX30 Evaluation Board\n");
-       return 0;
-}
diff --git a/board/avnet/v5fx30teval/xparameters.h b/board/avnet/v5fx30teval/xparameters.h
deleted file mode 100644 (file)
index 95b8c28..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology  http://qtec.com/
- * based on xparameters.h by Xilinx
- *
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#ifndef XPARAMETER_H
-#define XPARAMETER_H
-
-#define XPAR_DDR2_SDRAM_MEM_BASEADDR   0x00000000
-#define XPAR_INTC_0_BASEADDR           0x81800000
-#define XPAR_UARTLITE_0_BASEADDR       0x84000000
-#define XPAR_FLASH_MEM0_BASEADDR       0xFF000000
-#define XPAR_PLB_CLOCK_FREQ_HZ         100000000
-#define XPAR_CORE_CLOCK_FREQ_HZ                400000000
-#define XPAR_INTC_MAX_NUM_INTR_INPUTS  13
-#define XPAR_UARTLITE_0_BAUDRATE       9600
-
-#endif
index 6a8fca61a0d451b6c407c87a3397bde2f1557eaa..e582abbaef364c96aaace212f614a4df77974302 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include <hwconfig.h>
@@ -1023,10 +1022,6 @@ int board_early_init_r(void)
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                        0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
        /*
         * Adjust core voltage according to voltage ID
         * This function changes I2C mux to channel 2.
index f1bed51d30480d1c6e35bb2e4ca54e00ede0db8b..1bd65a8e5578feb0905587892b62fe3bc482576e 100644 (file)
@@ -42,7 +42,7 @@ int __weak board_vdd_drop_compensation(void)
  * The IR chip can show up under the following addresses:
  * 0x08 (Verified on T1040RDB-PA,T4240RDB-PB,X-T4240RDB-16GPA)
  * 0x09 (Verified on T1040RDB-PA)
- * 0x38 (Verified on T2080QDS, T2081QDS)
+ * 0x38 (Verified on T2080QDS, T2081QDS, T4240RDB)
  */
 static int find_ir_chip_on_i2c(void)
 {
@@ -292,7 +292,7 @@ int adjust_vdd(ulong vdd_override)
                (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 #endif
        u32 fusesr;
-       u8 vid;
+       u8 vid, buf;
        int vdd_target, vdd_current, vdd_last;
        int ret, i2caddress;
        unsigned long vdd_string_override;
@@ -346,6 +346,21 @@ int adjust_vdd(ulong vdd_override)
                debug("VID: IR Chip found on I2C address 0x%02x\n", i2caddress);
        }
 
+       /* check IR chip work on Intel mode*/
+       ret = i2c_read(i2caddress,
+                      IR36021_INTEL_MODE_OOFSET,
+                      1, (void *)&buf, 1);
+       if (ret) {
+               printf("VID: failed to read IR chip mode.\n");
+               ret = -1;
+               goto exit;
+       }
+       if ((buf & IR36021_MODE_MASK) != IR36021_INTEL_MODE) {
+               printf("VID: IR Chip is not used in Intel mode.\n");
+               ret = -1;
+               goto exit;
+       }
+
        /* get the voltage ID from fuse status register */
        fusesr = in_be32(&gur->dcfg_fusesr);
        /*
index a9c7bb4790e4997b9a02e0a008d93942d888907e..9182c20bc9cc678299f3e53b594c5a86c88720c3 100644 (file)
 #define IR36021_LOOP1_VOUT_OFFSET      0x9A
 #define IR36021_MFR_ID_OFFSET          0x92
 #define IR36021_MFR_ID                 0x43
+#define IR36021_INTEL_MODE_OOFSET      0x14
+#define IR36021_MODE_MASK              0x20
+#define IR36021_INTEL_MODE             0x00
+#define IR36021_AMD_MODE               0x20
 
 /* step the IR regulator in 5mV increments */
 #define IR_VDD_STEP_DOWN               5
index 6f0fea1a3566a57c4efb4fec5078149bc767168e..f41985d2f66de5b887c3f0a561ca11695e99d7c2 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 
@@ -125,11 +124,6 @@ int board_early_init_r(void)
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, /* perms, wimge */
                        0, flash_esel, BOOKE_PAGESZ_256M, 1);   /* ts, esel, tsize, iprot */
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        return 0;
 }
 
index 0b288f2588fa2b86444dcbcd535ae3659f6b5b24..02085b6b7e4c3edc5e064da1460bfc48f447e2f0 100644 (file)
@@ -7,4 +7,3 @@
 #
 
 obj-y  := mx25pdk.o
-obj-y  += lowlevel_init.o
diff --git a/board/freescale/mx25pdk/lowlevel_init.S b/board/freescale/mx25pdk/lowlevel_init.S
deleted file mode 100644 (file)
index 8c581b5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright (c) 2011  Freescale Semiconductor
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-.globl lowlevel_init
-lowlevel_init:
-
-       mov     pc, lr
index 01dac72e85effc385364fa3173e133b3aff5ea32..788d3c3e35972b83260daa11498f057214826eae 100644 (file)
@@ -186,3 +186,6 @@ int checkboard(void)
 
        return 0;
 }
+
+/* Lowlevel init isn't used on mx25pdk, so just provide a dummy one here */
+void lowlevel_init(void) {}
index f8ae9733fc0ba5521bae4a461f31ca488feb673c..bbcc5bb0c6fcbee107349c1269d9e2a66d0682ed 100644 (file)
@@ -47,6 +47,9 @@ DECLARE_GLOBAL_DATA_PTR;
 #define QSPI_PAD_CTRL  \
        (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUE | PAD_CTL_PUS_PU47KOHM)
 
+#define NAND_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_SLOW | PAD_CTL_HYS)
+
+#define NAND_PAD_READY0_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU5KOHM)
 #ifdef CONFIG_SYS_I2C_MXC
 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
 /* I2C1 for PMIC */
@@ -196,6 +199,38 @@ static void iox74lv_init(void)
        gpio_direction_output(IOX_STCP, 1);
 };
 
+#ifdef CONFIG_NAND_MXS
+static iomux_v3_cfg_t const gpmi_pads[] = {
+       MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA2__NAND_DATA02 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA3__NAND_DATA03 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA4__NAND_DATA04 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA5__NAND_DATA05 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA6__NAND_DATA06 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_DATA7__NAND_DATA07 | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_CLK__NAND_CLE      | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_CMD__NAND_ALE      | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_STROBE__NAND_RE_B  | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SD3_RESET_B__NAND_WE_B | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_MCLK__NAND_WP_B   | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_RX_BCLK__NAND_CE3_B       | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_RX_SYNC__NAND_CE2_B       | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_RX_DATA__NAND_CE1_B       | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_TX_BCLK__NAND_CE0_B       | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_TX_SYNC__NAND_DQS | MUX_PAD_CTRL(NAND_PAD_CTRL),
+       MX7D_PAD_SAI1_TX_DATA__NAND_READY_B     | MUX_PAD_CTRL(NAND_PAD_READY0_CTRL),
+};
+
+static void setup_gpmi_nand(void)
+{
+       imx_iomux_v3_setup_multiple_pads(gpmi_pads, ARRAY_SIZE(gpmi_pads));
+
+       /* NAND_USDHC_BUS_CLK is set in rom */
+       set_clk_nand();
+}
+#endif
+
 #ifdef CONFIG_VIDEO_MXS
 static iomux_v3_cfg_t const lcd_pads[] = {
        MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
@@ -503,6 +538,10 @@ int board_init(void)
        setup_fec();
 #endif
 
+#ifdef CONFIG_NAND_MXS
+       setup_gpmi_nand();
+#endif
+
 #ifdef CONFIG_VIDEO_MXS
        setup_lcd();
 #endif
index e600bdbc2a87a38ab014d268aac95cbcfd733ed3..c6a724217fdb8195e71190bf6ad1153f0bb78b25 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 
@@ -140,8 +139,6 @@ int board_early_init_r(void)
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                        0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-       setup_portals();
        board_config_lanes_mux();
 
        return 0;
index 708afcaebfacb4cb22ae214027e264fcb4b4c15d..76793a1186ec3aba7db3d9a3d83e491fb90e67fc 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include <hwconfig.h>
@@ -279,10 +278,6 @@ int board_early_init_r(void)
        set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
-#endif
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
 #endif
        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
        board_mux_lane_to_slot();
index fddd240f98a4c25ec55bd777535ecc1f044a7861..01dbf381bdc96441e4e801a0809fce88e77e3032 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include "t102xrdb.h"
@@ -151,10 +150,6 @@ int board_early_init_r(void)
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 #endif
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
 #ifdef CONFIG_T1024RDB
        board_mux_lane();
 #endif
index eaca57fc5dfe05efd65b49de70d6e51edf0cfff6..d7d56b47c816115b2a21c9ac859dc2ed2776816c 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include <hwconfig.h>
@@ -152,10 +151,6 @@ int board_early_init_r(void)
        set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
-#endif
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
 #endif
        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
 
index 322765288b0881303c84d9df7c590f525c74748f..ec97677df84a541de575aeb4c621156bdd0a5be4 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/fsl_fdt.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include "../common/sleep.h"
@@ -84,11 +83,6 @@ int board_early_init_r(void)
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 #endif
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        return 0;
 }
 
index 7c89cd5ee9a0735e3b505b9d0fddbbdb9530a902..bfea3a15562b47a8140f3d874f2f45cae3eb00ae 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 
@@ -356,11 +355,6 @@ int board_early_init_r(void)
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        /* Disable remote I2C connection to qixis fpga */
        QIXIS_WRITE(brdcfg[5], QIXIS_READ(brdcfg[5]) & ~BRDCFG5_IRE);
 
index 0c2c1c565bdd115ad1332cfd43598bf710c19330..0cb05aa03f0788cac40011c16ed761bac18fd8da 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 #include "t208xrdb.h"
@@ -81,11 +80,6 @@ int board_early_init_r(void)
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        /*
         * Adjust core voltage according to voltage ID
         * This function changes I2C mux to channel 2.
index 54410943f28123b693480bd32ff6873181de6942..f1393f25f92506b16d853f79b99dfa9657db19b9 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -56,11 +55,6 @@ int board_early_init_r(void)
                MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        return 0;
 }
 
index 4f2cccd709d6554dbda9fd30e432265fb9b3e0b2..d6df144730ba27120cb2b693b7f0910d0ba9823d 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 
@@ -552,11 +551,6 @@ int board_early_init_r(void)
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
-
        /* Disable remote I2C connection to qixis fpga */
        QIXIS_WRITE(brdcfg[5], QIXIS_READ(brdcfg[5]) & ~BRDCFG5_IRE);
 
index fac442bfc8c8e9ab68eda0a9be8ad5fb74914a28..406fb132aea131188b6ed919340e35ad14b9271a 100644 (file)
 #include <asm/immap_85xx.h>
 #include <asm/fsl_law.h>
 #include <asm/fsl_serdes.h>
-#include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 #include <fm_eth.h>
 
 #include "t4rdb.h"
 #include "cpld.h"
+#include "../common/vid.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -75,10 +75,12 @@ int board_early_init_r(void)
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                0, flash_esel, BOOKE_PAGESZ_256M, 1);
 
-       set_liodns();
-#ifdef CONFIG_SYS_DPAA_QBMAN
-       setup_portals();
-#endif
+       /*
+        * Adjust core voltage according to voltage ID
+        * This function changes I2C mux to channel 2.
+       */
+       if (adjust_vdd(0))
+               printf("Warning: Adjusting core voltage failed.\n");
 
        return 0;
 }
index 1b97a8fea85537307764cbb6731f9d4afffb966d..d12d74202c51a6ed1f6dc2d0eade9be6e4c865b7 100644 (file)
 
 int arch_early_init_r(void)
 {
-       struct udevice *dev;
-       int ret;
-
-       /* Make sure the platform controller hub is up and running */
-       ret = uclass_get_device(UCLASS_PCH, 0, &dev);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index 9f6494561c6a43378f899fda6d4702344b6cf63a..52a1906c7f0703f6d8dec93cd6f1486aa5aa6aa2 100644 (file)
@@ -113,6 +113,7 @@ static void set_mac_to_sh_giga_eth_register(int channel, char *mac_string)
        writel(val, &ether->malr);
 }
 
+#if defined(CONFIG_SH_32BIT)
 /*****************************************************************
  * This PMB must be set on this timing. The lowlevel_init is run on
  * Area 0(phys 0x00000000), so we have to map it.
@@ -154,13 +155,16 @@ static void set_pmb_on_board_init(void)
        writel(mk_pmb_addr_val(0x98), PMB_ADDR_BASE(7));
        writel(mk_pmb_data_val(0x58, 0, 1, 1, 0, 1, 1), PMB_DATA_BASE(7));
 }
+#endif
 
 int board_init(void)
 {
        struct gether_control_regs *gether = GETHER_CONTROL_BASE;
 
        init_gpio();
+#if defined(CONFIG_SH_32BIT)
        set_pmb_on_board_init();
+#endif
 
        /* Sets TXnDLY to B'010 */
        writel(0x00000202, &gether->gbecont);
index 7c69be918f16d7e90a765bf29958140dee13d15e..a334aa336d14c18af8e5447ae1b16d6ee4810b4a 100644 (file)
@@ -71,8 +71,11 @@ config MACH_SUN8I_A33
 config MACH_SUN8I_H3
        bool "sun8i (Allwinner H3)"
        select CPU_V7
+       select CPU_V7_HAS_NONSEC
+       select CPU_V7_HAS_VIRT
        select SUNXI_GEN_SUN6I
        select SUPPORT_SPL
+       select ARMV7_BOOT_SEC_DEFAULT if OLD_SUNXI_KERNEL_COMPAT
 
 config MACH_SUN8I_A83T
        bool "sun8i (Allwinner A83T)"
@@ -92,6 +95,12 @@ config MACH_SUN8I
        bool
        default y if MACH_SUN8I_A23 || MACH_SUN8I_A33 || MACH_SUN8I_H3 || MACH_SUN8I_A83T
 
+config DRAM_TYPE
+       int "sunxi dram type"
+       depends on MACH_SUN8I_A83T
+       default 3
+       ---help---
+       Set the dram type, 3: DDR3, 7: LPDDR3
 
 config DRAM_CLK
        int "sunxi dram clock speed"
index 131c3415aa3287611532428b862dd900f72b5cef..739b6fdc88f0e651e8b88911e1654070f5efe2b4 100644 (file)
@@ -183,6 +183,11 @@ S: Maintained
 F:     configs/Sinlinx_SinA33_defconfig
 W:     http://linux-sunxi.org/Sinlinx_SinA33
 
+SINOVOIP BPI M3 A83T BOARD
+M:     VishnuPatekar <vishnupatekar0510@gmail.com>
+S:     Maintained
+F:     configs/Sinovoip_BPI_M3_defconfig
+
 WEXLER-TAB7200 BOARD
 M:     Aleksei Mamlin <mamlinav@gmail.com>
 S:     Maintained
index 1cc39e4d1840e8f0a98ae61269b0a5d3bd11d926..420481a9fb849797bf97c1681d96480a45991801 100644 (file)
@@ -452,24 +452,22 @@ void sunxi_board_init(void)
        power_failed |= axp_set_dcdc5(CONFIG_AXP_DCDC5_VOLT);
 #endif
 
-#ifdef CONFIG_AXP221_POWER
+#if defined CONFIG_AXP221_POWER || defined CONFIG_AXP818_POWER
        power_failed |= axp_set_aldo1(CONFIG_AXP_ALDO1_VOLT);
 #endif
-#ifndef CONFIG_AXP818_POWER
        power_failed |= axp_set_aldo2(CONFIG_AXP_ALDO2_VOLT);
-#endif
-#if !defined(CONFIG_AXP152_POWER) && !defined(CONFIG_AXP818_POWER)
+#if !defined(CONFIG_AXP152_POWER)
        power_failed |= axp_set_aldo3(CONFIG_AXP_ALDO3_VOLT);
 #endif
 #ifdef CONFIG_AXP209_POWER
        power_failed |= axp_set_aldo4(CONFIG_AXP_ALDO4_VOLT);
 #endif
 
-#ifdef CONFIG_AXP221_POWER
-       power_failed |= axp_set_dldo1(CONFIG_AXP_DLDO1_VOLT);
-       power_failed |= axp_set_dldo2(CONFIG_AXP_DLDO2_VOLT);
-       power_failed |= axp_set_dldo3(CONFIG_AXP_DLDO3_VOLT);
-       power_failed |= axp_set_dldo4(CONFIG_AXP_DLDO4_VOLT);
+#if defined(CONFIG_AXP221_POWER) || defined(CONFIG_AXP818_POWER)
+       power_failed |= axp_set_dldo(1, CONFIG_AXP_DLDO1_VOLT);
+       power_failed |= axp_set_dldo(2, CONFIG_AXP_DLDO2_VOLT);
+       power_failed |= axp_set_dldo(3, CONFIG_AXP_DLDO3_VOLT);
+       power_failed |= axp_set_dldo(4, CONFIG_AXP_DLDO4_VOLT);
        power_failed |= axp_set_eldo(1, CONFIG_AXP_ELDO1_VOLT);
        power_failed |= axp_set_eldo(2, CONFIG_AXP_ELDO2_VOLT);
        power_failed |= axp_set_eldo(3, CONFIG_AXP_ELDO3_VOLT);
diff --git a/board/theadorable/MAINTAINERS b/board/theadorable/MAINTAINERS
new file mode 100644 (file)
index 0000000..5ae6b64
--- /dev/null
@@ -0,0 +1,7 @@
+THEADORABLE BOARD
+M:     Stefan Roese <sr@denx.de>
+S:     Maintained
+F:     board/theadorable/
+F:     include/configs/theadorable.h
+F:     configs/theadorable_debug_defconfig
+F:     configs/theadorable_defconfig
diff --git a/board/theadorable/Makefile b/board/theadorable/Makefile
new file mode 100644 (file)
index 0000000..9d5b39e
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2015-2016 Stefan Roese <sr@denx.de>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := theadorable.o
diff --git a/board/theadorable/kwbimage.cfg b/board/theadorable/kwbimage.cfg
new file mode 100644 (file)
index 0000000..4f3b7b2
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Copyright (C) 2015-2016 Stefan Roese <sr@denx.de>
+#
+
+# Armada XP uses version 1 image format
+VERSION                1
+
+# Boot Media configurations
+BOOT_FROM      spi
+
+# Binary Header (bin_hdr) with DDR3 training code
+BINARY spl/u-boot-spl-dtb.bin 0000005b 00000068
diff --git a/board/theadorable/theadorable.c b/board/theadorable/theadorable.c
new file mode 100644 (file)
index 0000000..0e23265
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2015-2016 Stefan Roese <sr@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+#ifdef CONFIG_NET
+#include <netdev.h>
+#endif
+
+#include "../drivers/ddr/marvell/axp/ddr3_hw_training.h"
+#include "../arch/arm/mach-mvebu/serdes/axp/high_speed_env_spec.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define THEADORABLE_GPP_OUT_ENA_LOW    0x00336780
+#define THEADORABLE_GPP_OUT_ENA_MID    0x00003cf0
+#define THEADORABLE_GPP_OUT_ENA_HIGH   (~(0x0))
+
+#define THEADORABLE_GPP_OUT_VAL_LOW    0x2c0c983f
+#define THEADORABLE_GPP_OUT_VAL_MID    0x0007000c
+#define THEADORABLE_GPP_OUT_VAL_HIGH   0x00000000
+
+/* DDR3 static configuration */
+static MV_DRAM_MC_INIT ddr3_theadorable[MV_MAX_DDR3_STATIC_SIZE] = {
+       {0x00001400, 0x7301ca28},       /* DDR SDRAM Configuration Register */
+       {0x00001404, 0x30000800},       /* Dunit Control Low Register */
+       {0x00001408, 0x44149887},       /* DDR SDRAM Timing (Low) Register */
+       {0x0000140C, 0x38d93fc7},       /* DDR SDRAM Timing (High) Register */
+       {0x00001410, 0x1b100001},       /* DDR SDRAM Address Control Register */
+       {0x00001424, 0x0000f3ff},       /* Dunit Control High Register */
+       {0x00001428, 0x000f8830},       /* ODT Timing (Low) Register */
+       {0x0000142C, 0x014c50f4},       /* DDR3 Timing Register */
+       {0x0000147C, 0x0000c671},       /* ODT Timing (High) Register */
+
+       {0x00001494, 0x00010000},       /* DDR SDRAM ODT Control (Low) Reg */
+       {0x0000149C, 0x00000001},       /* DDR Dunit ODT Control Register */
+       {0x000014A0, 0x00000001},       /* DRAM FIFO Control Register */
+       {0x000014A8, 0x00000101},       /* AXI Control Register */
+
+       /*
+        * DO NOT Modify - Open Mbus Window - 2G - Mbus is required for the
+        * training sequence
+        */
+       {0x000200e8, 0x3fff0e01},
+       {0x00020184, 0x3fffffe0},       /* Close fast path Window to - 2G */
+
+       {0x0001504, 0x7fffffe1},        /* CS0 Size */
+       {0x000150C, 0x00000000},        /* CS1 Size */
+       {0x0001514, 0x00000000},        /* CS2 Size */
+       {0x000151C, 0x00000000},        /* CS3 Size */
+
+       {0x00020220, 0x00000007},       /* Reserved */
+
+       {0x00001538, 0x00000009},       /* Read Data Sample Delays Register */
+       {0x0000153C, 0x00000009},       /* Read Data Ready Delay Register */
+
+       {0x000015D0, 0x00000650},       /* MR0 */
+       {0x000015D4, 0x00000044},       /* MR1 */
+       {0x000015D8, 0x00000010},       /* MR2 */
+       {0x000015DC, 0x00000000},       /* MR3 */
+       {0x000015E0, 0x00000001},
+       {0x000015E4, 0x00203c18},       /* ZQDS Configuration Register */
+       {0x000015EC, 0xf800a225},       /* DDR PHY */
+
+       /* Recommended Settings from Marvell for 4 x 16 bit devices: */
+       {0x000014C0, 0x192424c9},       /* DRAM addr and Ctrl Driving Strenght*/
+       {0x000014C4, 0x0aaa24c9},       /* DRAM Data and DQS Driving Strenght */
+
+       {0x0, 0x0}
+};
+
+static MV_DRAM_MODES board_ddr_modes[MV_DDR3_MODES_NUMBER] = {
+       {"theadorable_1333-667", 0x3, 0x5, 0x0, A0, ddr3_theadorable,  NULL},
+};
+
+extern MV_SERDES_CHANGE_M_PHY serdes_change_m_phy[];
+
+/*
+ * Lane0 - PCIE0.0 X1 (to WIFI Module)
+ * Lane5 - SATA0
+ * Lane6 - SATA1
+ * Lane7 - SGMII0 (to Ethernet Phy)
+ * Lane8-11 - PCIE2.0 X4 (to PEX Switch)
+ * all other lanes are disabled
+ */
+MV_BIN_SERDES_CFG theadorable_serdes_cfg[] = {
+       { MV_PEX_ROOT_COMPLEX, 0x22200001, 0x00001111,
+         { PEX_BUS_MODE_X1, PEX_BUS_DISABLED, PEX_BUS_MODE_X4,
+           PEX_BUS_DISABLED },
+         0x0060, serdes_change_m_phy
+       },
+};
+
+MV_DRAM_MODES *ddr3_get_static_ddr_mode(void)
+{
+       /* Only one mode supported for this board */
+       return &board_ddr_modes[0];
+}
+
+MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
+{
+       return &theadorable_serdes_cfg[0];
+}
+
+int board_early_init_f(void)
+{
+       /* Configure MPP */
+       writel(0x00000000, MVEBU_MPP_BASE + 0x00);
+       writel(0x03300000, MVEBU_MPP_BASE + 0x04);
+       writel(0x00000033, MVEBU_MPP_BASE + 0x08);
+       writel(0x00000000, MVEBU_MPP_BASE + 0x0c);
+       writel(0x11110000, MVEBU_MPP_BASE + 0x10);
+       writel(0x00221100, MVEBU_MPP_BASE + 0x14);
+       writel(0x00000000, MVEBU_MPP_BASE + 0x18);
+       writel(0x00000000, MVEBU_MPP_BASE + 0x1c);
+       writel(0x00000000, MVEBU_MPP_BASE + 0x20);
+
+       /* Configure GPIO */
+       writel(THEADORABLE_GPP_OUT_VAL_LOW, MVEBU_GPIO0_BASE + 0x00);
+       writel(THEADORABLE_GPP_OUT_ENA_LOW, MVEBU_GPIO0_BASE + 0x04);
+       writel(THEADORABLE_GPP_OUT_VAL_MID, MVEBU_GPIO1_BASE + 0x00);
+       writel(THEADORABLE_GPP_OUT_ENA_MID, MVEBU_GPIO1_BASE + 0x04);
+       writel(THEADORABLE_GPP_OUT_VAL_HIGH, MVEBU_GPIO2_BASE + 0x00);
+       writel(THEADORABLE_GPP_OUT_ENA_HIGH, MVEBU_GPIO2_BASE + 0x04);
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* adress of boot parameters */
+       gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       puts("Board: theadorable\n");
+
+       return 0;
+}
+
+#ifdef CONFIG_NET
+int board_eth_init(bd_t *bis)
+{
+       cpu_eth_init(bis); /* Built in controller(s) come first */
+       return pci_eth_init(bis);
+}
+#endif
+
+int board_video_init(void)
+{
+       struct mvebu_lcd_info lcd_info;
+
+       /* Reserved memory area via CONFIG_SYS_MEM_TOP_HIDE */
+       lcd_info.fb_base        = gd->ram_size;
+       lcd_info.x_res          = 240;
+       lcd_info.x_fp           = 1;
+       lcd_info.x_bp           = 45;
+       lcd_info.y_res          = 320;
+       lcd_info.y_fp           = 1;
+       lcd_info.y_bp           = 3;
+
+       return mvebu_lcd_register_init(&lcd_info);
+}
index d891a3844ca3836284a907faa7e5514840bcdd84..eca218c9cf003d8bb95f31678e303dba6c1ae11a 100644 (file)
@@ -43,7 +43,7 @@ ulong flash_get_size (ulong base, int banknum);
 /* Local functions */
 static int detect_num_flash_banks(void);
 static long int get_ddr_bank_size(short cs, long *base);
-static void set_cs_bounds(short cs, long base, long size);
+static void set_cs_bounds(short cs, ulong base, ulong size);
 static void set_cs_config(short cs, long config);
 static void set_ddr_config(void);
 
@@ -314,7 +314,7 @@ static long int get_ddr_bank_size(short cs, long *base)
 /**************************************************************************
  * Sets DDR bank CS bounds.
  */
-static void set_cs_bounds(short cs, long base, long size)
+static void set_cs_bounds(short cs, ulong base, ulong size)
 {
        debug("Setting bounds %08lx, %08lx for cs %d\n", base, size, cs);
        if(size == 0){
index dfa6293222236ad2f01ff3a81e80dc85ad03ce24..ccd4ec955b5b74f6d55ec95c50d2828e1b55c589 100644 (file)
@@ -12,7 +12,6 @@
 #include <common.h>
 #include <config.h>
 #include <fdtdec.h>
-#include <netdev.h>
 #include <asm/processor.h>
 #include <asm/microblaze_intc.h>
 #include <asm/asm.h>
@@ -24,7 +23,6 @@ DECLARE_GLOBAL_DATA_PTR;
 static int reset_pin = -1;
 #endif
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
 ulong ram_base;
 
 void dram_init_banksize(void)
@@ -58,14 +56,6 @@ int dram_init(void)
 
        return 0;
 };
-#else
-int dram_init(void)
-{
-       gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
-
-       return 0;
-}
-#endif
 
 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
@@ -86,7 +76,7 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return 0;
 }
 
-int gpio_init (void)
+static int gpio_init(void)
 {
 #ifdef CONFIG_XILINX_GPIO
        reset_pin = gpio_alloc(CONFIG_SYS_GPIO_0_ADDR, "reset", 1);
@@ -96,32 +86,9 @@ int gpio_init (void)
        return 0;
 }
 
-void board_init(void)
+int board_late_init(void)
 {
        gpio_init();
-}
 
-int board_eth_init(bd_t *bis)
-{
-       int ret = 0;
-
-#ifdef CONFIG_XILINX_AXIEMAC
-       ret |= xilinx_axiemac_initialize(bis, XILINX_AXIEMAC_BASEADDR,
-                                               XILINX_AXIDMA_BASEADDR);
-#endif
-
-#if defined(CONFIG_XILINX_EMACLITE) && defined(XILINX_EMACLITE_BASEADDR)
-       u32 txpp = 0;
-       u32 rxpp = 0;
-# ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
-       txpp = 1;
-# endif
-# ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG
-       rxpp = 1;
-# endif
-       ret |= xilinx_emaclite_initialize(bis, XILINX_EMACLITE_BASEADDR,
-                       txpp, rxpp);
-#endif
-
-       return ret;
+       return 0;
 }
index 8ba146cb88db7833f8b296b73390b20a63bb8827..ccb528ed9266646b5d4786efe30680925f9a6639 100644 (file)
 #define XILINX_TIMER_BASEADDR  0x41c00000
 #define XILINX_TIMER_IRQ       0
 
-/* Uart pheriphery is RS232_Uart */
-#define XILINX_UARTLITE_BASEADDR       0x40600000
-#define XILINX_UARTLITE_BAUDRATE       115200
-
-/* IIC pheriphery is IIC_EEPROM */
-#define XILINX_IIC_0_BASEADDR  0x40800000
-#define XILINX_IIC_0_FREQ      100000
-#define XILINX_IIC_0_BIT       0
-
 /* GPIO is LEDs_4Bit*/
 #define XILINX_GPIO_BASEADDR   0x40000000
 
 #define XILINX_FLASH_START     0x2c000000
 #define XILINX_FLASH_SIZE      0x00800000
 
-/* Main Memory is DDR_SDRAM_64Mx32 */
-#define XILINX_RAM_START       0x28000000
-#define XILINX_RAM_SIZE        0x04000000
-
-/* Sysace Controller is SysACE_CompactFlash */
-#define XILINX_SYSACE_BASEADDR 0x41800000
-#define XILINX_SYSACE_HIGHADDR 0x4180ffff
-#define XILINX_SYSACE_MEM_WIDTH        16
-
-/* Ethernet controller is Ethernet_MAC */
-#define XILINX_EMACLITE_BASEADDR       0x40C00000
-
 /* Watchdog IP is wxi_timebase_wdt_0 */
 #define XILINX_WATCHDOG_BASEADDR       0x50000000
 #define XILINX_WATCHDOG_IRQ            1
diff --git a/board/xilinx/ml507/Kconfig b/board/xilinx/ml507/Kconfig
deleted file mode 100644 (file)
index d580a7b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-if TARGET_ML507
-
-config SYS_BOARD
-       default "ml507"
-
-config SYS_VENDOR
-       default "xilinx"
-
-config SYS_CONFIG_NAME
-       default "ml507"
-
-endif
diff --git a/board/xilinx/ml507/MAINTAINERS b/board/xilinx/ml507/MAINTAINERS
deleted file mode 100644 (file)
index 8b40f44..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-ML507 BOARD
-M:     Ricardo Ribalda <ricardo.ribalda@uam.es>
-S:     Maintained
-F:     board/xilinx/ml507/
-F:     include/configs/ml507.h
-F:     configs/ml507_defconfig
-F:     configs/ml507_flash_defconfig
diff --git a/board/xilinx/ml507/Makefile b/board/xilinx/ml507/Makefile
deleted file mode 100644 (file)
index 9a3809f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# (C) Copyright 2008
-# Ricardo Ribalda,Universidad Autonoma de Madrid, ricardo.ribalda@uam.es
-# This work has been supported by: Qtechnology http://qtec.com/
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-obj-y  += ml507.o
-
-include $(srctree)/board/xilinx/ppc440-generic/Makefile
diff --git a/board/xilinx/ml507/ml507.c b/board/xilinx/ml507/ml507.c
deleted file mode 100644 (file)
index 83b764b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology  http://qtec.com/
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#include <config.h>
-#include <common.h>
-#include <asm/processor.h>
-
-
-int checkboard(void)
-{
-       puts("Xilinx ML507 Board\n");
-       return 0;
-}
diff --git a/board/xilinx/ml507/xparameters.h b/board/xilinx/ml507/xparameters.h
deleted file mode 100644 (file)
index e30e592..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology  http://qtec.com/
- * based on xparameters-ml507.h by Xilinx
- *
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#ifndef XPARAMETER_H
-#define XPARAMETER_H
-
-#define XPAR_DDR2_SDRAM_MEM_BASEADDR   0x00000000
-#define XPAR_IIC_EEPROM_BASEADDR       0x81600000
-#define XPAR_INTC_0_BASEADDR           0x81800000
-#define XPAR_UARTLITE_0_BASEADDR       0x84000000
-#define XPAR_FLASH_MEM0_BASEADDR       0xFE000000
-#define XPAR_PLB_CLOCK_FREQ_HZ         100000000
-#define XPAR_CORE_CLOCK_FREQ_HZ                400000000
-#define XPAR_INTC_MAX_NUM_INTR_INPUTS  13
-#define XPAR_UARTLITE_0_BAUDRATE       9600
-
-#endif
index 2b0c98dc8b7346d1430531de24a931f43a1b9e80..ba48f50c29bf9c38d6c40bdbf0e3a431f9bae0ec 100644 (file)
@@ -1,5 +1,5 @@
 PPC405-GENERIC BOARD
-M:     Ricardo Ribalda <ricardo.ribalda@uam.es>
+M:     Ricardo Ribalda <ricardo.ribalda@gmail.com>
 S:     Maintained
 F:     board/xilinx/ppc405-generic/
 F:     include/configs/xilinx-ppc405-generic.h
index c9da870657477df299f1708d593d2b704c037285..2800f68626408d2897aaefd6ba49c93c0282a7d5 100644 (file)
@@ -3,10 +3,10 @@
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # (C) Copyright 2008
-# Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+# Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
 # Work supported by Qtechnology http://www.qtec.com
 #
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y  += ../../xilinx/ppc405-generic/xilinx_ppc405_generic.o
+obj-y  += xilinx_ppc405_generic.o
index e3dd468f1eb36df3c221e740d9beda797cb1fd96..3729f07624a3420b2fc733e30363a5f3fe58f410 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  *
  * SPDX-License-Identifier:    GPL-2.0+
 #include <common.h>
 #include <asm/processor.h>
 
-ulong __get_PCI_freq(void)
+ulong get_PCI_freq(void)
 {
        return 0;
 }
 
-ulong get_PCI_freq(void) __attribute__((weak, alias("__get_PCI_freq")));
-
-int __board_pre_init(void)
-{
-       return 0;
-}
-int board_pre_init(void) __attribute__((weak, alias("__board_pre_init")));
-
-int __checkboard(void)
+int checkboard(void)
 {
        puts("Xilinx PPC405 Generic Board\n");
        return 0;
 }
-int checkboard(void) __attribute__((weak, alias("__checkboard")));
 
-phys_size_t __initdram(int board_type)
+phys_size_t initdram(int board_type)
 {
        return get_ram_size(XPAR_DDR2_SDRAM_MEM_BASEADDR,
                            CONFIG_SYS_SDRAM_SIZE_MB * 1024 * 1024);
 }
-phys_size_t initdram(int) __attribute__((weak, alias("__initdram")));
 
-void __get_sys_info(sys_info_t *sysInfo)
+void get_sys_info(sys_info_t *sys_info)
 {
-       sysInfo->freqProcessor = XPAR_CORE_CLOCK_FREQ_HZ;
-       sysInfo->freqPLB = XPAR_PLB_CLOCK_FREQ_HZ;
-       sysInfo->freqPCI = 0;
+       sys_info->freqProcessor = XPAR_CORE_CLOCK_FREQ_HZ;
+       sys_info->freqPLB = XPAR_PLB_CLOCK_FREQ_HZ;
+       sys_info->freqPCI = 0;
 
        return;
 }
-void get_sys_info(sys_info_t *) __attribute__((weak, alias("__get_sys_info")));
+
+int get_serial_clock(void){
+       return XPAR_UARTNS550_0_CLOCK_FREQ_HZ;
+}
index f0ff78fca565a53af36f82b46df4091be9b2c9ed..c3df9e51091f26977d56e4a070b9c7b3b17c3a15 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * based on xparameters-ml507.h by Xilinx
  *
 #define XPAR_IIC_EEPROM_BASEADDR       0x81600000
 #define XPAR_INTC_0_BASEADDR           0x81800000
 #define XPAR_SPI_0_BASEADDR             0x83400000
-#define XPAR_UARTLITE_0_BASEADDR       0x84000000
 #define XPAR_FLASH_MEM0_BASEADDR       0xFE000000
 #define XPAR_PLB_CLOCK_FREQ_HZ         100000000
 #define XPAR_CORE_CLOCK_FREQ_HZ                400000000
-#define XPAR_INTC_MAX_NUM_INTR_INPUTS  13
-#define XPAR_UARTLITE_0_BAUDRATE       9600
+#define XPAR_INTC_MAX_NUM_INTR_INPUTS  32
 #define XPAR_SPI_0_NUM_TRANSFER_BITS   8
+#define XPAR_UARTNS550_0_CLOCK_FREQ_HZ 100000000
 
 #endif
index 2d0b11af914bfdf002193747f220ae08c226159d..0258c8204ae143116ada7800faa1db5cb7d597d3 100644 (file)
@@ -1,5 +1,5 @@
 PPC440-GENERIC BOARD
-M:     Ricardo Ribalda <ricardo.ribalda@uam.es>
+M:     Ricardo Ribalda <ricardo.ribalda@gmail.com>
 S:     Maintained
 F:     board/xilinx/ppc440-generic/
 F:     include/configs/xilinx-ppc440-generic.h
index 0acd95d6e4e2b01a54883f56837d67c6ee4b49c3..4d5f41029ac684a17ace942f0dd093c50a91f9c3 100644 (file)
@@ -3,11 +3,11 @@
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # (C) Copyright 2008
-# Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+# Ricardo Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
 # Work supported by Qtechnology http://www.qtec.com
 #
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y  += ../../xilinx/ppc440-generic/xilinx_ppc440_generic.o
-extra-y        += ../../xilinx/ppc440-generic/init.o
+obj-y  += xilinx_ppc440_generic.o
+extra-y += init.o
index 4598a376843a4ecaee9dc631cee9cf91fead0e9d..f9ff35f51b7a1449d5eccce685aa93f4a60a574b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  *  This work has been supported by: QTechnology  http://qtec.com/
  *
  * SPDX-License-Identifier:    GPL-2.0+
index 74df2f4ff785fb0d44cbf00f0cce4ce2ca3a03f4..d8233529304d018b1d720d31b67e299a1244135a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  *
  * SPDX-License-Identifier:    GPL-2.0+
@@ -8,34 +8,51 @@
 
 #include <config.h>
 #include <common.h>
+#include <netdev.h>
 #include <asm/processor.h>
 
-int __board_pre_init(void)
-{
-       return 0;
-}
-int board_pre_init(void) __attribute__((weak, alias("__board_pre_init")));
-
-int __checkboard(void)
+int checkboard(void)
 {
        puts("Xilinx PPC440 Generic Board\n");
        return 0;
 }
-int checkboard(void) __attribute__((weak, alias("__checkboard")));
 
-phys_size_t __initdram(int board_type)
+phys_size_t initdram(int board_type)
 {
        return get_ram_size(XPAR_DDR2_SDRAM_MEM_BASEADDR,
                            CONFIG_SYS_SDRAM_SIZE_MB * 1024 * 1024);
 }
-phys_size_t initdram(int) __attribute__((weak, alias("__initdram")));
 
-void __get_sys_info(sys_info_t *sysInfo)
+void get_sys_info(sys_info_t *sys_info)
 {
-       sysInfo->freqProcessor = XPAR_CORE_CLOCK_FREQ_HZ;
-       sysInfo->freqPLB = XPAR_PLB_CLOCK_FREQ_HZ;
-       sysInfo->freqPCI = 0;
+       sys_info->freqProcessor = XPAR_CORE_CLOCK_FREQ_HZ;
+       sys_info->freqPLB = XPAR_PLB_CLOCK_FREQ_HZ;
+       sys_info->freqPCI = 0;
 
        return;
 }
-void get_sys_info(sys_info_t *) __attribute__((weak, alias("__get_sys_info")));
+
+int get_serial_clock(void){
+       return XPAR_UARTNS550_0_CLOCK_FREQ_HZ;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       int ret = 0;
+
+       puts("Init xilinx temac\n");
+#ifdef XPAR_LLTEMAC_0_BASEADDR
+       ret |= xilinx_ll_temac_eth_init(bis, XPAR_LLTEMAC_0_BASEADDR,
+                       XILINX_LL_TEMAC_M_SDMA_DCR | XILINX_LL_TEMAC_M_SDMA_PLB,
+                       XPAR_LLTEMAC_0_LLINK_CONNECTED_BASEADDR);
+
+#endif
+
+#ifdef XPAR_LLTEMAC_1_BASEADDR
+       ret |= xilinx_ll_temac_eth_init(bis, XPAR_LLTEMAC_1_BASEADDR,
+                       XILINX_LL_TEMAC_M_SDMA_DCR | XILINX_LL_TEMAC_M_SDMA_PLB,
+                       XPAR_LLTEMAC_1_LLINK_CONNECTED_BASEADDR);
+#endif
+
+       return ret;
+}
index e30e592bbe1257a3b964cbf866e61243f4c1bd68..b45a6a1d7668176e2c595992740d325618dd43e2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * based on xparameters-ml507.h by Xilinx
  *
 
 #define XPAR_DDR2_SDRAM_MEM_BASEADDR   0x00000000
 #define XPAR_IIC_EEPROM_BASEADDR       0x81600000
-#define XPAR_INTC_0_BASEADDR           0x81800000
-#define XPAR_UARTLITE_0_BASEADDR       0x84000000
-#define XPAR_FLASH_MEM0_BASEADDR       0xFE000000
+#define XPAR_INTC_0_BASEADDR           0x87000000
+#define XPAR_FLASH_MEM0_BASEADDR       0xF0000000
 #define XPAR_PLB_CLOCK_FREQ_HZ         100000000
 #define XPAR_CORE_CLOCK_FREQ_HZ                400000000
-#define XPAR_INTC_MAX_NUM_INTR_INPUTS  13
-#define XPAR_UARTLITE_0_BAUDRATE       9600
+#define XPAR_INTC_MAX_NUM_INTR_INPUTS  32
+#define XPAR_UARTNS550_0_CLOCK_FREQ_HZ 100000000
+#define XPAR_LLTEMAC_0_LLINK_CONNECTED_BASEADDR 0x80
+#define XPAR_LLTEMAC_1_LLINK_CONNECTED_BASEADDR 0x98
+#define XPAR_LLTEMAC_0_BASEADDR                0x83000000
+#define XPAR_LLTEMAC_1_BASEADDR                0x83000040
 
 #endif
index 414f5302a0662fb860b5a3410d67b3e80df349b1..01bae5d67e3f9ee686013a4db934a7ff9cac9144 100644 (file)
@@ -8,7 +8,6 @@
 #include <fdtdec.h>
 #include <fpga.h>
 #include <mmc.h>
-#include <netdev.h>
 #include <zynqpl.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
@@ -94,34 +93,11 @@ int board_late_init(void)
 #ifdef CONFIG_DISPLAY_BOARDINFO
 int checkboard(void)
 {
-       puts("Board:\tXilinx Zynq\n");
+       puts("Board: Xilinx Zynq\n");
        return 0;
 }
 #endif
 
-int board_eth_init(bd_t *bis)
-{
-       u32 ret = 0;
-
-#ifdef CONFIG_XILINX_AXIEMAC
-       ret |= xilinx_axiemac_initialize(bis, XILINX_AXIEMAC_BASEADDR,
-                                               XILINX_AXIDMA_BASEADDR);
-#endif
-#ifdef CONFIG_XILINX_EMACLITE
-       u32 txpp = 0;
-       u32 rxpp = 0;
-# ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
-       txpp = 1;
-# endif
-# ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG
-       rxpp = 1;
-# endif
-       ret |= xilinx_emaclite_initialize(bis, XILINX_EMACLITE_BASEADDR,
-                       txpp, rxpp);
-#endif
-       return ret;
-}
-
 int dram_init(void)
 {
 #if CONFIG_IS_ENABLED(OF_CONTROL)
index 2cf47125d433c1f99c23aa803cf1d9d6c622963b..44d347ed3bf0e857244ebb2971bf7990db73432e 100644 (file)
@@ -9,6 +9,7 @@
 #include <netdev.h>
 #include <ahci.h>
 #include <scsi.h>
+#include <asm/arch/clk.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
@@ -28,10 +29,18 @@ int board_early_init_r(void)
 {
        u32 val;
 
-       val = readl(&crlapb_base->timestamp_ref_ctrl);
-       val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT;
-       writel(val, &crlapb_base->timestamp_ref_ctrl);
-
+       if (current_el() == 3) {
+               val = readl(&crlapb_base->timestamp_ref_ctrl);
+               val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT;
+               writel(val, &crlapb_base->timestamp_ref_ctrl);
+
+               /* Program freq register in System counter */
+               writel(zynqmp_get_system_timer_freq(),
+                      &iou_scntr_secure->base_frequency_id_register);
+               /* And enable system counter */
+               writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN,
+                      &iou_scntr_secure->counter_control_register);
+       }
        /* Program freq register in System counter and enable system counter */
        writel(gd->cpu_clk, &iou_scntr->base_frequency_id_register);
        writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_HDBG |
@@ -48,11 +57,6 @@ int dram_init(void)
        return 0;
 }
 
-int timer_init(void)
-{
-       return 0;
-}
-
 void reset_cpu(ulong addr)
 {
 }
@@ -73,11 +77,36 @@ int board_late_init(void)
        reg = readl(&crlapb_base->boot_mode);
        bootmode = reg & BOOT_MODES_MASK;
 
+       puts("Bootmode: ");
        switch (bootmode) {
-       case SD_MODE:
+       case JTAG_MODE:
+               puts("JTAG_MODE\n");
+               setenv("modeboot", "jtagboot");
+               break;
+       case QSPI_MODE_24BIT:
+       case QSPI_MODE_32BIT:
+               setenv("modeboot", "qspiboot");
+               puts("QSPI_MODE\n");
+               break;
        case EMMC_MODE:
+               puts("EMMC_MODE\n");
+               setenv("modeboot", "sdboot");
+               break;
+       case SD_MODE:
+               puts("SD_MODE\n");
                setenv("modeboot", "sdboot");
                break;
+       case SD_MODE1:
+               puts("SD_MODE1\n");
+#if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
+               setenv("sdbootdev", "1");
+#endif
+               setenv("modeboot", "sdboot");
+               break;
+       case NAND_MODE:
+               puts("NAND_MODE\n");
+               setenv("modeboot", "nandboot");
+               break;
        default:
                printf("Invalid Boot Mode:0x%x\n", bootmode);
                break;
@@ -88,7 +117,7 @@ int board_late_init(void)
 
 int checkboard(void)
 {
-       puts("Board:\tXilinx ZynqMP\n");
+       puts("Board: Xilinx ZynqMP\n");
        return 0;
 }
 
diff --git a/cmd/Kconfig b/cmd/Kconfig
new file mode 100644 (file)
index 0000000..2ed0263
--- /dev/null
@@ -0,0 +1,585 @@
+menu "Command line interface"
+
+config HUSH_PARSER
+       bool "Use hush shell"
+       select SYS_HUSH_PARSER
+       help
+         This option enables the "hush" shell (from Busybox) as command line
+         interpreter, thus enabling powerful command line syntax like
+         if...then...else...fi conditionals or `&&' and '||'
+         constructs ("shell scripts").
+
+         If disabled, you get the old, much simpler behaviour with a somewhat
+         smaller memory footprint.
+
+config SYS_HUSH_PARSER
+       bool
+       help
+         Backward compatibility.
+
+config SYS_PROMPT
+       string "Shell prompt"
+       default "=> "
+       help
+         This string is displayed in the command line to the left of the
+         cursor.
+
+menu "Autoboot options"
+
+config AUTOBOOT_KEYED
+       bool "Stop autobooting via specific input key / string"
+       default n
+       help
+         This option enables stopping (aborting) of the automatic
+         boot feature only by issuing a specific input key or
+         string. If not enabled, any input key will abort the
+         U-Boot automatic booting process and bring the device
+         to the U-Boot prompt for user input.
+
+config AUTOBOOT_PROMPT
+       string "Autoboot stop prompt"
+       depends on AUTOBOOT_KEYED
+       default "Autoboot in %d seconds\\n"
+       help
+         This string is displayed before the boot delay selected by
+         CONFIG_BOOTDELAY starts. If it is not defined there is no
+         output indicating that autoboot is in progress.
+
+         Note that this define is used as the (only) argument to a
+         printf() call, so it may contain '%' format specifications,
+         provided that it also includes, sepearated by commas exactly
+         like in a printf statement, the required arguments. It is
+         the responsibility of the user to select only such arguments
+         that are valid in the given context.
+
+config AUTOBOOT_ENCRYPTION
+       bool "Enable encryption in autoboot stopping"
+       depends on AUTOBOOT_KEYED
+       default n
+
+config AUTOBOOT_DELAY_STR
+       string "Delay autobooting via specific input key / string"
+       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
+       help
+         This option delays the automatic boot feature by issuing
+         a specific input key or string. If CONFIG_AUTOBOOT_DELAY_STR
+         or the environment variable "bootdelaykey" is specified
+         and this string is received from console input before
+         autoboot starts booting, U-Boot gives a command prompt. The
+         U-Boot prompt will time out if CONFIG_BOOT_RETRY_TIME is
+         used, otherwise it never times out.
+
+config AUTOBOOT_STOP_STR
+       string "Stop autobooting via specific input key / string"
+       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
+       help
+         This option enables stopping (aborting) of the automatic
+         boot feature only by issuing a specific input key or
+         string. If CONFIG_AUTOBOOT_STOP_STR or the environment
+         variable "bootstopkey" is specified and this string is
+         received from console input before autoboot starts booting,
+         U-Boot gives a command prompt. The U-Boot prompt never
+         times out, even if CONFIG_BOOT_RETRY_TIME is used.
+
+config AUTOBOOT_KEYED_CTRLC
+       bool "Enable Ctrl-C autoboot interruption"
+       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
+       default n
+       help
+         This option allows for the boot sequence to be interrupted
+         by ctrl-c, in addition to the "bootdelaykey" and "bootstopkey".
+         Setting this variable provides an escape sequence from the
+         limited "password" strings.
+
+config AUTOBOOT_STOP_STR_SHA256
+       string "Stop autobooting via SHA256 encrypted password"
+       depends on AUTOBOOT_KEYED && AUTOBOOT_ENCRYPTION
+       help
+         This option adds the feature to only stop the autobooting,
+         and therefore boot into the U-Boot prompt, when the input
+         string / password matches a values that is encypted via
+         a SHA256 hash and saved in the environment.
+
+endmenu
+
+comment "Commands"
+
+menu "Info commands"
+
+config CMD_BDI
+       bool "bdinfo"
+       default y
+       help
+         Print board info
+
+config CMD_CONSOLE
+       bool "coninfo"
+       default y
+       help
+         Print console devices and information.
+
+config CMD_CPU
+       bool "cpu"
+       help
+         Print information about available CPUs. This normally shows the
+         number of CPUs, type (e.g. manufacturer, architecture, product or
+         internal name) and clock frequency. Other information may be
+         available depending on the CPU driver.
+
+config CMD_LICENSE
+       bool "license"
+       help
+         Print GPL license text
+
+endmenu
+
+menu "Boot commands"
+
+config CMD_BOOTD
+       bool "bootd"
+       default y
+       help
+         Run the command stored in the environment "bootcmd", i.e.
+         "bootd" does the same thing as "run bootcmd".
+
+config CMD_BOOTM
+       bool "bootm"
+       default y
+       help
+         Boot an application image from the memory.
+
+config CMD_ELF
+       bool "bootelf, bootvx"
+       default y
+       help
+         Boot an ELF/vxWorks image from the memory.
+
+config CMD_GO
+       bool "go"
+       default y
+       help
+         Start an application at a given address.
+
+config CMD_RUN
+       bool "run"
+       default y
+       help
+         Run the command in the given environment variable.
+
+config CMD_IMI
+       bool "iminfo"
+       default y
+       help
+         Print header information for application image.
+
+config CMD_IMLS
+       bool "imls"
+       default y
+       help
+         List all images found in flash
+
+config CMD_XIMG
+       bool "imxtract"
+       default y
+       help
+         Extract a part of a multi-image.
+
+config CMD_POWEROFF
+       bool
+
+endmenu
+
+menu "Environment commands"
+
+config CMD_EXPORTENV
+       bool "env export"
+       default y
+       help
+         Export environments.
+
+config CMD_IMPORTENV
+       bool "env import"
+       default y
+       help
+         Import environments.
+
+config CMD_EDITENV
+       bool "editenv"
+       default y
+       help
+         Edit environment variable.
+
+config CMD_SAVEENV
+       bool "saveenv"
+       default y
+       help
+         Save all environment variables into the compiled-in persistent
+         storage.
+
+config CMD_ENV_EXISTS
+       bool "env exists"
+       default y
+       help
+         Check if a variable is defined in the environment for use in
+         shell scripting.
+
+endmenu
+
+menu "Memory commands"
+
+config CMD_MEMORY
+       bool "md, mm, nm, mw, cp, cmp, base, loop"
+       default y
+       help
+         Memeory commands.
+           md - memory display
+           mm - memory modify (auto-incrementing address)
+           nm - memory modify (constant address)
+           mw - memory write (fill)
+           cp - memory copy
+           cmp - memory compare
+           base - print or set address offset
+           loop - initinite loop on address range
+
+config CMD_CRC32
+       bool "crc32"
+       default y
+       help
+         Compute CRC32.
+
+config LOOPW
+       bool "loopw"
+       help
+         Infinite write loop on address range
+
+config CMD_MEMTEST
+       bool "memtest"
+       help
+         Simple RAM read/write test.
+
+config CMD_MX_CYCLIC
+       bool "mdc, mwc"
+       help
+         mdc - memory display cyclic
+         mwc - memory write cyclic
+
+config CMD_MEMINFO
+       bool "meminfo"
+       help
+         Display memory information.
+
+endmenu
+
+menu "Device access commands"
+
+config CMD_DM
+       bool "dm - Access to driver model information"
+       depends on DM
+       default y
+       help
+         Provides access to driver model data structures and information,
+         such as a list of devices, list of uclasses and the state of each
+         device (e.g. activated). This is not required for operation, but
+         can be useful to see the state of driver model for debugging or
+         interest.
+
+config CMD_DEMO
+       bool "demo - Demonstration commands for driver model"
+       depends on DM
+       help
+         Provides a 'demo' command which can be used to play around with
+         driver model. To use this properly you will need to enable one or
+         both of the demo devices (DM_DEMO_SHAPE and DM_DEMO_SIMPLE).
+         Otherwise you will always get an empty list of devices. The demo
+         devices are defined in the sandbox device tree, so the easiest
+         option is to use sandbox and pass the -d point to sandbox's
+         u-boot.dtb file.
+
+config CMD_LOADB
+       bool "loadb"
+       default y
+       help
+         Load a binary file over serial line.
+
+config CMD_LOADS
+       bool "loads"
+       default y
+       help
+         Load an S-Record file over serial line
+
+config CMD_FLASH
+       bool "flinfo, erase, protect"
+       default y
+       help
+         NOR flash support.
+           flinfo - print FLASH memory information
+           erase - FLASH memory
+           protect - enable or disable FLASH write protection
+
+config CMD_ARMFLASH
+       depends on FLASH_CFI_DRIVER
+       bool "armflash"
+       help
+         ARM Ltd reference designs flash partition access
+
+config CMD_NAND
+       bool "nand"
+       help
+         NAND support.
+
+config CMD_SF
+       bool "sf"
+       help
+         SPI Flash support
+
+config CMD_SPI
+       bool "sspi"
+       help
+         SPI utility command.
+
+config CMD_I2C
+       bool "i2c"
+       help
+         I2C support.
+
+config CMD_USB
+       bool "usb"
+       help
+         USB support.
+
+config CMD_FPGA
+       bool "fpga"
+       default y
+       help
+         FPGA support.
+
+config CMD_REMOTEPROC
+       bool "remoteproc"
+       depends on REMOTEPROC
+       help
+         Support for Remote Processor control
+
+config CMD_GPIO
+       bool "gpio"
+       help
+         GPIO support.
+
+endmenu
+
+
+menu "Shell scripting commands"
+
+config CMD_ECHO
+       bool "echo"
+       default y
+       help
+         Echo args to console
+
+config CMD_ITEST
+       bool "itest"
+       default y
+       help
+         Return true/false on integer compare.
+
+config CMD_SOURCE
+       bool "source"
+       default y
+       help
+         Run script from memory
+
+config CMD_SETEXPR
+       bool "setexpr"
+       default y
+       help
+         Evaluate boolean and math expressions and store the result in an env
+           variable.
+         Also supports loading the value at a memory location into a variable.
+         If CONFIG_REGEX is enabled, setexpr also supports a gsub function.
+
+endmenu
+
+menu "Network commands"
+
+config CMD_NET
+       bool "bootp, tftpboot"
+        select NET
+       default y
+       help
+         Network commands.
+         bootp - boot image via network using BOOTP/TFTP protocol
+         tftpboot - boot image via network using TFTP protocol
+
+config CMD_TFTPPUT
+       bool "tftp put"
+       help
+         TFTP put command, for uploading files to a server
+
+config CMD_TFTPSRV
+       bool "tftpsrv"
+       help
+         Act as a TFTP server and boot the first received file
+
+config CMD_RARP
+       bool "rarpboot"
+       help
+         Boot image via network using RARP/TFTP protocol
+
+config CMD_DHCP
+       bool "dhcp"
+       help
+         Boot image via network using DHCP/TFTP protocol
+
+config CMD_NFS
+       bool "nfs"
+       default y
+       help
+         Boot image via network using NFS protocol.
+
+config CMD_PING
+       bool "ping"
+       help
+         Send ICMP ECHO_REQUEST to network host
+
+config CMD_CDP
+       bool "cdp"
+       help
+         Perform CDP network configuration
+
+config CMD_SNTP
+       bool "sntp"
+       help
+         Synchronize RTC via network
+
+config CMD_DNS
+       bool "dns"
+       help
+         Lookup the IP of a hostname
+
+config CMD_LINK_LOCAL
+       bool "linklocal"
+       help
+         Acquire a network IP address using the link-local protocol
+
+endmenu
+
+menu "Misc commands"
+
+config CMD_AMBAPP
+       bool "ambapp"
+       depends on LEON3
+       default y
+       help
+         Lists AMBA Plug-n-Play information.
+
+config SYS_AMBAPP_PRINT_ON_STARTUP
+       bool "Show AMBA PnP info on startup"
+       depends on CMD_AMBAPP
+       default n
+       help
+         Show AMBA Plug-n-Play information on startup.
+
+config CMD_TIME
+       bool "time"
+       help
+         Run commands and summarize execution time.
+
+# TODO: rename to CMD_SLEEP
+config CMD_MISC
+       bool "sleep"
+       default y
+       help
+         Delay execution for some time
+
+config CMD_TIMER
+       bool "timer"
+       help
+         Access the system timer.
+
+config CMD_SETGETDCR
+       bool "getdcr, setdcr, getidcr, setidcr"
+       depends on 4xx
+       default y
+       help
+         getdcr - Get an AMCC PPC 4xx DCR's value
+         setdcr - Set an AMCC PPC 4xx DCR's value
+         getidcr - Get a register value via indirect DCR addressing
+         setidcr - Set a register value via indirect DCR addressing
+
+config CMD_SOUND
+       bool "sound"
+       depends on SOUND
+       help
+         This provides basic access to the U-Boot's sound support. The main
+         feature is to play a beep.
+
+            sound init   - set up sound system
+            sound play   - play a sound
+
+endmenu
+
+config CMD_BOOTSTAGE
+       bool "Enable the 'bootstage' command"
+       depends on BOOTSTAGE
+       help
+         Add a 'bootstage' command which supports printing a report
+         and un/stashing of bootstage data.
+
+menu "Power commands"
+config CMD_PMIC
+       bool "Enable Driver Model PMIC command"
+       depends on DM_PMIC
+       help
+         This is the pmic command, based on a driver model pmic's API.
+         Command features are unchanged:
+         - list               - list pmic devices
+         - pmic dev <id>      - show or [set] operating pmic device (NEW)
+         - pmic dump          - dump registers
+         - pmic read address  - read byte of register at address
+         - pmic write address - write byte to register at address
+         The only one change for this command is 'dev' subcommand.
+
+config CMD_REGULATOR
+       bool "Enable Driver Model REGULATOR command"
+       depends on DM_REGULATOR
+       help
+         This command is based on driver model regulator's API.
+         User interface features:
+         - list               - list regulator devices
+         - regulator dev <id> - show or [set] operating regulator device
+         - regulator info     - print constraints info
+         - regulator status   - print operating status
+         - regulator value <val] <-f> - print/[set] voltage value [uV]
+         - regulator current <val>    - print/[set] current value [uA]
+         - regulator mode <id>        - print/[set] operating mode id
+         - regulator enable           - enable the regulator output
+         - regulator disable          - disable the regulator output
+
+         The '-f' (force) option can be used for set the value which exceeds
+         the limits, which are found in device-tree and are kept in regulator's
+         uclass platdata structure.
+
+endmenu
+
+menu "Security commands"
+config CMD_TPM
+       bool "Enable the 'tpm' command"
+       depends on TPM
+       help
+         This provides a means to talk to a TPM from the command line. A wide
+         range of commands if provided - see 'tpm help' for details. The
+         command requires a suitable TPM on your board and the correct driver
+         must be enabled.
+
+config CMD_TPM_TEST
+       bool "Enable the 'tpm test' command"
+       depends on CMD_TPM
+       help
+         This provides a a series of tests to confirm that the TPM is working
+         correctly. The tests cover initialisation, non-volatile RAM, extend,
+         global lock and checking that timing is within expectations. The
+         tests pass correctly on Infineon TPMs but may need to be adjusted
+         for other devices.
+
+endmenu
+
+endmenu
diff --git a/cmd/Makefile b/cmd/Makefile
new file mode 100644 (file)
index 0000000..03f7e0a
--- /dev/null
@@ -0,0 +1,166 @@
+#
+# (C) Copyright 2004-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+ifndef CONFIG_SPL_BUILD
+# core command
+obj-y += boot.o
+obj-$(CONFIG_CMD_BOOTM) += bootm.o
+obj-y += help.o
+obj-y += version.o
+
+# command
+obj-$(CONFIG_CMD_AES) += aes.o
+obj-$(CONFIG_CMD_AMBAPP) += ambapp.o
+obj-$(CONFIG_CMD_ARMFLASH) += armflash.o
+obj-$(CONFIG_SOURCE) += source.o
+obj-$(CONFIG_CMD_SOURCE) += source.o
+obj-$(CONFIG_CMD_BDI) += bdinfo.o
+obj-$(CONFIG_CMD_BEDBUG) += bedbug.o
+obj-$(CONFIG_CMD_BMP) += bmp.o
+obj-$(CONFIG_CMD_BOOTMENU) += bootmenu.o
+obj-$(CONFIG_CMD_BOOTLDR) += bootldr.o
+obj-$(CONFIG_CMD_BOOTSTAGE) += bootstage.o
+obj-$(CONFIG_CMD_CACHE) += cache.o
+obj-$(CONFIG_CMD_CBFS) += cbfs.o
+obj-$(CONFIG_CMD_CLK) += clk.o
+obj-$(CONFIG_CMD_CONSOLE) += console.o
+obj-$(CONFIG_CMD_CPLBINFO) += cplbinfo.o
+obj-$(CONFIG_CMD_CPU) += cpu.o
+obj-$(CONFIG_DATAFLASH_MMC_SELECT) += dataflash_mmc_mux.o
+obj-$(CONFIG_CMD_DATE) += date.o
+obj-$(CONFIG_CMD_DEMO) += demo.o
+obj-$(CONFIG_CMD_SOUND) += sound.o
+ifdef CONFIG_4xx
+obj-$(CONFIG_CMD_SETGETDCR) += dcr.o
+endif
+ifdef CONFIG_POST
+obj-$(CONFIG_CMD_DIAG) += diag.o
+endif
+obj-$(CONFIG_CMD_DISPLAY) += display.o
+obj-$(CONFIG_CMD_DTT) += dtt.o
+obj-$(CONFIG_CMD_ECHO) += echo.o
+obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o
+obj-$(CONFIG_CMD_EEPROM) += eeprom.o
+obj-$(CONFIG_EFI_STUB) += efi.o
+obj-$(CONFIG_CMD_ELF) += elf.o
+obj-$(CONFIG_SYS_HUSH_PARSER) += exit.o
+obj-$(CONFIG_CMD_EXT4) += ext4.o
+obj-$(CONFIG_CMD_EXT2) += ext2.o
+obj-$(CONFIG_CMD_FAT) += fat.o
+obj-$(CONFIG_CMD_FDC) += fdc.o
+obj-$(CONFIG_OF_LIBFDT) += fdt.o
+obj-$(CONFIG_CMD_FITUPD) += fitupd.o
+obj-$(CONFIG_CMD_FLASH) += flash.o
+ifdef CONFIG_FPGA
+obj-$(CONFIG_CMD_FPGA) += fpga.o
+endif
+obj-$(CONFIG_CMD_FPGAD) += fpgad.o
+obj-$(CONFIG_CMD_FS_GENERIC) += fs.o
+obj-$(CONFIG_CMD_FUSE) += fuse.o
+obj-$(CONFIG_CMD_GETTIME) += gettime.o
+obj-$(CONFIG_CMD_GPIO) += gpio.o
+obj-$(CONFIG_CMD_I2C) += i2c.o
+obj-$(CONFIG_CMD_IOTRACE) += iotrace.o
+obj-$(CONFIG_CMD_HASH) += hash.o
+obj-$(CONFIG_CMD_IDE) += ide.o
+obj-$(CONFIG_CMD_IMMAP) += immap.o
+obj-$(CONFIG_CMD_INI) += ini.o
+obj-$(CONFIG_CMD_IRQ) += irq.o
+obj-$(CONFIG_CMD_ITEST) += itest.o
+obj-$(CONFIG_CMD_JFFS2) += jffs2.o
+obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
+obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
+obj-$(CONFIG_CMD_LED) += led.o
+obj-$(CONFIG_CMD_LICENSE) += license.o
+obj-y += load.o
+obj-$(CONFIG_LOGBUFFER) += log.o
+obj-$(CONFIG_ID_EEPROM) += mac.o
+obj-$(CONFIG_CMD_MD5SUM) += md5sum.o
+obj-$(CONFIG_CMD_MEMORY) += mem.o
+obj-$(CONFIG_CMD_IO) += io.o
+obj-$(CONFIG_CMD_MFSL) += mfsl.o
+obj-$(CONFIG_CMD_MII) += mii.o
+ifdef CONFIG_PHYLIB
+obj-$(CONFIG_CMD_MII) += mdio.o
+endif
+obj-$(CONFIG_CMD_MISC) += misc.o
+obj-$(CONFIG_CMD_MMC) += mmc.o
+obj-$(CONFIG_CMD_MMC_SPI) += mmc_spi.o
+obj-$(CONFIG_MP) += mp.o
+obj-$(CONFIG_CMD_MTDPARTS) += mtdparts.o
+obj-$(CONFIG_CMD_NAND) += nand.o
+obj-$(CONFIG_CMD_NET) += net.o
+obj-$(CONFIG_CMD_ONENAND) += onenand.o
+obj-$(CONFIG_CMD_OTP) += otp.o
+obj-$(CONFIG_CMD_PART) += part.o
+ifdef CONFIG_PCI
+obj-$(CONFIG_CMD_PCI) += pci.o
+endif
+obj-y += pcmcia.o
+obj-$(CONFIG_CMD_PORTIO) += portio.o
+obj-$(CONFIG_CMD_PXE) += pxe.o
+obj-$(CONFIG_CMD_READ) += read.o
+obj-$(CONFIG_CMD_REGINFO) += reginfo.o
+obj-$(CONFIG_CMD_REISER) += reiser.o
+obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o
+obj-$(CONFIG_SANDBOX) += host.o
+obj-$(CONFIG_CMD_SATA) += sata.o
+obj-$(CONFIG_CMD_SF) += sf.o
+obj-$(CONFIG_CMD_SCSI) += scsi.o
+obj-$(CONFIG_CMD_SHA1SUM) += sha1sum.o
+obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
+obj-$(CONFIG_CMD_SOFTSWITCH) += softswitch.o
+obj-$(CONFIG_CMD_SPI) += spi.o
+obj-$(CONFIG_CMD_SPIBOOTLDR) += spibootldr.o
+obj-$(CONFIG_CMD_STRINGS) += strings.o
+obj-$(CONFIG_CMD_TERMINAL) += terminal.o
+obj-$(CONFIG_CMD_TIME) += time.o
+obj-$(CONFIG_CMD_TRACE) += trace.o
+obj-$(CONFIG_SYS_HUSH_PARSER) += test.o
+obj-$(CONFIG_CMD_TPM) += tpm.o
+obj-$(CONFIG_CMD_TPM_TEST) += tpm_test.o
+obj-$(CONFIG_CMD_TSI148) += tsi148.o
+obj-$(CONFIG_CMD_UBI) += ubi.o
+obj-$(CONFIG_CMD_UBIFS) += ubifs.o
+obj-$(CONFIG_CMD_UNIVERSE) += universe.o
+obj-$(CONFIG_CMD_UNZIP) += unzip.o
+ifdef CONFIG_LZMA
+obj-$(CONFIG_CMD_LZMADEC) += lzmadec.o
+endif
+
+obj-$(CONFIG_CMD_USB) += usb.o
+obj-$(CONFIG_CMD_FASTBOOT) += fastboot.o
+obj-$(CONFIG_CMD_FS_UUID) += fs_uuid.o
+
+obj-$(CONFIG_CMD_USB_MASS_STORAGE) += usb_mass_storage.o
+obj-$(CONFIG_CMD_THOR_DOWNLOAD) += thordown.o
+obj-$(CONFIG_CMD_XIMG) += ximg.o
+obj-$(CONFIG_YAFFS2) += yaffs2.o
+obj-$(CONFIG_CMD_SPL) += spl.o
+obj-$(CONFIG_CMD_ZIP) += zip.o
+obj-$(CONFIG_CMD_ZFS) += zfs.o
+
+obj-$(CONFIG_CMD_DFU) += dfu.o
+obj-$(CONFIG_CMD_GPT) += gpt.o
+obj-$(CONFIG_CMD_ETHSW) += ethsw.o
+
+# Power
+obj-$(CONFIG_CMD_PMIC) += pmic.o
+obj-$(CONFIG_CMD_REGULATOR) += regulator.o
+endif # !CONFIG_SPL_BUILD
+
+ifdef CONFIG_SPL_BUILD
+ifdef CONFIG_SPL_SATA_SUPPORT
+obj-$(CONFIG_CMD_SCSI) += scsi.o
+endif
+endif # CONFIG_SPL_BUILD
+
+obj-$(CONFIG_CMD_BLOB) += blob.o
+
+# core command
+obj-y += nvedit.o
+obj-y += disk.o
similarity index 100%
rename from common/cmd_aes.c
rename to cmd/aes.c
similarity index 100%
rename from common/cmd_ambapp.c
rename to cmd/ambapp.c
similarity index 100%
rename from common/cmd_armflash.c
rename to cmd/armflash.c
similarity index 99%
rename from common/cmd_bdinfo.c
rename to cmd/bdinfo.c
index deed6d825558e561f90a62d0859cc8fefd21aa31..8eda68b4f9972e1be0bb46f1c69f76be893402d6 100644 (file)
@@ -205,7 +205,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        print_num("sram start     ",    (ulong)bd->bi_sramstart);
        print_num("sram size      ",    (ulong)bd->bi_sramsize);
 #endif
-#if defined(CONFIG_CMD_NET)
+#if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH)
        print_eths();
 #endif
        printf("baudrate    = %u bps\n", gd->baudrate);
similarity index 100%
rename from common/cmd_bedbug.c
rename to cmd/bedbug.c
similarity index 100%
rename from common/cmd_blob.c
rename to cmd/blob.c
similarity index 100%
rename from common/cmd_bmp.c
rename to cmd/bmp.c
similarity index 100%
rename from common/cmd_boot.c
rename to cmd/boot.c
similarity index 100%
rename from common/cmd_bootldr.c
rename to cmd/bootldr.c
similarity index 100%
rename from common/cmd_bootm.c
rename to cmd/bootm.c
similarity index 100%
rename from common/cmd_bootmenu.c
rename to cmd/bootmenu.c
similarity index 100%
rename from common/cmd_bootstage.c
rename to cmd/bootstage.c
similarity index 100%
rename from common/cmd_cache.c
rename to cmd/cache.c
similarity index 100%
rename from common/cmd_cbfs.c
rename to cmd/cbfs.c
similarity index 100%
rename from common/cmd_clk.c
rename to cmd/clk.c
similarity index 100%
rename from common/cmd_console.c
rename to cmd/console.c
similarity index 100%
rename from common/cmd_cplbinfo.c
rename to cmd/cplbinfo.c
similarity index 100%
rename from common/cmd_cpu.c
rename to cmd/cpu.c
similarity index 100%
rename from common/cmd_cramfs.c
rename to cmd/cramfs.c
similarity index 100%
rename from common/cmd_date.c
rename to cmd/date.c
similarity index 100%
rename from common/cmd_dcr.c
rename to cmd/dcr.c
similarity index 100%
rename from common/cmd_demo.c
rename to cmd/demo.c
similarity index 100%
rename from common/cmd_dfu.c
rename to cmd/dfu.c
similarity index 100%
rename from common/cmd_diag.c
rename to cmd/diag.c
similarity index 100%
rename from common/cmd_disk.c
rename to cmd/disk.c
similarity index 100%
rename from common/cmd_display.c
rename to cmd/display.c
similarity index 98%
rename from common/cmd_dtt.c
rename to cmd/dtt.c
index f2e750f2f1642f0fa71a6be1edac10eb48578f75..dd427a3d0b6346d7031e2073bc33a2fe6732bb53 100644 (file)
+++ b/cmd/dtt.c
@@ -12,6 +12,7 @@
 #include <dtt.h>
 #include <i2c.h>
 #include <tmu.h>
+#include <linux/bug.h>
 
 #if defined CONFIG_DTT_SENSORS
 static unsigned long sensor_initialized;
similarity index 100%
rename from common/cmd_echo.c
rename to cmd/echo.c
similarity index 100%
rename from common/cmd_eeprom.c
rename to cmd/eeprom.c
similarity index 100%
rename from common/cmd_efi.c
rename to cmd/efi.c
similarity index 100%
rename from common/cmd_elf.c
rename to cmd/elf.c
similarity index 100%
rename from common/cmd_ethsw.c
rename to cmd/ethsw.c
similarity index 100%
rename from common/cmd_exit.c
rename to cmd/exit.c
similarity index 100%
rename from common/cmd_ext2.c
rename to cmd/ext2.c
similarity index 100%
rename from common/cmd_ext4.c
rename to cmd/ext4.c
similarity index 100%
rename from common/cmd_fastboot.c
rename to cmd/fastboot.c
similarity index 100%
rename from common/cmd_fat.c
rename to cmd/fat.c
similarity index 100%
rename from common/cmd_fdc.c
rename to cmd/fdc.c
similarity index 100%
rename from common/cmd_fdt.c
rename to cmd/fdt.c
similarity index 100%
rename from common/cmd_fitupd.c
rename to cmd/fitupd.c
similarity index 100%
rename from common/cmd_flash.c
rename to cmd/flash.c
similarity index 98%
rename from common/cmd_fpga.c
rename to cmd/fpga.c
index 7f99aabf8a5c69454a19fced5a71c596b043dddc..8956eb1b654adf4caef2681b8f8a6b93e1245583 100644 (file)
@@ -86,7 +86,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
                        debug("*  fpga: cmdline image address = 0x%08lx\n",
                              (ulong)fpga_data);
                }
-               debug("%s: fpga_data = 0x%x\n", __func__, (uint)fpga_data);
+               debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data);
 
        case 3:         /* fpga <op> <dev | data addr> */
                dev = (int)simple_strtoul(argv[2], NULL, 16);
@@ -107,13 +107,13 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
                        } else
 #endif
                        {
-                               fpga_data = (void *)dev;
+                               fpga_data = (void *)(uintptr_t)dev;
                                debug("*  fpga: cmdline image addr = 0x%08lx\n",
                                      (ulong)fpga_data);
                        }
 
-                       debug("%s: fpga_data = 0x%x\n",
-                             __func__, (uint)fpga_data);
+                       debug("%s: fpga_data = 0x%lx\n",
+                             __func__, (ulong)fpga_data);
                        dev = FPGA_INVALID_DEVICE;      /* reset device num */
                }
 
similarity index 100%
rename from common/cmd_fpgad.c
rename to cmd/fpgad.c
similarity index 100%
rename from common/cmd_fs.c
rename to cmd/fs.c
similarity index 100%
rename from common/cmd_fs_uuid.c
rename to cmd/fs_uuid.c
similarity index 100%
rename from common/cmd_fuse.c
rename to cmd/fuse.c
similarity index 100%
rename from common/cmd_gettime.c
rename to cmd/gettime.c
similarity index 100%
rename from common/cmd_gpio.c
rename to cmd/gpio.c
similarity index 100%
rename from common/cmd_gpt.c
rename to cmd/gpt.c
similarity index 100%
rename from common/cmd_hash.c
rename to cmd/hash.c
similarity index 100%
rename from common/cmd_help.c
rename to cmd/help.c
similarity index 100%
rename from common/cmd_host.c
rename to cmd/host.c
similarity index 100%
rename from common/cmd_i2c.c
rename to cmd/i2c.c
similarity index 100%
rename from common/cmd_ide.c
rename to cmd/ide.c
similarity index 100%
rename from common/cmd_immap.c
rename to cmd/immap.c
similarity index 100%
rename from common/cmd_ini.c
rename to cmd/ini.c
similarity index 100%
rename from common/cmd_io.c
rename to cmd/io.c
similarity index 100%
rename from common/cmd_iotrace.c
rename to cmd/iotrace.c
similarity index 100%
rename from common/cmd_irq.c
rename to cmd/irq.c
similarity index 100%
rename from common/cmd_itest.c
rename to cmd/itest.c
similarity index 100%
rename from common/cmd_jffs2.c
rename to cmd/jffs2.c
similarity index 100%
rename from common/cmd_ldrinfo.c
rename to cmd/ldrinfo.c
similarity index 100%
rename from common/cmd_led.c
rename to cmd/led.c
similarity index 100%
rename from common/cmd_license.c
rename to cmd/license.c
similarity index 100%
rename from common/cmd_load.c
rename to cmd/load.c
similarity index 100%
rename from common/cmd_log.c
rename to cmd/log.c
similarity index 100%
rename from common/cmd_lzmadec.c
rename to cmd/lzmadec.c
similarity index 100%
rename from common/cmd_mac.c
rename to cmd/mac.c
similarity index 100%
rename from common/cmd_md5sum.c
rename to cmd/md5sum.c
similarity index 100%
rename from common/cmd_mdio.c
rename to cmd/mdio.c
similarity index 100%
rename from common/cmd_mem.c
rename to cmd/mem.c
similarity index 100%
rename from common/cmd_mfsl.c
rename to cmd/mfsl.c
similarity index 100%
rename from common/cmd_mii.c
rename to cmd/mii.c
similarity index 100%
rename from common/cmd_misc.c
rename to cmd/misc.c
similarity index 100%
rename from common/cmd_mmc.c
rename to cmd/mmc.c
similarity index 100%
rename from common/cmd_mmc_spi.c
rename to cmd/mmc_spi.c
similarity index 100%
rename from common/cmd_mp.c
rename to cmd/mp.c
similarity index 100%
rename from common/cmd_mtdparts.c
rename to cmd/mtdparts.c
similarity index 100%
rename from common/cmd_nand.c
rename to cmd/nand.c
similarity index 100%
rename from common/cmd_net.c
rename to cmd/net.c
similarity index 100%
rename from common/cmd_nvedit.c
rename to cmd/nvedit.c
similarity index 100%
rename from common/cmd_onenand.c
rename to cmd/onenand.c
similarity index 100%
rename from common/cmd_otp.c
rename to cmd/otp.c
similarity index 100%
rename from common/cmd_part.c
rename to cmd/part.c
similarity index 100%
rename from common/cmd_pci.c
rename to cmd/pci.c
similarity index 100%
rename from common/cmd_pcmcia.c
rename to cmd/pcmcia.c
similarity index 100%
rename from common/cmd_pmic.c
rename to cmd/pmic.c
similarity index 100%
rename from common/cmd_portio.c
rename to cmd/portio.c
similarity index 100%
rename from common/cmd_pxe.c
rename to cmd/pxe.c
similarity index 100%
rename from common/cmd_read.c
rename to cmd/read.c
similarity index 100%
rename from common/cmd_reginfo.c
rename to cmd/reginfo.c
similarity index 100%
rename from common/cmd_regulator.c
rename to cmd/regulator.c
similarity index 100%
rename from common/cmd_reiser.c
rename to cmd/reiser.c
similarity index 100%
rename from common/cmd_remoteproc.c
rename to cmd/remoteproc.c
similarity index 100%
rename from common/cmd_sata.c
rename to cmd/sata.c
similarity index 100%
rename from common/cmd_scsi.c
rename to cmd/scsi.c
similarity index 100%
rename from common/cmd_setexpr.c
rename to cmd/setexpr.c
similarity index 100%
rename from common/cmd_sf.c
rename to cmd/sf.c
similarity index 100%
rename from common/cmd_sha1sum.c
rename to cmd/sha1sum.c
similarity index 100%
rename from common/cmd_softswitch.c
rename to cmd/softswitch.c
similarity index 100%
rename from common/cmd_sound.c
rename to cmd/sound.c
similarity index 100%
rename from common/cmd_source.c
rename to cmd/source.c
similarity index 100%
rename from common/cmd_spi.c
rename to cmd/spi.c
similarity index 100%
rename from common/cmd_spibootldr.c
rename to cmd/spibootldr.c
similarity index 100%
rename from common/cmd_spl.c
rename to cmd/spl.c
similarity index 100%
rename from common/cmd_strings.c
rename to cmd/strings.c
similarity index 100%
rename from common/cmd_terminal.c
rename to cmd/terminal.c
similarity index 100%
rename from common/cmd_test.c
rename to cmd/test.c
similarity index 100%
rename from common/cmd_thordown.c
rename to cmd/thordown.c
similarity index 100%
rename from common/cmd_time.c
rename to cmd/time.c
similarity index 100%
rename from common/cmd_tpm.c
rename to cmd/tpm.c
similarity index 100%
rename from common/cmd_tpm_test.c
rename to cmd/tpm_test.c
similarity index 100%
rename from common/cmd_trace.c
rename to cmd/trace.c
similarity index 100%
rename from common/cmd_tsi148.c
rename to cmd/tsi148.c
similarity index 100%
rename from common/cmd_ubi.c
rename to cmd/ubi.c
similarity index 100%
rename from common/cmd_ubifs.c
rename to cmd/ubifs.c
similarity index 100%
rename from common/cmd_universe.c
rename to cmd/universe.c
similarity index 100%
rename from common/cmd_unzip.c
rename to cmd/unzip.c
similarity index 100%
rename from common/cmd_usb.c
rename to cmd/usb.c
similarity index 100%
rename from common/cmd_version.c
rename to cmd/version.c
similarity index 100%
rename from common/cmd_ximg.c
rename to cmd/ximg.c
similarity index 100%
rename from common/cmd_yaffs2.c
rename to cmd/yaffs2.c
similarity index 100%
rename from common/cmd_zfs.c
rename to cmd/zfs.c
similarity index 100%
rename from common/cmd_zip.c
rename to cmd/zip.c
index 9d446bf86b01116956d5b612047c23be738cbc8a..067545d8a3ea24ae8cea6763d7243ae0ebddc21b 100644 (file)
@@ -1,522 +1,3 @@
-menu "Command line interface"
-
-config HUSH_PARSER
-       bool "Use hush shell"
-       select SYS_HUSH_PARSER
-       help
-         This option enables the "hush" shell (from Busybox) as command line
-         interpreter, thus enabling powerful command line syntax like
-         if...then...else...fi conditionals or `&&' and '||'
-         constructs ("shell scripts").
-
-         If disabled, you get the old, much simpler behaviour with a somewhat
-         smaller memory footprint.
-
-config SYS_HUSH_PARSER
-       bool
-       help
-         Backward compatibility.
-
-config SYS_PROMPT
-       string "Shell prompt"
-       default "=> "
-       help
-         This string is displayed in the command line to the left of the
-         cursor.
-
-menu "Autoboot options"
-
-config AUTOBOOT_KEYED
-       bool "Stop autobooting via specific input key / string"
-       default n
-       help
-         This option enables stopping (aborting) of the automatic
-         boot feature only by issuing a specific input key or
-         string. If not enabled, any input key will abort the
-         U-Boot automatic booting process and bring the device
-         to the U-Boot prompt for user input.
-
-config AUTOBOOT_PROMPT
-       string "Autoboot stop prompt"
-       depends on AUTOBOOT_KEYED
-       default "Autoboot in %d seconds\\n"
-       help
-         This string is displayed before the boot delay selected by
-         CONFIG_BOOTDELAY starts. If it is not defined there is no
-         output indicating that autoboot is in progress.
-
-         Note that this define is used as the (only) argument to a
-         printf() call, so it may contain '%' format specifications,
-         provided that it also includes, sepearated by commas exactly
-         like in a printf statement, the required arguments. It is
-         the responsibility of the user to select only such arguments
-         that are valid in the given context.
-
-config AUTOBOOT_ENCRYPTION
-       bool "Enable encryption in autoboot stopping"
-       depends on AUTOBOOT_KEYED
-       default n
-
-config AUTOBOOT_DELAY_STR
-       string "Delay autobooting via specific input key / string"
-       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
-       help
-         This option delays the automatic boot feature by issuing
-         a specific input key or string. If CONFIG_AUTOBOOT_DELAY_STR
-         or the environment variable "bootdelaykey" is specified
-         and this string is received from console input before
-         autoboot starts booting, U-Boot gives a command prompt. The
-         U-Boot prompt will time out if CONFIG_BOOT_RETRY_TIME is
-         used, otherwise it never times out.
-
-config AUTOBOOT_STOP_STR
-       string "Stop autobooting via specific input key / string"
-       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
-       help
-         This option enables stopping (aborting) of the automatic
-         boot feature only by issuing a specific input key or
-         string. If CONFIG_AUTOBOOT_STOP_STR or the environment
-         variable "bootstopkey" is specified and this string is
-         received from console input before autoboot starts booting,
-         U-Boot gives a command prompt. The U-Boot prompt never
-         times out, even if CONFIG_BOOT_RETRY_TIME is used.
-
-config AUTOBOOT_KEYED_CTRLC
-       bool "Enable Ctrl-C autoboot interruption"
-       depends on AUTOBOOT_KEYED && !AUTOBOOT_ENCRYPTION
-       default n
-       help
-         This option allows for the boot sequence to be interrupted
-         by ctrl-c, in addition to the "bootdelaykey" and "bootstopkey".
-         Setting this variable provides an escape sequence from the
-         limited "password" strings.
-
-config AUTOBOOT_STOP_STR_SHA256
-       string "Stop autobooting via SHA256 encrypted password"
-       depends on AUTOBOOT_KEYED && AUTOBOOT_ENCRYPTION
-       help
-         This option adds the feature to only stop the autobooting,
-         and therefore boot into the U-Boot prompt, when the input
-         string / password matches a values that is encypted via
-         a SHA256 hash and saved in the environment.
-
-endmenu
-
-comment "Commands"
-
-menu "Info commands"
-
-config CMD_BDI
-       bool "bdinfo"
-       default y
-       help
-         Print board info
-
-config CMD_CONSOLE
-       bool "coninfo"
-       default y
-       help
-         Print console devices and information.
-
-config CMD_CPU
-       bool "cpu"
-       help
-         Print information about available CPUs. This normally shows the
-         number of CPUs, type (e.g. manufacturer, architecture, product or
-         internal name) and clock frequency. Other information may be
-         available depending on the CPU driver.
-
-config CMD_LICENSE
-       bool "license"
-       help
-         Print GPL license text
-
-endmenu
-
-menu "Boot commands"
-
-config CMD_BOOTD
-       bool "bootd"
-       default y
-       help
-         Run the command stored in the environment "bootcmd", i.e.
-         "bootd" does the same thing as "run bootcmd".
-
-config CMD_BOOTM
-       bool "bootm"
-       default y
-       help
-         Boot an application image from the memory.
-
-config CMD_ELF
-       bool "bootelf, bootvx"
-       default y
-       help
-         Boot an ELF/vxWorks image from the memory.
-
-config CMD_GO
-       bool "go"
-       default y
-       help
-         Start an application at a given address.
-
-config CMD_RUN
-       bool "run"
-       default y
-       help
-         Run the command in the given environment variable.
-
-config CMD_IMI
-       bool "iminfo"
-       default y
-       help
-         Print header information for application image.
-
-config CMD_IMLS
-       bool "imls"
-       default y
-       help
-         List all images found in flash
-
-config CMD_XIMG
-       bool "imxtract"
-       default y
-       help
-         Extract a part of a multi-image.
-
-config CMD_POWEROFF
-       bool
-
-endmenu
-
-menu "Environment commands"
-
-config CMD_EXPORTENV
-       bool "env export"
-       default y
-       help
-         Export environments.
-
-config CMD_IMPORTENV
-       bool "env import"
-       default y
-       help
-         Import environments.
-
-config CMD_EDITENV
-       bool "editenv"
-       default y
-       help
-         Edit environment variable.
-
-config CMD_SAVEENV
-       bool "saveenv"
-       default y
-       help
-         Save all environment variables into the compiled-in persistent
-         storage.
-
-config CMD_ENV_EXISTS
-       bool "env exists"
-       default y
-       help
-         Check if a variable is defined in the environment for use in
-         shell scripting.
-
-endmenu
-
-menu "Memory commands"
-
-config CMD_MEMORY
-       bool "md, mm, nm, mw, cp, cmp, base, loop"
-       default y
-       help
-         Memeory commands.
-           md - memory display
-           mm - memory modify (auto-incrementing address)
-           nm - memory modify (constant address)
-           mw - memory write (fill)
-           cp - memory copy
-           cmp - memory compare
-           base - print or set address offset
-           loop - initinite loop on address range
-
-config CMD_CRC32
-       bool "crc32"
-       default y
-       help
-         Compute CRC32.
-
-config LOOPW
-       bool "loopw"
-       help
-         Infinite write loop on address range
-
-config CMD_MEMTEST
-       bool "memtest"
-       help
-         Simple RAM read/write test.
-
-config CMD_MX_CYCLIC
-       bool "mdc, mwc"
-       help
-         mdc - memory display cyclic
-         mwc - memory write cyclic
-
-config CMD_MEMINFO
-       bool "meminfo"
-       help
-         Display memory information.
-
-endmenu
-
-menu "Device access commands"
-
-config CMD_DM
-       bool "dm - Access to driver model information"
-       depends on DM
-       default y
-       help
-         Provides access to driver model data structures and information,
-         such as a list of devices, list of uclasses and the state of each
-         device (e.g. activated). This is not required for operation, but
-         can be useful to see the state of driver model for debugging or
-         interest.
-
-config CMD_DEMO
-       bool "demo - Demonstration commands for driver model"
-       depends on DM
-       help
-         Provides a 'demo' command which can be used to play around with
-         driver model. To use this properly you will need to enable one or
-         both of the demo devices (DM_DEMO_SHAPE and DM_DEMO_SIMPLE).
-         Otherwise you will always get an empty list of devices. The demo
-         devices are defined in the sandbox device tree, so the easiest
-         option is to use sandbox and pass the -d point to sandbox's
-         u-boot.dtb file.
-
-config CMD_LOADB
-       bool "loadb"
-       default y
-       help
-         Load a binary file over serial line.
-
-config CMD_LOADS
-       bool "loads"
-       default y
-       help
-         Load an S-Record file over serial line
-
-config CMD_FLASH
-       bool "flinfo, erase, protect"
-       default y
-       help
-         NOR flash support.
-           flinfo - print FLASH memory information
-           erase - FLASH memory
-           protect - enable or disable FLASH write protection
-
-config CMD_ARMFLASH
-       depends on FLASH_CFI_DRIVER
-       bool "armflash"
-       help
-         ARM Ltd reference designs flash partition access
-
-config CMD_NAND
-       bool "nand"
-       help
-         NAND support.
-
-config CMD_SF
-       bool "sf"
-       help
-         SPI Flash support
-
-config CMD_SPI
-       bool "sspi"
-       help
-         SPI utility command.
-
-config CMD_I2C
-       bool "i2c"
-       help
-         I2C support.
-
-config CMD_USB
-       bool "usb"
-       help
-         USB support.
-
-config CMD_FPGA
-       bool "fpga"
-       default y
-       help
-         FPGA support.
-
-config CMD_REMOTEPROC
-       bool "remoteproc"
-       depends on REMOTEPROC
-       help
-         Support for Remote Processor control
-
-config CMD_GPIO
-       bool "gpio"
-       help
-         GPIO support.
-
-endmenu
-
-
-menu "Shell scripting commands"
-
-config CMD_ECHO
-       bool "echo"
-       default y
-       help
-         Echo args to console
-
-config CMD_ITEST
-       bool "itest"
-       default y
-       help
-         Return true/false on integer compare.
-
-config CMD_SOURCE
-       bool "source"
-       default y
-       help
-         Run script from memory
-
-config CMD_SETEXPR
-       bool "setexpr"
-       default y
-       help
-         Evaluate boolean and math expressions and store the result in an env
-           variable.
-         Also supports loading the value at a memory location into a variable.
-         If CONFIG_REGEX is enabled, setexpr also supports a gsub function.
-
-endmenu
-
-menu "Network commands"
-
-config CMD_NET
-       bool "bootp, tftpboot"
-        select NET
-       default y
-       help
-         Network commands.
-         bootp - boot image via network using BOOTP/TFTP protocol
-         tftpboot - boot image via network using TFTP protocol
-
-config CMD_TFTPPUT
-       bool "tftp put"
-       help
-         TFTP put command, for uploading files to a server
-
-config CMD_TFTPSRV
-       bool "tftpsrv"
-       help
-         Act as a TFTP server and boot the first received file
-
-config CMD_RARP
-       bool "rarpboot"
-       help
-         Boot image via network using RARP/TFTP protocol
-
-config CMD_DHCP
-       bool "dhcp"
-       help
-         Boot image via network using DHCP/TFTP protocol
-
-config CMD_NFS
-       bool "nfs"
-       default y
-       help
-         Boot image via network using NFS protocol.
-
-config CMD_PING
-       bool "ping"
-       help
-         Send ICMP ECHO_REQUEST to network host
-
-config CMD_CDP
-       bool "cdp"
-       help
-         Perform CDP network configuration
-
-config CMD_SNTP
-       bool "sntp"
-       help
-         Synchronize RTC via network
-
-config CMD_DNS
-       bool "dns"
-       help
-         Lookup the IP of a hostname
-
-config CMD_LINK_LOCAL
-       bool "linklocal"
-       help
-         Acquire a network IP address using the link-local protocol
-
-endmenu
-
-menu "Misc commands"
-
-config CMD_AMBAPP
-       bool "ambapp"
-       depends on LEON3
-       default y
-       help
-         Lists AMBA Plug-n-Play information.
-
-config SYS_AMBAPP_PRINT_ON_STARTUP
-       bool "Show AMBA PnP info on startup"
-       depends on CMD_AMBAPP
-       default n
-       help
-         Show AMBA Plug-n-Play information on startup.
-
-config CMD_TIME
-       bool "time"
-       help
-         Run commands and summarize execution time.
-
-# TODO: rename to CMD_SLEEP
-config CMD_MISC
-       bool "sleep"
-       default y
-       help
-         Delay execution for some time
-
-config CMD_TIMER
-       bool "timer"
-       help
-         Access the system timer.
-
-config CMD_SETGETDCR
-       bool "getdcr, setdcr, getidcr, setidcr"
-       depends on 4xx
-       default y
-       help
-         getdcr - Get an AMCC PPC 4xx DCR's value
-         setdcr - Set an AMCC PPC 4xx DCR's value
-         getidcr - Get a register value via indirect DCR addressing
-         setidcr - Set a register value via indirect DCR addressing
-
-config CMD_SOUND
-       bool "sound"
-       depends on SOUND
-       help
-         This provides basic access to the U-Boot's sound support. The main
-         feature is to play a beep.
-
-            sound init   - set up sound system
-            sound play   - play a sound
-
-endmenu
-
 menu "Boot timing"
 
 config BOOTSTAGE
@@ -565,13 +46,6 @@ config BOOTSTAGE_USER_COUNT
          a new ID will be allocated from this stash. If you exceed
          the limit, recording will stop.
 
-config CMD_BOOTSTAGE
-       bool "Enable the 'bootstage' command"
-       depends on BOOTSTAGE
-       help
-         Add a 'bootstage' command which supports printing a report
-         and un/stashing of bootstage data.
-
 config BOOTSTAGE_FDT
        bool "Store boot timing information in the OS device tree"
        depends on BOOTSTAGE
@@ -623,66 +97,6 @@ config BOOTSTAGE_STASH_SIZE
 
 endmenu
 
-menu "Power commands"
-config CMD_PMIC
-       bool "Enable Driver Model PMIC command"
-       depends on DM_PMIC
-       help
-         This is the pmic command, based on a driver model pmic's API.
-         Command features are unchanged:
-         - list               - list pmic devices
-         - pmic dev <id>      - show or [set] operating pmic device (NEW)
-         - pmic dump          - dump registers
-         - pmic read address  - read byte of register at address
-         - pmic write address - write byte to register at address
-         The only one change for this command is 'dev' subcommand.
-
-config CMD_REGULATOR
-       bool "Enable Driver Model REGULATOR command"
-       depends on DM_REGULATOR
-       help
-         This command is based on driver model regulator's API.
-         User interface features:
-         - list               - list regulator devices
-         - regulator dev <id> - show or [set] operating regulator device
-         - regulator info     - print constraints info
-         - regulator status   - print operating status
-         - regulator value <val] <-f> - print/[set] voltage value [uV]
-         - regulator current <val>    - print/[set] current value [uA]
-         - regulator mode <id>        - print/[set] operating mode id
-         - regulator enable           - enable the regulator output
-         - regulator disable          - disable the regulator output
-
-         The '-f' (force) option can be used for set the value which exceeds
-         the limits, which are found in device-tree and are kept in regulator's
-         uclass platdata structure.
-
-endmenu
-
-menu "Security commands"
-config CMD_TPM
-       bool "Enable the 'tpm' command"
-       depends on TPM
-       help
-         This provides a means to talk to a TPM from the command line. A wide
-         range of commands if provided - see 'tpm help' for details. The
-         command requires a suitable TPM on your board and the correct driver
-         must be enabled.
-
-config CMD_TPM_TEST
-       bool "Enable the 'tpm test' command"
-       depends on CMD_TPM
-       help
-         This provides a a series of tests to confirm that the TPM is working
-         correctly. The tests cover initialisation, non-volatile RAM, extend,
-         global lock and checking that timing is within expectations. The
-         tests pass correctly on Infineon TPMs but may need to be adjusted
-         for other devices.
-
-endmenu
-
-endmenu
-
 config CONSOLE_RECORD
        bool "Console recording"
        help
index 249227597af6f0bb3254c7605a5bc8ce45e37aa3..59984111e18b4b5bc49b5cd044f9858fd5a02a02 100644 (file)
@@ -31,11 +31,7 @@ obj-$(CONFIG_SYS_GENERIC_BOARD) += board_r.o
 obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o
 obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o
 
-# core command
-obj-y += cmd_boot.o
-obj-$(CONFIG_CMD_BOOTM) += cmd_bootm.o bootm.o bootm_os.o
-obj-y += cmd_help.o
-obj-y += cmd_version.o
+obj-$(CONFIG_CMD_BOOTM) += bootm.o bootm_os.o
 
 # environment
 obj-y += env_attr.o
@@ -58,143 +54,17 @@ obj-$(CONFIG_ENV_IS_IN_REMOTE) += env_remote.o
 obj-$(CONFIG_ENV_IS_IN_UBI) += env_ubi.o
 obj-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o
 
-# command
-obj-$(CONFIG_CMD_AES) += cmd_aes.o
-obj-$(CONFIG_CMD_AMBAPP) += cmd_ambapp.o
-obj-$(CONFIG_CMD_ARMFLASH) += cmd_armflash.o
-obj-$(CONFIG_SOURCE) += cmd_source.o
-obj-$(CONFIG_CMD_SOURCE) += cmd_source.o
-obj-$(CONFIG_CMD_BDI) += cmd_bdinfo.o
-obj-$(CONFIG_CMD_BEDBUG) += bedbug.o cmd_bedbug.o
-obj-$(CONFIG_CMD_BMP) += cmd_bmp.o
-obj-$(CONFIG_CMD_BOOTMENU) += cmd_bootmenu.o
-obj-$(CONFIG_CMD_BOOTLDR) += cmd_bootldr.o
-obj-$(CONFIG_CMD_BOOTSTAGE) += cmd_bootstage.o
-obj-$(CONFIG_CMD_CACHE) += cmd_cache.o
-obj-$(CONFIG_CMD_CBFS) += cmd_cbfs.o
-obj-$(CONFIG_CMD_CLK) += cmd_clk.o
-obj-$(CONFIG_CMD_CONSOLE) += cmd_console.o
-obj-$(CONFIG_CMD_CPLBINFO) += cmd_cplbinfo.o
-obj-$(CONFIG_CMD_CPU) += cmd_cpu.o
-obj-$(CONFIG_DATAFLASH_MMC_SELECT) += cmd_dataflash_mmc_mux.o
-obj-$(CONFIG_CMD_DATE) += cmd_date.o
-obj-$(CONFIG_CMD_DEMO) += cmd_demo.o
-obj-$(CONFIG_CMD_SOUND) += cmd_sound.o
-ifdef CONFIG_4xx
-obj-$(CONFIG_CMD_SETGETDCR) += cmd_dcr.o
-endif
-ifdef CONFIG_POST
-obj-$(CONFIG_CMD_DIAG) += cmd_diag.o
-endif
-obj-$(CONFIG_CMD_DISPLAY) += cmd_display.o
-obj-$(CONFIG_CMD_DTT) += cmd_dtt.o
-obj-$(CONFIG_CMD_ECHO) += cmd_echo.o
-obj-$(CONFIG_ENV_IS_IN_EEPROM) += cmd_eeprom.o
-obj-$(CONFIG_CMD_EEPROM) += cmd_eeprom.o
-obj-$(CONFIG_EFI_STUB) += cmd_efi.o
-obj-$(CONFIG_CMD_ELF) += cmd_elf.o
-obj-$(CONFIG_SYS_HUSH_PARSER) += cmd_exit.o
-obj-$(CONFIG_CMD_EXT4) += cmd_ext4.o
-obj-$(CONFIG_CMD_EXT2) += cmd_ext2.o
-obj-$(CONFIG_CMD_FAT) += cmd_fat.o
-obj-$(CONFIG_CMD_FDC) += cmd_fdc.o
-obj-$(CONFIG_OF_LIBFDT) += cmd_fdt.o fdt_support.o
-obj-$(CONFIG_CMD_FITUPD) += cmd_fitupd.o
-obj-$(CONFIG_CMD_FLASH) += cmd_flash.o
-ifdef CONFIG_FPGA
-obj-$(CONFIG_CMD_FPGA) += cmd_fpga.o
-endif
-obj-$(CONFIG_CMD_FPGAD) += cmd_fpgad.o
-obj-$(CONFIG_CMD_FS_GENERIC) += cmd_fs.o
-obj-$(CONFIG_CMD_FUSE) += cmd_fuse.o
-obj-$(CONFIG_CMD_GETTIME) += cmd_gettime.o
-obj-$(CONFIG_CMD_GPIO) += cmd_gpio.o
-obj-$(CONFIG_CMD_I2C) += cmd_i2c.o
-obj-$(CONFIG_CMD_IOTRACE) += cmd_iotrace.o
-obj-$(CONFIG_CMD_HASH) += cmd_hash.o
-obj-$(CONFIG_CMD_IDE) += cmd_ide.o
-obj-$(CONFIG_CMD_IMMAP) += cmd_immap.o
-obj-$(CONFIG_CMD_INI) += cmd_ini.o
-obj-$(CONFIG_CMD_IRQ) += cmd_irq.o
-obj-$(CONFIG_CMD_ITEST) += cmd_itest.o
-obj-$(CONFIG_CMD_JFFS2) += cmd_jffs2.o
-obj-$(CONFIG_CMD_CRAMFS) += cmd_cramfs.o
-obj-$(CONFIG_CMD_LDRINFO) += cmd_ldrinfo.o
-obj-$(CONFIG_CMD_LED) += cmd_led.o
-obj-$(CONFIG_CMD_LICENSE) += cmd_license.o
-obj-y += cmd_load.o
-obj-$(CONFIG_LOGBUFFER) += cmd_log.o
-obj-$(CONFIG_ID_EEPROM) += cmd_mac.o
-obj-$(CONFIG_CMD_MD5SUM) += cmd_md5sum.o
-obj-$(CONFIG_CMD_MEMORY) += cmd_mem.o
-obj-$(CONFIG_CMD_IO) += cmd_io.o
-obj-$(CONFIG_CMD_MFSL) += cmd_mfsl.o
+obj-$(CONFIG_CMD_BEDBUG) += bedbug.o
+obj-$(CONFIG_OF_LIBFDT) += fdt_support.o
+
 obj-$(CONFIG_MII) += miiphyutil.o
 obj-$(CONFIG_CMD_MII) += miiphyutil.o
 obj-$(CONFIG_PHYLIB) += miiphyutil.o
-obj-$(CONFIG_CMD_MII) += cmd_mii.o
-ifdef CONFIG_PHYLIB
-obj-$(CONFIG_CMD_MII) += cmd_mdio.o
-endif
-obj-$(CONFIG_CMD_MISC) += cmd_misc.o
-obj-$(CONFIG_CMD_MMC) += cmd_mmc.o
-obj-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o
-obj-$(CONFIG_MP) += cmd_mp.o
-obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o
-obj-$(CONFIG_CMD_NAND) += cmd_nand.o
-obj-$(CONFIG_CMD_NET) += cmd_net.o
-obj-$(CONFIG_CMD_ONENAND) += cmd_onenand.o
-obj-$(CONFIG_CMD_OTP) += cmd_otp.o
-obj-$(CONFIG_CMD_PART) += cmd_part.o
-ifdef CONFIG_PCI
-obj-$(CONFIG_CMD_PCI) += cmd_pci.o
-endif
-obj-y += cmd_pcmcia.o
-obj-$(CONFIG_CMD_PORTIO) += cmd_portio.o
-obj-$(CONFIG_CMD_PXE) += cmd_pxe.o
-obj-$(CONFIG_CMD_READ) += cmd_read.o
-obj-$(CONFIG_CMD_REGINFO) += cmd_reginfo.o
-obj-$(CONFIG_CMD_REISER) += cmd_reiser.o
-obj-$(CONFIG_CMD_REMOTEPROC) += cmd_remoteproc.o
-obj-$(CONFIG_SANDBOX) += cmd_host.o
-obj-$(CONFIG_CMD_SATA) += cmd_sata.o
-obj-$(CONFIG_CMD_SF) += cmd_sf.o
-obj-$(CONFIG_CMD_SCSI) += cmd_scsi.o
-obj-$(CONFIG_CMD_SHA1SUM) += cmd_sha1sum.o
-obj-$(CONFIG_CMD_SETEXPR) += cmd_setexpr.o
-obj-$(CONFIG_CMD_SOFTSWITCH) += cmd_softswitch.o
-obj-$(CONFIG_CMD_SPI) += cmd_spi.o
-obj-$(CONFIG_CMD_SPIBOOTLDR) += cmd_spibootldr.o
-obj-$(CONFIG_CMD_STRINGS) += cmd_strings.o
-obj-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o
-obj-$(CONFIG_CMD_TIME) += cmd_time.o
-obj-$(CONFIG_CMD_TRACE) += cmd_trace.o
-obj-$(CONFIG_SYS_HUSH_PARSER) += cmd_test.o
-obj-$(CONFIG_CMD_TPM) += cmd_tpm.o
-obj-$(CONFIG_CMD_TPM_TEST) += cmd_tpm_test.o
-obj-$(CONFIG_CMD_TSI148) += cmd_tsi148.o
-obj-$(CONFIG_CMD_UBI) += cmd_ubi.o
-obj-$(CONFIG_CMD_UBIFS) += cmd_ubifs.o
-obj-$(CONFIG_CMD_UNIVERSE) += cmd_universe.o
-obj-$(CONFIG_CMD_UNZIP) += cmd_unzip.o
-ifdef CONFIG_LZMA
-obj-$(CONFIG_CMD_LZMADEC) += cmd_lzmadec.o
-endif
+
 ifdef CONFIG_CMD_USB
-obj-y += cmd_usb.o
 obj-y += usb.o usb_hub.o
 obj-$(CONFIG_USB_STORAGE) += usb_storage.o
 endif
-obj-$(CONFIG_CMD_FASTBOOT) += cmd_fastboot.o
-obj-$(CONFIG_CMD_FS_UUID) += cmd_fs_uuid.o
-
-obj-$(CONFIG_CMD_USB_MASS_STORAGE) += cmd_usb_mass_storage.o
-obj-$(CONFIG_CMD_THOR_DOWNLOAD) += cmd_thordown.o
-obj-$(CONFIG_CMD_XIMG) += cmd_ximg.o
-obj-$(CONFIG_YAFFS2) += cmd_yaffs2.o
-obj-$(CONFIG_CMD_SPL) += cmd_spl.o
-obj-$(CONFIG_CMD_ZIP) += cmd_zip.o
-obj-$(CONFIG_CMD_ZFS) += cmd_zfs.o
 
 # others
 obj-$(CONFIG_BOOTSTAGE) += bootstage.o
@@ -216,14 +86,8 @@ obj-$(CONFIG_MODEM_SUPPORT) += modem.o
 obj-$(CONFIG_UPDATE_TFTP) += update.o
 obj-$(CONFIG_DFU_TFTP) += update.o
 obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
-obj-$(CONFIG_CMD_DFU) += cmd_dfu.o
-obj-$(CONFIG_CMD_GPT) += cmd_gpt.o
-obj-$(CONFIG_CMD_ETHSW) += cmd_ethsw.o
 
-# Power
-obj-$(CONFIG_CMD_PMIC) += cmd_pmic.o
-obj-$(CONFIG_CMD_REGULATOR) += cmd_regulator.o
-endif
+endif # !CONFIG_SPL_BUILD
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
@@ -234,9 +98,6 @@ ifdef CONFIG_SPL_USB_HOST_SUPPORT
 obj-$(CONFIG_SPL_USB_SUPPORT) += usb.o usb_hub.o
 obj-$(CONFIG_USB_STORAGE) += usb_storage.o
 endif
-ifdef CONFIG_SPL_SATA_SUPPORT
-obj-$(CONFIG_CMD_SCSI) += cmd_scsi.o
-endif
 # environment
 ifdef CONFIG_SPL_ENV_SUPPORT
 obj-$(CONFIG_SPL_ENV_SUPPORT) += env_attr.o
@@ -250,8 +111,6 @@ obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
 obj-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
 endif
 endif
-# core command
-obj-y += cmd_nvedit.o
 #environment
 obj-y += env_common.o
 #others
@@ -289,8 +148,6 @@ obj-y += fb_nand.o
 endif
 endif
 
-obj-$(CONFIG_CMD_BLOB) += cmd_blob.o
-
 # We always have this since drivers/ddr/fs/interactive.c needs it
 obj-y += cli_simple.o
 
@@ -299,6 +156,5 @@ obj-y += cli_readline.o
 obj-y += command.o
 obj-y += s_record.o
 obj-y += xyzModem.o
-obj-y += cmd_disk.o
 
 CFLAGS_env_embedded.o := -Wa,--no-warn -DENV_CRC=$(shell tools/envcrc 2>/dev/null)
index 58936ca4978a9e3914abdfd415b84c133b73cfe9..99d574db2c52523f94946a01e65ca63a36521d37 100644 (file)
@@ -435,7 +435,7 @@ static int bootm_load_os(bootm_headers_t *images, unsigned long *load_end,
                bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
                return err;
        }
-       flush_cache(load, (*load_end - load) * sizeof(ulong));
+       flush_cache(load, *load_end - load);
 
        debug("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
        bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED);
index bc37b6d962b0aa9eb2032a63b5d5c2044c329cb7..b3f5fdc03a168682bb351734e2b0b897988d64fb 100644 (file)
@@ -227,11 +227,6 @@ static void console_puts(int file, const char *s)
        }
 }
 
-static inline void console_printdevs(int file)
-{
-       iomux_printdevs(file);
-}
-
 static inline void console_doenv(int file, struct stdio_dev *dev)
 {
        iomux_doenv(file, dev->name);
@@ -265,11 +260,6 @@ static inline void console_puts(int file, const char *s)
        stdio_devices[file]->puts(stdio_devices[file], s);
 }
 
-static inline void console_printdevs(int file)
-{
-       printf("%s\n", stdio_devices[file]->name);
-}
-
 static inline void console_doenv(int file, struct stdio_dev *dev)
 {
        console_setfile(file, dev);
@@ -653,44 +643,6 @@ void clear_ctrlc(void)
        ctrlc_was_pressed = 0;
 }
 
-#ifdef CONFIG_MODEM_SUPPORT_DEBUG
-char   screen[1024];
-char *cursor = screen;
-int once = 0;
-inline void dbg(const char *fmt, ...)
-{
-       va_list args;
-       uint    i;
-       char    printbuffer[CONFIG_SYS_PBSIZE];
-
-       if (!once) {
-               memset(screen, 0, sizeof(screen));
-               once++;
-       }
-
-       va_start(args, fmt);
-
-       /* For this to work, printbuffer must be larger than
-        * anything we ever want to print.
-        */
-       i = vsnprintf(printbuffer, sizeof(printbuffer), fmt, args);
-       va_end(args);
-
-       if ((screen + sizeof(screen) - 1 - cursor)
-           < strlen(printbuffer) + 1) {
-               memset(screen, 0, sizeof(screen));
-               cursor = screen;
-       }
-       sprintf(cursor, printbuffer);
-       cursor += strlen(printbuffer);
-
-}
-#else
-static inline void dbg(const char *fmt, ...)
-{
-}
-#endif
-
 /** U-Boot INIT FUNCTIONS *************************************************/
 
 struct stdio_dev *search_device(int flags, const char *name)
index 15aa43d5e1628bcc0ab8508c0b36922565bc06f3..bdb452e58c598731c9edc8e93d5e37f19e280919 100644 (file)
@@ -54,6 +54,11 @@ __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
        return 0;
 }
 
+__weak int mmc_get_env_dev(void)
+{
+       return CONFIG_SYS_MMC_ENV_DEV;
+}
+
 int env_init(void)
 {
        /* use default */
@@ -74,7 +79,7 @@ static unsigned char env_mmc_orig_hwpart;
 static int mmc_set_env_part(struct mmc *mmc)
 {
        uint part = mmc_get_env_part(mmc);
-       int dev = CONFIG_SYS_MMC_ENV_DEV;
+       int dev = mmc_get_env_dev();
        int ret = 0;
 
 #ifdef CONFIG_SPL_BUILD
@@ -109,7 +114,7 @@ static const char *init_mmc_for_env(struct mmc *mmc)
 static void fini_mmc_for_env(struct mmc *mmc)
 {
 #ifdef CONFIG_SYS_MMC_ENV_PART
-       int dev = CONFIG_SYS_MMC_ENV_DEV;
+       int dev = mmc_get_env_dev();
 
 #ifdef CONFIG_SPL_BUILD
        dev = 0;
@@ -140,7 +145,8 @@ static unsigned char env_flags;
 int saveenv(void)
 {
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
-       struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
+       int dev = mmc_get_env_dev();
+       struct mmc *mmc = find_mmc_device(dev);
        u32     offset;
        int     ret, copy = 0;
        const char *errmsg;
@@ -167,8 +173,7 @@ int saveenv(void)
                goto fini;
        }
 
-       printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "",
-              CONFIG_SYS_MMC_ENV_DEV);
+       printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "", dev);
        if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
                puts("failed\n");
                ret = 1;
@@ -212,7 +217,7 @@ void env_relocate_spec(void)
        int crc1_ok = 0, crc2_ok = 0;
        env_t *ep;
        int ret;
-       int dev = CONFIG_SYS_MMC_ENV_DEV;
+       int dev = mmc_get_env_dev();
        const char *errmsg = NULL;
 
        ALLOC_CACHE_ALIGN_BUFFER(env_t, tmp_env1, 1);
@@ -298,7 +303,7 @@ void env_relocate_spec(void)
        struct mmc *mmc;
        u32 offset;
        int ret;
-       int dev = CONFIG_SYS_MMC_ENV_DEV;
+       int dev = mmc_get_env_dev();
        const char *errmsg;
 
 #ifdef CONFIG_SPL_BUILD
index 2f3594a4176cb673bc9bfa095a58b6c22098d059..51705adeaf79918bce59a374a3319c6cb98a3cce 100644 (file)
@@ -89,13 +89,24 @@ static void lcd_stub_puts(struct stdio_dev *dev, const char *s)
 /* Small utility to check that you got the colours right */
 #ifdef LCD_TEST_PATTERN
 
+#if LCD_BPP == LCD_COLOR8
 #define        N_BLK_VERT      2
 #define        N_BLK_HOR       3
 
 static int test_colors[N_BLK_HOR * N_BLK_VERT] = {
        CONSOLE_COLOR_RED,      CONSOLE_COLOR_GREEN,    CONSOLE_COLOR_YELLOW,
        CONSOLE_COLOR_BLUE,     CONSOLE_COLOR_MAGENTA,  CONSOLE_COLOR_CYAN,
+}; /*LCD_BPP == LCD_COLOR8 */
+
+#elif LCD_BPP == LCD_COLOR16
+#define        N_BLK_VERT      2
+#define        N_BLK_HOR       4
+
+static int test_colors[N_BLK_HOR * N_BLK_VERT] = {
+       CONSOLE_COLOR_RED,      CONSOLE_COLOR_GREEN,    CONSOLE_COLOR_YELLOW,   CONSOLE_COLOR_BLUE,
+       CONSOLE_COLOR_MAGENTA,  CONSOLE_COLOR_CYAN,     CONSOLE_COLOR_GREY,     CONSOLE_COLOR_WHITE,
 };
+#endif /*LCD_BPP == LCD_COLOR16 */
 
 static void test_pattern(void)
 {
@@ -104,12 +115,15 @@ static void test_pattern(void)
        ushort v_step = (v_max + N_BLK_VERT - 1) / N_BLK_VERT;
        ushort h_step = (h_max + N_BLK_HOR  - 1) / N_BLK_HOR;
        ushort v, h;
+#if LCD_BPP == LCD_COLOR8
        uchar *pix = (uchar *)lcd_base;
+#elif LCD_BPP == LCD_COLOR16
+       ushort *pix = (ushort *)lcd_base;
+#endif
 
        printf("[LCD] Test Pattern: %d x %d [%d x %d]\n",
                h_max, v_max, h_step, v_step);
 
-       /* WARNING: Code silently assumes 8bit/pixel */
        for (v = 0; v < v_max; ++v) {
                uchar iy = v / v_step;
                for (h = 0; h < h_max; ++h) {
index cbb1995de3398431878811f92f6e79551b947965..d84865fbbe26bb337d9453a86c03d8dbb06ae43d 100644 (file)
@@ -199,7 +199,7 @@ static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
                }
        }
 
-       if ((scancode > 0x1d) && (scancode < 0x3a)) {
+       if ((scancode > 0x1d) && (scancode < 0x39)) {
                /* Shift pressed */
                if (modifier & (LEFT_SHIFT | RIGHT_SHIFT))
                        keycode = usb_kbd_numkey_shifted[scancode - 0x1e];
index 40588b9326838c8ae03aebf87c85bfb79137ae43..4f4a07be56a7dd048d86cb18d07cf05669d0aaa5 100644 (file)
@@ -17,3 +17,4 @@ CONFIG_CMD_GPIO=y
 CONFIG_NETCONSOLE=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_AXP_ALDO4_VOLT=2500
diff --git a/configs/Sinovoip_BPI_M3_defconfig b/configs/Sinovoip_BPI_M3_defconfig
new file mode 100644 (file)
index 0000000..b96be50
--- /dev/null
@@ -0,0 +1,26 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SUNXI=y
+CONFIG_MACH_SUN8I_A83T=y
+CONFIG_DRAM_CLK=480
+CONFIG_DRAM_ZQ=15355
+CONFIG_DRAM_ODT_EN=y
+CONFIG_DRAM_TYPE=7
+CONFIG_SYS_EXTRA_OPTIONS=""
+#CONFIG_USB0_VBUS_PIN="AXP0-VBUS-ENABLE"
+#CONFIG_USB0_VBUS_DET="AXP0-VBUS-DETECT"
+CONFIG_AXP_GPIO=y
+#CONFIG_USB_MUSB_HOST=y
+CONFIG_DEFAULT_DEVICE_TREE="sun8i-a83t-sinovoip-bpi-m3"
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_SPL=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_AXP_DCDC1_VOLT=3000
+CONFIG_AXP_DCDC2_VOLT=900
+CONFIG_AXP_DCDC3_VOLT=900
+CONFIG_AXP_DCDC4_VOLT=0
+CONFIG_AXP_DCDC5_VOLT=1200
+CONFIG_AXP_ALDO2_VOLT=0
+CONFIG_AXP_ALDO3_VOLT=0
+CONFIG_AXP_DLDO4_VOLT=0
index 27e53c14c6c21cb6ac9eaebb08b04f6f2dbd156d..bd8b9649ced719e164f70dace0422c06db2061e3 100644 (file)
@@ -55,6 +55,8 @@ CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_ROCKCHIP_SPI=y
 CONFIG_DM_VIDEO=y
+CONFIG_I2C_EDID=y
+CONFIG_DISPLAY=y
 CONFIG_VIDEO_ROTATION=y
 CONFIG_VIDEO_ROCKCHIP=y
 CONFIG_USE_PRIVATE_LIBGCC=y
index baa0ed84be874578e85d044a52a86900be19e68b..1cee7d488809db238cf6bd26780acf4979a6d435 100644 (file)
@@ -1,11 +1,14 @@
 CONFIG_X86=y
 CONFIG_SYS_MALLOC_F_LEN=0x1800
+CONFIG_DM_I2C=y
 CONFIG_VENDOR_GOOGLE=y
 CONFIG_DEFAULT_DEVICE_TREE="chromebook_link"
 CONFIG_TARGET_CHROMEBOOK_LINK=y
 CONFIG_HAVE_MRC=y
 CONFIG_ENABLE_MRC_CACHE=y
+CONFIG_SMP=y
 CONFIG_HAVE_VGA_BIOS=y
+CONFIG_CMD_CPU=y
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -17,6 +20,10 @@ CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_TPM=y
 CONFIG_CMD_TPM_TEST=y
 CONFIG_OF_CONTROL=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_CPU=y
+CONFIG_SYS_I2C_INTEL=y
 CONFIG_CMD_CROS_EC=y
 CONFIG_CROS_EC=y
 CONFIG_CROS_EC_LPC=y
@@ -34,6 +41,8 @@ CONFIG_SYS_NS16550=y
 CONFIG_ICH_SPI=y
 CONFIG_TIMER=y
 CONFIG_TPM_TIS_LPC=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_VIDEO_VESA=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
 CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
index c368cc06c452398b15b0cd21a67fb147e00b736a..e4a38210479b6c5f7d9ec5d7bfe6dc0984bb606d 100644 (file)
@@ -16,6 +16,8 @@ CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_TPM=y
 CONFIG_CMD_TPM_TEST=y
 CONFIG_OF_CONTROL=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
 CONFIG_CMD_CROS_EC=y
 CONFIG_CROS_EC=y
 CONFIG_CROS_EC_LPC=y
@@ -29,6 +31,8 @@ CONFIG_SYS_NS16550=y
 CONFIG_ICH_SPI=y
 CONFIG_TIMER=y
 CONFIG_TPM_TIS_LPC=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
 CONFIG_VIDEO_VESA=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
 CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
index 15eb4d87b9ffcf666f77be64e7057ac256b34277..3b29158f4acab6504f0acd5ed1d868db29c6aace 100644 (file)
@@ -47,6 +47,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_DM_VIDEO=y
+CONFIG_I2C_EDID=y
+CONFIG_DISPLAY=y
 CONFIG_VIDEO_ROTATION=y
 CONFIG_VIDEO_ROCKCHIP=y
 CONFIG_USE_PRIVATE_LIBGCC=y
diff --git a/configs/fx12mm_defconfig b/configs/fx12mm_defconfig
deleted file mode 100644 (file)
index c714d0d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_FX12MM=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0x04000000,RESET_VECTOR_ADDRESS=0x04100000,INIT_TLB=board/xilinx/ppc405-generic/init.o"
-CONFIG_SYS_PROMPT="FX12MM:/# "
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
-CONFIG_SYS_NS16550=y
diff --git a/configs/fx12mm_flash_defconfig b/configs/fx12mm_flash_defconfig
deleted file mode 100644 (file)
index ac38412..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_FX12MM=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC,INIT_TLB=board/xilinx/ppc405-generic/init.o"
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
-CONFIG_SYS_NS16550=y
index dc2809acb0e6feff0c5d106ba6de2688fc1cbd76..ecd04a6629dafca45a2efbbdd83bbe5ce2033050 100644 (file)
@@ -19,6 +19,3 @@ CONFIG_AXP_DCDC2_VOLT=900
 CONFIG_AXP_DCDC3_VOLT=900
 CONFIG_AXP_DCDC4_VOLT=0
 CONFIG_AXP_DCDC5_VOLT=1500
-CONFIG_AXP_ALDO2_VOLT=0
-CONFIG_AXP_ALDO3_VOLT=0
-CONFIG_AXP_DLDO4_VOLT=0
index ed336e6bc4412dd7bf9c4063c6d057139fdfa977..39c2ad2813dcd4ec72e7b77afbcdb3c2575e2a1c 100644 (file)
@@ -1,10 +1,24 @@
 CONFIG_MICROBLAZE=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
+CONFIG_SPL_DM=y
 CONFIG_TARGET_MICROBLAZE_GENERIC=y
 CONFIG_SYS_TEXT_BASE=0x29000000
 CONFIG_DEFAULT_DEVICE_TREE="microblaze-generic"
 CONFIG_SPL=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="U-Boot-mONStR> "
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_EMBED=y
+CONFIG_NETCONSOLE=y
+CONFIG_DM_ETH=y
+CONFIG_XILINX_AXIEMAC=y
+CONFIG_XILINX_EMACLITE=y
+CONFIG_SYS_NS16550=y
+CONFIG_XILINX_UARTLITE=y
diff --git a/configs/ml507_defconfig b/configs/ml507_defconfig
deleted file mode 100644 (file)
index d1e4e30..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_ML507=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0x04000000,RESET_VECTOR_ADDRESS=0x04100000,BOOT_FROM_XMD=1,INIT_TLB=board/xilinx/ppc440-generic/init.o"
-CONFIG_SYS_PROMPT="ml507:/# "
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
diff --git a/configs/ml507_flash_defconfig b/configs/ml507_flash_defconfig
deleted file mode 100644 (file)
index 442e0ce..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_ML507=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC,INIT_TLB=board/xilinx/ppc440-generic/init.o"
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
index 03348a6987a427e1fcfdad15dbda1f09ca43c6d1..ca0f9e067bfe853b5072810336bcbdc52cd74489 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_TPM_TIS_INFINEON=y
 CONFIG_USB=y
 CONFIG_DM_USB=y
 CONFIG_DISPLAY=y
+CONFIG_I2C_EDID=y
 CONFIG_VIDEO_TEGRA124=y
 CONFIG_USE_PRIVATE_LIBGCC=y
 CONFIG_TPM=y
index 2563775c6b759abaee00bb920c4c679d935a5480..68e3b367a33b2e46d932726c4fa2ceb38d2bfc55 100644 (file)
@@ -45,6 +45,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_DM_VIDEO=y
+CONFIG_I2C_EDID=y
+CONFIG_DISPLAY=y
 CONFIG_VIDEO_ROTATION=y
 CONFIG_VIDEO_ROCKCHIP=y
 CONFIG_USE_PRIVATE_LIBGCC=y
diff --git a/configs/theadorable_debug_defconfig b/configs/theadorable_debug_defconfig
new file mode 100644 (file)
index 0000000..fbed23c
--- /dev/null
@@ -0,0 +1,28 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_THEADORABLE=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-xp-theadorable"
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_SPL=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xd0012000
+CONFIG_DEBUG_UART_CLOCK=250000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_VIDEO_MVEBU=y
diff --git a/configs/theadorable_defconfig b/configs/theadorable_defconfig
new file mode 100644 (file)
index 0000000..cce4669
--- /dev/null
@@ -0,0 +1,26 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_THEADORABLE=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-xp-theadorable"
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_SPL=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_NET is not set
+# CONFIG_CMD_NFS is not set
+CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xd0012000
+CONFIG_DEBUG_UART_CLOCK=250000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550=y
+CONFIG_VIDEO_MVEBU=y
+CONFIG_REGEX=y
+CONFIG_LIB_RAND=y
diff --git a/configs/v5fx30teval_defconfig b/configs/v5fx30teval_defconfig
deleted file mode 100644 (file)
index 3e2ce7d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_V5FX30TEVAL=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0x04000000,RESET_VECTOR_ADDRESS=0x04100000,BOOT_FROM_XMD=1,INIT_TLB=board/xilinx/ppc440-generic/init.o"
-CONFIG_SYS_PROMPT="v5fx30t:/# "
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
diff --git a/configs/v5fx30teval_flash_defconfig b/configs/v5fx30teval_flash_defconfig
deleted file mode 100644 (file)
index b9b05e8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_V5FX30TEVAL=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC,INIT_TLB=board/xilinx/ppc440-generic/init.o"
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
index 53fafc324e68f20923b8d65473bdefdcf12d703e..e7132cd611522403a01205cf683f601868d84705 100644 (file)
@@ -7,3 +7,11 @@ CONFIG_SYS_PROMPT="xlx-ppc405:/# "
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_NET is not set
 # CONFIG_CMD_NFS is not set
+CONFIG_SYS_MALLOC_SIMPLE=y
+CONFIG_XILINX_UARTLITE=y
+CONFIG_SYS_NS16550=y
+CONFIG_OF_EMBED=y
+CONFIG_OF_CONTROL=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_DEFAULT_DEVICE_TREE="xilinx-ppc440-generic"
diff --git a/configs/xilinx-ppc405-generic_flash_defconfig b/configs/xilinx-ppc405-generic_flash_defconfig
deleted file mode 100644 (file)
index 37084fb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_XILINX_PPC405_GENERIC=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC"
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
index 79be48a9955e3fb6193534c70bd750633c66fb51..3bf2c4f8b88467f724dbc92f826f155aaddfc1be 100644 (file)
@@ -3,7 +3,15 @@ CONFIG_4xx=y
 CONFIG_TARGET_XILINX_PPC440_GENERIC=y
 CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0x04000000,RESET_VECTOR_ADDRESS=0x04100000,BOOT_FROM_XMD=1"
 CONFIG_SYS_PROMPT="board:/# "
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
+CONFIG_SYS_MALLOC_SIMPLE=y
+CONFIG_XILINX_UARTLITE=y
+CONFIG_SYS_NS16550=y
+CONFIG_OF_EMBED=y
+CONFIG_OF_CONTROL=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_DEFAULT_DEVICE_TREE="xilinx-ppc440-generic"
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_NETCONSOLE=y
diff --git a/configs/xilinx-ppc440-generic_flash_defconfig b/configs/xilinx-ppc440-generic_flash_defconfig
deleted file mode 100644 (file)
index 6299033..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG_PPC=y
-CONFIG_4xx=y
-CONFIG_TARGET_XILINX_PPC440_GENERIC=y
-CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xF7F60000,RESET_VECTOR_ADDRESS=0xF7FFFFFC"
-# CONFIG_CMD_IMLS is not set
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-# CONFIG_CMD_NFS is not set
index 30995babd4b63ae9f21d176f7e232b710ec671fa..a3a66ec41a377e2e4cb32681d57f17fe80cc31fb 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_SPL=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
index 339e399889be8f122c99cda99e4ea7c5db0d3d73..fbc603fd95cddcb668ef97170dd6ebbc54bdd404 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARCH_ZYNQ=y
 CONFIG_TARGET_ZYNQ_PICOZED=y
 CONFIG_DEFAULT_DEVICE_TREE="zynq-picozed"
 CONFIG_SPL=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
index 065f8551945f0bd9642f2349c19a499b98e3d6ff..3540653e2270c0659c32092e475cd46a229af51d 100644 (file)
@@ -5,6 +5,7 @@ CONFIG_SPL=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -12,6 +13,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
index 1059689aad45f20e10fde22af98159271e036224..f333b7a2bfedaada5294c1027bb838112f509e2b 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_SPL=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -13,6 +14,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
index a9dbda5eaa0b84aaedc2627dbfc3d0c98ea08a16..ebfdeb098b5bedf22f36e661105601360f616699 100644 (file)
@@ -7,6 +7,7 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_SYS_EXTRA_OPTIONS="ZC770_XM010"
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -14,6 +15,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_SST=y
index 6ff00c64b4276df7b8700c77904008af97afc6b6..2bc88b8dd2f8c1fb6ca1dddffd4c853f4ee78a77 100644 (file)
@@ -7,6 +7,7 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_SYS_EXTRA_OPTIONS="ZC770_XM011"
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
index 75d6c5531c92e3a3f09304f027931315c6109084..b0fa6610648d68e31ca0e1512cdcc7ea86a4b93b 100644 (file)
@@ -7,6 +7,7 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_SYS_EXTRA_OPTIONS="ZC770_XM012"
+CONFIG_SYS_PROMPT="Zynq> "
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_NET_RANDOM_ETHADDR=y
index dd65929958e782c3785a2a01af0dd41b6369052f..9672940e91f2fe1285c89e42b2706903ed335d9e 100644 (file)
@@ -7,10 +7,13 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_SYS_EXTRA_OPTIONS="ZC770_XM013"
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_ZYNQ_GEM=y
index 73b17e20b27c80c0b0096a05ccd7962ba85cf1f5..58680127aa5d22d6b3037e1ca93346fe1b0b9d68 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_SPL=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
@@ -13,6 +14,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_BAR=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
index 577c5a958e11f223638ba02a51f8469bce48c1fc..ebaae49da1d4e8611f0bd63c72e8569fd4a0738a 100644 (file)
@@ -6,17 +6,18 @@ CONFIG_SPL=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_SIGNATURE=y
+CONFIG_SYS_PROMPT="Zynq> "
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_ZYNQ_GEM=y
 CONFIG_DEBUG_UART=y
 CONFIG_DEBUG_UART_ZYNQ=y
 CONFIG_DEBUG_UART_BASE=0xe0001000
 CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_SPI_FLASH=y
-CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_ZYNQ_QSPI=y
diff --git a/doc/device-tree-bindings/serial/8250.txt b/doc/device-tree-bindings/serial/8250.txt
new file mode 100644 (file)
index 0000000..91d5ab0
--- /dev/null
@@ -0,0 +1,66 @@
+* UART (Universal Asynchronous Receiver/Transmitter)
+
+Required properties:
+- compatible : one of:
+       - "ns8250"
+       - "ns16450"
+       - "ns16550a"
+       - "ns16550"
+       - "ns16750"
+       - "ns16850"
+       - For Tegra20, must contain "nvidia,tegra20-uart"
+       - For other Tegra, must contain '"nvidia,<chip>-uart",
+         "nvidia,tegra20-uart"' where <chip> is tegra30, tegra114, tegra124,
+         tegra132, or tegra210.
+       - "nxp,lpc3220-uart"
+       - "ralink,rt2880-uart"
+       - "ibm,qpace-nwp-serial"
+       - "altr,16550-FIFO32"
+       - "altr,16550-FIFO64"
+       - "altr,16550-FIFO128"
+       - "fsl,16550-FIFO64"
+       - "fsl,ns16550"
+       - "serial" if the port type is unknown.
+- reg : offset and length of the register set for the device.
+- interrupts : should contain uart interrupt.
+- clock-frequency : the input clock frequency for the UART
+        or
+  clocks phandle to refer to the clk used as per Documentation/devicetree
+  /bindings/clock/clock-bindings.txt
+
+Optional properties:
+- current-speed : the current active speed of the UART.
+- reg-offset : offset to apply to the mapbase from the start of the registers.
+- reg-shift : quantity to shift the register offsets by.
+- reg-io-width : the size (in bytes) of the IO accesses that should be
+  performed on the device.  There are some systems that require 32-bit
+  accesses to the UART (e.g. TI davinci).
+- used-by-rtas : set to indicate that the port is in use by the OpenFirmware
+  RTAS and should not be registered.
+- no-loopback-test: set to indicate that the port does not implements loopback
+  test mode
+- fifo-size: the fifo size of the UART.
+- auto-flow-control: one way to enable automatic flow control support. The
+  driver is allowed to detect support for the capability even without this
+  property.
+
+Note:
+* fsl,ns16550:
+  ------------
+  Freescale DUART is very similar to the PC16552D (and to a
+  pair of NS16550A), albeit with some nonstandard behavior such as
+  erratum A-004737 (relating to incorrect BRK handling).
+
+  Represents a single port that is compatible with the DUART found
+  on many Freescale chips (examples include mpc8349, mpc8548,
+  mpc8641d, p4080 and ls2085a).
+
+Example:
+
+       uart@80230000 {
+               compatible = "ns8250";
+               reg = <0x80230000 0x100>;
+               clock-frequency = <3686400>;
+               interrupts = <10>;
+               reg-shift = <2>;
+       };
diff --git a/doc/device-tree-bindings/serial/ns16550.txt b/doc/device-tree-bindings/serial/ns16550.txt
deleted file mode 100644 (file)
index ef0b9ae..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-NS16550 UART
-
-This UART driver supports many chip variants and is used in mamy SoCs.
-
-Required properties:
-- compatible: "ns16550" or "nvidia,tegra20-uart"
-- reg: start address and size of registers
-- reg-shift: shift value indicating register size: 0=byte, 1=16bit,2=32bit etc.
-- clock-frequency: input clock frequency for the UART (used to calculate the
-    baud rate divisor)
diff --git a/doc/device-tree-bindings/serial/omap_serial.txt b/doc/device-tree-bindings/serial/omap_serial.txt
new file mode 100644 (file)
index 0000000..7a71b5d
--- /dev/null
@@ -0,0 +1,33 @@
+OMAP UART controller
+
+Required properties:
+- compatible : should be "ti,omap2-uart" for OMAP2 controllers
+- compatible : should be "ti,omap3-uart" for OMAP3 controllers
+- compatible : should be "ti,omap4-uart" for OMAP4 controllers
+- compatible : should be "ti,am4372-uart" for AM437x controllers
+- compatible : should be "ti,am3352-uart" for AM335x controllers
+- compatible : should be "ti,dra742-uart" for DRA7x controllers
+- reg : address and length of the register space
+- interrupts or interrupts-extended : Should contain the uart interrupt
+                                      specifier or both the interrupt
+                                      controller phandle and interrupt
+                                      specifier.
+- ti,hwmods : Must be "uart<n>", n being the instance number (1-based)
+
+Optional properties:
+- clock-frequency : frequency of the clock input to the UART
+- dmas : DMA specifier, consisting of a phandle to the DMA controller
+         node and a DMA channel number.
+- dma-names : "rx" for receive channel, "tx" for transmit channel.
+
+Example:
+
+                uart4: serial@49042000 {
+                        compatible = "ti,omap3-uart";
+                        reg = <0x49042000 0x400>;
+                        interrupts = <80>;
+                        dmas = <&sdma 81 &sdma 82>;
+                        dma-names = "tx", "rx";
+                        ti,hwmods = "uart4";
+                        clock-frequency = <48000000>;
+                };
diff --git a/doc/device-tree-bindings/serial/snps-dw-apb-uart.txt b/doc/device-tree-bindings/serial/snps-dw-apb-uart.txt
new file mode 100644 (file)
index 0000000..12bbe9f
--- /dev/null
@@ -0,0 +1,76 @@
+* Synopsys DesignWare ABP UART
+
+Required properties:
+- compatible : "snps,dw-apb-uart"
+- reg : offset and length of the register set for the device.
+- interrupts : should contain uart interrupt.
+
+Clock handling:
+The clock rate of the input clock needs to be supplied by one of
+- clock-frequency : the input clock frequency for the UART.
+- clocks : phandle to the input clock
+
+The supplying peripheral clock can also be handled, needing a second property
+- clock-names: tuple listing input clock names.
+       Required elements: "baudclk", "apb_pclk"
+
+Optional properties:
+- snps,uart-16550-compatible : reflects the value of UART_16550_COMPATIBLE
+  configuration parameter. Define this if your UART does not implement the busy
+  functionality.
+- resets : phandle to the parent reset controller.
+- reg-shift : quantity to shift the register offsets by.  If this property is
+  not present then the register offsets are not shifted.
+- reg-io-width : the size (in bytes) of the IO accesses that should be
+  performed on the device.  If this property is not present then single byte
+  accesses are used.
+- dcd-override : Override the DCD modem status signal. This signal will always
+  be reported as active instead of being obtained from the modem status
+  register. Define this if your serial port does not use this pin.
+- dsr-override : Override the DTS modem status signal. This signal will always
+  be reported as active instead of being obtained from the modem status
+  register. Define this if your serial port does not use this pin.
+- cts-override : Override the CTS modem status signal. This signal will always
+  be reported as active instead of being obtained from the modem status
+  register. Define this if your serial port does not use this pin.
+- ri-override : Override the RI modem status signal. This signal will always be
+  reported as inactive instead of being obtained from the modem status register.
+  Define this if your serial port does not use this pin.
+
+Example:
+
+       uart@80230000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x80230000 0x100>;
+               clock-frequency = <3686400>;
+               interrupts = <10>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               dcd-override;
+               dsr-override;
+               cts-override;
+               ri-override;
+       };
+
+Example with one clock:
+
+       uart@80230000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x80230000 0x100>;
+               clocks = <&baudclk>;
+               interrupts = <10>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+       };
+
+Example with two clocks:
+
+       uart@80230000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x80230000 0x100>;
+               clocks = <&baudclk>, <&apb_pclk>;
+               clock-names = "baudclk", "apb_pclk";
+               interrupts = <10>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+       };
diff --git a/doc/device-tree-bindings/serial/xilinx_uartlite.txt b/doc/device-tree-bindings/serial/xilinx_uartlite.txt
new file mode 100644 (file)
index 0000000..d15753c
--- /dev/null
@@ -0,0 +1,13 @@
+Binding for Xilinx Uartlite Controller
+
+Required properties:
+- compatible : should be "xlnx,xps-uartlite-1.00.a", or "xlnx,opb-uartlite-1.00.b"
+- reg: Should contain UART controller registers location and length.
+- interrupts: Should contain UART controller interrupts.
+
+Example:
+       serial@40600000 {
+               compatible = "xlnx,xps-uartlite-1.00.a";
+               interrupts = <1 0>;
+               reg = <0x40600000 0x10000>;
+       };
index c933b9081be1aba9079dee8f916a2696d219286b..e5e482e30bc297ad6f5b957b6ed65cf068009a76 100644 (file)
@@ -15,7 +15,6 @@ is time for maintainers to start converting over the remaining serial drivers:
    serial_pxa.c
    serial_s3c24x0.c
    serial_sa1100.c
-   serial_xuartlite.c
    usbtty.c
 
 You should complete this by the end of January 2016.
index 00da40b704a705c2ac4645b68b61b294f7dcddc8..6294048f2611488d30b7623a7a0a3a8321c36830 100644 (file)
@@ -51,6 +51,7 @@ obj-y += hwmon/
 obj-y += misc/
 obj-y += pcmcia/
 obj-y += dfu/
+obj-$(CONFIG_X86) += pch/
 obj-y += rtc/
 obj-y += sound/
 obj-y += timer/
index dec6230ad5cd6ca835a4d0f8b8c07906da74fa3f..77172467b2e18141c7f88b786f026ec6a084d7cf 100644 (file)
@@ -226,11 +226,19 @@ This function executes the BIOS POST code on the controller. We assume that
 at this stage the controller has its I/O and memory space enabled and
 that all other controllers are in a disabled state.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+static void PCI_doBIOSPOST(struct udevice *pcidev, BE_VGAInfo *vga_info,
+                          int vesa_mode, struct vbe_mode_info *mode_info)
+#else
 static void PCI_doBIOSPOST(pci_dev_t pcidev, BE_VGAInfo *vga_info,
                           int vesa_mode, struct vbe_mode_info *mode_info)
+#endif
 {
        RMREGS regs;
        RMSREGS sregs;
+#ifdef CONFIG_DM_PCI
+       pci_dev_t bdf;
+#endif
 
        /* Determine the value to store in AX for BIOS POST. Per the PCI specs,
         AH must contain the bus and AL must contain the devfn, encoded as
@@ -238,9 +246,14 @@ static void PCI_doBIOSPOST(pci_dev_t pcidev, BE_VGAInfo *vga_info,
         */
        memset(&regs, 0, sizeof(regs));
        memset(&sregs, 0, sizeof(sregs));
+#ifdef CONFIG_DM_PCI
+       bdf = dm_pci_get_bdf(pcidev);
+       regs.x.ax = (int)PCI_BUS(bdf) << 8 |
+                       (int)PCI_DEV(bdf) << 3 | (int)PCI_FUNC(bdf);
+#else
        regs.x.ax = ((int)PCI_BUS(pcidev) << 8) |
            ((int)PCI_DEV(pcidev) << 3) | (int)PCI_FUNC(pcidev);
-
+#endif
        /*Setup the X86 emulator for the VGA BIOS*/
        BE_setVGA(vga_info);
 
@@ -281,15 +294,28 @@ NOTE: This function leaves the original memory aperture disabled by leaving
       it programmed to all 1's. It must be restored to the correct value
       later.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+static u32 PCI_findBIOSAddr(struct udevice *pcidev, int *bar)
+#else
 static u32 PCI_findBIOSAddr(pci_dev_t pcidev, int *bar)
+#endif
 {
        u32 base, size;
 
        for (*bar = 0x10; *bar <= 0x14; (*bar) += 4) {
+#ifdef CONFIG_DM_PCI
+               dm_pci_read_config32(pcidev, *bar, &base);
+#else
                pci_read_config_dword(pcidev, *bar, &base);
+#endif
                if (!(base & 0x1)) {
+#ifdef CONFIG_DM_PCI
+                       dm_pci_write_config32(pcidev, *bar, 0xFFFFFFFF);
+                       dm_pci_read_config32(pcidev, *bar, &size);
+#else
                        pci_write_config_dword(pcidev, *bar, 0xFFFFFFFF);
                        pci_read_config_dword(pcidev, *bar, &size);
+#endif
                        size = ~(size & ~0xFF) + 1;
                        if (size >= MAX_BIOSLEN)
                                return base & ~0xFF;
@@ -312,11 +338,19 @@ necessary).
 Anyway to fix this we change all I/O mapped base registers and
 chop off the top bits.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+static void PCI_fixupIObase(struct udevice *pcidev, int reg, u32 *base)
+#else
 static void PCI_fixupIObase(pci_dev_t pcidev, int reg, u32 * base)
+#endif
 {
        if ((*base & 0x1) && (*base > 0xFFFE)) {
                *base &= 0xFFFF;
+#ifdef CONFIG_DM_PCI
+               dm_pci_write_config32(pcidev, reg, *base);
+#else
                pci_write_config_dword(pcidev, reg, *base);
+#endif
 
        }
 }
@@ -331,18 +365,30 @@ Pointers to the mapped BIOS image
 REMARKS:
 Maps a pointer to the BIOS image on the graphics card on the PCI bus.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+void *PCI_mapBIOSImage(struct udevice *pcidev)
+#else
 void *PCI_mapBIOSImage(pci_dev_t pcidev)
+#endif
 {
        u32 BIOSImageBus;
        int BIOSImageBAR;
        u8 *BIOSImage;
 
        /*Save PCI BAR registers that might get changed*/
+#ifdef CONFIG_DM_PCI
+       dm_pci_read_config32(pcidev, PCI_ROM_ADDRESS, &saveROMBaseAddress);
+       dm_pci_read_config32(pcidev, PCI_BASE_ADDRESS_0, &saveBaseAddress10);
+       dm_pci_read_config32(pcidev, PCI_BASE_ADDRESS_1, &saveBaseAddress14);
+       dm_pci_read_config32(pcidev, PCI_BASE_ADDRESS_2, &saveBaseAddress18);
+       dm_pci_read_config32(pcidev, PCI_BASE_ADDRESS_4, &saveBaseAddress20);
+#else
        pci_read_config_dword(pcidev, PCI_ROM_ADDRESS, &saveROMBaseAddress);
        pci_read_config_dword(pcidev, PCI_BASE_ADDRESS_0, &saveBaseAddress10);
        pci_read_config_dword(pcidev, PCI_BASE_ADDRESS_1, &saveBaseAddress14);
        pci_read_config_dword(pcidev, PCI_BASE_ADDRESS_2, &saveBaseAddress18);
        pci_read_config_dword(pcidev, PCI_BASE_ADDRESS_4, &saveBaseAddress20);
+#endif
 
        /*Fix up I/O base registers to less than 64K */
        if(saveBaseAddress14 != 0)
@@ -361,13 +407,21 @@ void *PCI_mapBIOSImage(pci_dev_t pcidev)
                return NULL;
        }
 
+#ifdef CONFIG_DM_PCI
+       BIOSImage = dm_pci_bus_to_virt(pcidev, BIOSImageBus,
+                                      PCI_REGION_MEM, 0, MAP_NOCACHE);
+
+       /*Change the PCI BAR registers to map it onto the bus.*/
+       dm_pci_write_config32(pcidev, BIOSImageBAR, 0);
+       dm_pci_write_config32(pcidev, PCI_ROM_ADDRESS, BIOSImageBus | 0x1);
+#else
        BIOSImage = pci_bus_to_virt(pcidev, BIOSImageBus,
                                    PCI_REGION_MEM, 0, MAP_NOCACHE);
 
        /*Change the PCI BAR registers to map it onto the bus.*/
        pci_write_config_dword(pcidev, BIOSImageBAR, 0);
        pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, BIOSImageBus | 0x1);
-
+#endif
        udelay(1);
 
        /*Check that the BIOS image is valid. If not fail, or return the
@@ -387,6 +441,16 @@ pcidev     - PCI device info for the video card on the bus
 REMARKS:
 Unmaps the BIOS image for the device and restores framebuffer mappings
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+void PCI_unmapBIOSImage(struct udevice *pcidev, void *BIOSImage)
+{
+       dm_pci_write_config32(pcidev, PCI_ROM_ADDRESS, saveROMBaseAddress);
+       dm_pci_write_config32(pcidev, PCI_BASE_ADDRESS_0, saveBaseAddress10);
+       dm_pci_write_config32(pcidev, PCI_BASE_ADDRESS_1, saveBaseAddress14);
+       dm_pci_write_config32(pcidev, PCI_BASE_ADDRESS_2, saveBaseAddress18);
+       dm_pci_write_config32(pcidev, PCI_BASE_ADDRESS_4, saveBaseAddress20);
+}
+#else
 void PCI_unmapBIOSImage(pci_dev_t pcidev, void *BIOSImage)
 {
        pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, saveROMBaseAddress);
@@ -395,6 +459,7 @@ void PCI_unmapBIOSImage(pci_dev_t pcidev, void *BIOSImage)
        pci_write_config_dword(pcidev, PCI_BASE_ADDRESS_2, saveBaseAddress18);
        pci_write_config_dword(pcidev, PCI_BASE_ADDRESS_4, saveBaseAddress20);
 }
+#endif
 
 /****************************************************************************
 PARAMETERS:
@@ -408,13 +473,22 @@ REMARKS:
 Loads and POST's the display controllers BIOS, directly from the BIOS
 image we can extract over the PCI bus.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+static int PCI_postController(struct udevice *pcidev, uchar *bios_rom,
+                             int bios_len, BE_VGAInfo *vga_info,
+                             int vesa_mode, struct vbe_mode_info *mode_info)
+#else
 static int PCI_postController(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
                              BE_VGAInfo *vga_info, int vesa_mode,
                              struct vbe_mode_info *mode_info)
+#endif
 {
        u32 bios_image_len;
        uchar *mapped_bios;
        uchar *copy_of_bios;
+#ifdef CONFIG_DM_PCI
+       pci_dev_t bdf;
+#endif
 
        if (bios_rom) {
                copy_of_bios = bios_rom;
@@ -442,9 +516,16 @@ static int PCI_postController(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
        }
 
        /*Save information in vga_info structure*/
+#ifdef CONFIG_DM_PCI
+       bdf = dm_pci_get_bdf(pcidev);
+       vga_info->function = PCI_FUNC(bdf);
+       vga_info->device = PCI_DEV(bdf);
+       vga_info->bus = PCI_BUS(bdf);
+#else
        vga_info->function = PCI_FUNC(pcidev);
        vga_info->device = PCI_DEV(pcidev);
        vga_info->bus = PCI_BUS(pcidev);
+#endif
        vga_info->pcidev = pcidev;
        vga_info->BIOSImage = copy_of_bios;
        vga_info->BIOSImageLen = bios_image_len;
@@ -462,13 +543,22 @@ static int PCI_postController(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
        return true;
 }
 
+#ifdef CONFIG_DM_PCI
+int biosemu_setup(struct udevice *pcidev, BE_VGAInfo **vga_infop)
+#else
 int biosemu_setup(pci_dev_t pcidev, BE_VGAInfo **vga_infop)
+#endif
 {
        BE_VGAInfo *VGAInfo;
+#ifdef CONFIG_DM_PCI
+       pci_dev_t bdf = dm_pci_get_bdf(pcidev);
 
        printf("videoboot: Booting PCI video card bus %d, function %d, device %d\n",
-            PCI_BUS(pcidev), PCI_FUNC(pcidev), PCI_DEV(pcidev));
-
+              PCI_BUS(bdf), PCI_FUNC(bdf), PCI_DEV(bdf));
+#else
+       printf("videoboot: Booting PCI video card bus %d, function %d, device %d\n",
+              PCI_BUS(pcidev), PCI_FUNC(pcidev), PCI_DEV(pcidev));
+#endif
        /*Initialise the x86 BIOS emulator*/
        if ((VGAInfo = malloc(sizeof(*VGAInfo))) == NULL) {
                printf("videoboot: Out of memory!\n");
@@ -486,9 +576,15 @@ void biosemu_set_interrupt_handler(int intnum, int (*int_func)(void))
        X86EMU_setupIntrFunc(intnum, (X86EMU_intrFuncs)int_func);
 }
 
+#ifdef CONFIG_DM_PCI
+int biosemu_run(struct udevice *pcidev, uchar *bios_rom, int bios_len,
+               BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
+               struct vbe_mode_info *mode_info)
+#else
 int biosemu_run(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
                BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
                struct vbe_mode_info *mode_info)
+#endif
 {
        /*Post all the display controller BIOS'es*/
        if (!PCI_postController(pcidev, bios_rom, bios_len, vga_info,
@@ -522,7 +618,12 @@ REMARKS:
 Boots the PCI/AGP video card on the bus using the Video ROM BIOS image
 and the X86 BIOS emulator module.
 ****************************************************************************/
+#ifdef CONFIG_DM_PCI
+int BootVideoCardBIOS(struct udevice *pcidev, BE_VGAInfo **pVGAInfo,
+                     int clean_up)
+#else
 int BootVideoCardBIOS(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo, int clean_up)
+#endif
 {
        BE_VGAInfo *VGAInfo;
        int ret;
index dd4c0a4f322fbdf4d7d81df090084143e9bfb956..77c7f94bc63e1998f959f8c3bdf6ad6c46ef70c1 100644 (file)
@@ -185,12 +185,21 @@ static void X86API int1A(int unused)
        case 0xB103:            /* Find PCI class code */
                M.x86.R_AH = DEVICE_NOT_FOUND;
 #ifdef __KERNEL__
+#ifdef CONFIG_DM_PCI
+               dm_pci_read_config8(_BE_env.vgaInfo.pcidev, PCI_CLASS_PROG,
+                                   &interface);
+               dm_pci_read_config8(_BE_env.vgaInfo.pcidev, PCI_CLASS_DEVICE,
+                                   &subclass);
+               dm_pci_read_config8(_BE_env.vgaInfo.pcidev,
+                                   PCI_CLASS_DEVICE + 1, &baseclass);
+#else
                pci_read_config_byte(_BE_env.vgaInfo.pcidev, PCI_CLASS_PROG,
                                     &interface);
                pci_read_config_byte(_BE_env.vgaInfo.pcidev, PCI_CLASS_DEVICE,
                                     &subclass);
                pci_read_config_byte(_BE_env.vgaInfo.pcidev,
                                     PCI_CLASS_DEVICE + 1, &baseclass);
+#endif
                if (M.x86.R_CL == interface && M.x86.R_CH == subclass
                    && (u8) (M.x86.R_ECX >> 16) == baseclass) {
 #else
@@ -209,8 +218,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_read_config8(_BE_env.vgaInfo.pcidev, M.x86.R_DI,
+                                           &M.x86.R_CL);
+# else
                        pci_read_config_byte(_BE_env.vgaInfo.pcidev, M.x86.R_DI,
                                             &M.x86.R_CL);
+# endif
 #else
                        M.x86.R_CL =
                            (u8) PCI_accessReg(M.x86.R_DI, 0, PCI_READ_BYTE,
@@ -224,8 +238,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_read_config16(_BE_env.vgaInfo.pcidev, M.x86.R_DI,
+                                            &M.x86.R_CX);
+# else
                        pci_read_config_word(_BE_env.vgaInfo.pcidev, M.x86.R_DI,
                                             &M.x86.R_CX);
+# endif
 #else
                        M.x86.R_CX =
                            (u16) PCI_accessReg(M.x86.R_DI, 0, PCI_READ_WORD,
@@ -239,8 +258,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_read_config32(_BE_env.vgaInfo.pcidev,
+                                            M.x86.R_DI, &M.x86.R_ECX);
+# else
                        pci_read_config_dword(_BE_env.vgaInfo.pcidev,
                                              M.x86.R_DI, &M.x86.R_ECX);
+# endif
 #else
                        M.x86.R_ECX =
                            (u32) PCI_accessReg(M.x86.R_DI, 0, PCI_READ_DWORD,
@@ -254,8 +278,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_write_config8(_BE_env.vgaInfo.pcidev,
+                                            M.x86.R_DI, M.x86.R_CL);
+# else
                        pci_write_config_byte(_BE_env.vgaInfo.pcidev,
                                              M.x86.R_DI, M.x86.R_CL);
+# endif
 #else
                        PCI_accessReg(M.x86.R_DI, M.x86.R_CL, PCI_WRITE_BYTE,
                                      _BE_env.vgaInfo.pciInfo);
@@ -268,8 +297,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_write_config32(_BE_env.vgaInfo.pcidev,
+                                             M.x86.R_DI, M.x86.R_CX);
+# else
                        pci_write_config_word(_BE_env.vgaInfo.pcidev,
                                              M.x86.R_DI, M.x86.R_CX);
+# endif
 #else
                        PCI_accessReg(M.x86.R_DI, M.x86.R_CX, PCI_WRITE_WORD,
                                      _BE_env.vgaInfo.pciInfo);
@@ -282,8 +316,13 @@ static void X86API int1A(int unused)
                if (M.x86.R_BX == pciSlot) {
                        M.x86.R_AH = SUCCESSFUL;
 #ifdef __KERNEL__
+# ifdef CONFIG_DM_PCI
+                       dm_pci_write_config32(_BE_env.vgaInfo.pcidev,
+                                             M.x86.R_DI, M.x86.R_ECX);
+# else
                        pci_write_config_dword(_BE_env.vgaInfo.pcidev,
                                               M.x86.R_DI, M.x86.R_ECX);
+# endif
 #else
                        PCI_accessReg(M.x86.R_DI, M.x86.R_ECX, PCI_WRITE_DWORD,
                                      _BE_env.vgaInfo.pciInfo);
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..990f768adbaffa19bf6a94f3b68570aa6c407954 100644 (file)
@@ -0,0 +1,9 @@
+config DISK
+       bool "Support disk controllers with driver model"
+       depends on DM
+       default y if DM
+       help
+         This enables a uclass for disk controllers in U-Boot. Various driver
+         types can use this, such as AHCI/SATA. It does not provide any standard
+         operations at present. The block device interface has not been converted
+         to driver model.
index eb8bda9ab2c61cf4d48a8702b747b569fa50fa94..5eb87e0b89989e8889aa562511836f6e3cd502d1 100644 (file)
@@ -5,6 +5,7 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
+obj-$(CONFIG_DISK) += disk-uclass.o
 obj-$(CONFIG_SCSI_AHCI) += ahci.o
 obj-$(CONFIG_DWC_AHSATA) += dwc_ahsata.o
 obj-$(CONFIG_FSL_SATA) += fsl_sata.o
diff --git a/drivers/block/disk-uclass.c b/drivers/block/disk-uclass.c
new file mode 100644 (file)
index 0000000..d665b35
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+
+UCLASS_DRIVER(disk) = {
+       .id             = UCLASS_DISK,
+       .name           = "disk",
+};
index a1c94780dd31d977c1823958a0539d5af261f25b..c4fc216340d8169dde8c05cdc0f9556e7ed9815b 100644 (file)
@@ -172,7 +172,8 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
                dm_dbg("   - found match at '%s'\n", entry->name);
                ret = device_bind(parent, entry, name, NULL, offset, &dev);
                if (ret) {
-                       dm_warn("Error binding driver '%s'\n", entry->name);
+                       dm_warn("Error binding driver '%s': %d\n", entry->name,
+                               ret);
                        return ret;
                } else {
                        dev->driver_data = id->data;
index 686c32056ec6e38cb26b2a355471331b26d97382..a0666d0bacd7e2d8cfcaca0f8ae13d85f7256873 100644 (file)
@@ -32,7 +32,7 @@ static int syscon_pre_probe(struct udevice *dev)
        return regmap_init_mem(dev, &priv->regmap);
 }
 
-struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
+int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp)
 {
        struct udevice *dev;
        struct uclass *uc;
@@ -40,22 +40,29 @@ struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
 
        ret = uclass_get(UCLASS_SYSCON, &uc);
        if (ret)
-               return ERR_PTR(ret);
+               return ret;
        uclass_foreach_dev(dev, uc) {
                if (dev->driver_data == driver_data) {
-                       struct syscon_uc_info *priv;
-                       int ret;
-
-                       ret = device_probe(dev);
-                       if (ret)
-                               return ERR_PTR(ret);
-                       priv = dev_get_uclass_priv(dev);
-
-                       return priv->regmap;
+                       *devp = dev;
+                       return device_probe(dev);
                }
        }
 
-       return ERR_PTR(-ENODEV);
+       return -ENODEV;
+}
+
+struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
+{
+       struct syscon_uc_info *priv;
+       struct udevice *dev;
+       int ret;
+
+       ret = syscon_get_by_driver_data(driver_data, &dev);
+       if (ret)
+               return ERR_PTR(ret);
+       priv = dev_get_uclass_priv(dev);
+
+       return priv->regmap;
 }
 
 void *syscon_get_first_range(ulong driver_data)
index 22defcd7d9223be898b18cdc8ae1236a38272671..a6dc9351148f905869012bd7f48b11be98fe63cf 100644 (file)
@@ -215,7 +215,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) || defined(CONFIG_MX6))
+#elif (defined(CONFIG_MX28) || defined(CONFIG_MX6) || defined(CONFIG_MX7))
        uint32_t setreg = (uint32_t)(&apbh_regs->hw_apbh_channel_ctrl_set);
        uint32_t offset = APBH_CHANNEL_CTRL_RESET_CHANNEL_OFFSET;
 #endif
index c765a74a25e0f17895b8010cfcbb646f735a5093..d459a2f7a572180954bdc34a82fcf39c32be868e 100644 (file)
@@ -75,8 +75,8 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
                buffer[i] = *dataptr++;
 
        if (xdesc->name) {
-               i = strncmp(buffer, xdesc->name, strlen(xdesc->name));
-               if (i) {
+               i = (ulong)strstr(buffer, 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",
index 3ed4d8914c216f41dd09a2914650754d52da870a..d603b55902790abe87a6aef154bec77747de6c45 100644 (file)
@@ -10,6 +10,7 @@
 #include <fdtdec.h>
 #include <malloc.h>
 #include <asm/gpio.h>
+#include <linux/bug.h>
 #include <linux/ctype.h>
 
 DECLARE_GLOBAL_DATA_PTR;
index fd05c177948215ec5fd36ddc34b310ef9a0b48e9..9b2c5b69ce5503837560329ba5c42a3c0a4fc4e8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid, ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid, ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology  http://qtec.com/
  * SPDX-License-Identifier:    GPL-2.0+
  */
index 14adda2857d17dce774f87bec6254bb3fa1ba18f..46b83e78941887a6f9c9edab64d751bf5a3461b9 100644 (file)
@@ -58,6 +58,15 @@ config DM_I2C_GPIO
          bindings are supported.
          Binding info: doc/device-tree-bindings/i2c/i2c-gpio.txt
 
+config SYS_I2C_INTEL
+       bool "Intel I2C/SMBUS driver"
+       depends on DM_I2C
+       help
+         Add support for the Intel SMBUS driver. So far this driver is just
+         a stub which perhaps some basic init. There is no implementation of
+         the I2C API meaning that any I2C operations will immediately fail
+         for now.
+
 config SYS_I2C_ROCKCHIP
        bool "Rockchip I2C driver"
        depends on DM_I2C
index bbbc0dc59d6886c11e4575f0239168bd54c85ae5..c75c5793efe239a1c21c6fff1a3c8795d86748d6 100644 (file)
@@ -21,6 +21,7 @@ obj-$(CONFIG_SYS_I2C_DW) += designware_i2c.o
 obj-$(CONFIG_SYS_I2C_FSL) += fsl_i2c.o
 obj-$(CONFIG_SYS_I2C_FTI2C010) += fti2c010.o
 obj-$(CONFIG_SYS_I2C_IHS) += ihs_i2c.o
+obj-$(CONFIG_SYS_I2C_INTEL) += intel_i2c.o
 obj-$(CONFIG_SYS_I2C_KONA) += kona_i2c.o
 obj-$(CONFIG_SYS_I2C_LPC32XX) += lpc32xx_i2c.o
 obj-$(CONFIG_SYS_I2C_MVTWSI) += mvtwsi.o
diff --git a/drivers/i2c/intel_i2c.c b/drivers/i2c/intel_i2c.c
new file mode 100644 (file)
index 0000000..3d777ff
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <i2c.h>
+#include <asm/io.h>
+#include <asm/arch/pch.h>
+
+int intel_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
+{
+       return -ENOSYS;
+}
+
+int intel_i2c_probe_chip(struct udevice *bus, uint chip_addr, uint chip_flags)
+{
+       return -ENOSYS;
+}
+
+int intel_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
+{
+       return 0;
+}
+
+static int intel_i2c_probe(struct udevice *dev)
+{
+       /*
+        * So far this is just setup code for ivybridge SMbus. When we have
+        * a full I2C driver this may need to be moved, generalised or made
+        * dependant on a particular compatible string.
+        *
+        * Set SMBus I/O base
+        */
+       dm_pci_write_config32(dev, SMB_BASE,
+                             SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
+
+       /* Set SMBus enable. */
+       dm_pci_write_config8(dev, HOSTC, HST_EN);
+
+       /* Set SMBus I/O space enable. */
+       dm_pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
+
+       /* Disable interrupt generation. */
+       outb(0, SMBUS_IO_BASE + SMBHSTCTL);
+
+       /* Clear any lingering errors, so transactions can run. */
+       outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
+       debug("SMBus controller enabled\n");
+
+       return 0;
+}
+
+static const struct dm_i2c_ops intel_i2c_ops = {
+       .xfer           = intel_i2c_xfer,
+       .probe_chip     = intel_i2c_probe_chip,
+       .set_bus_speed  = intel_i2c_set_bus_speed,
+};
+
+static const struct udevice_id intel_i2c_ids[] = {
+       { .compatible = "intel,ich-i2c" },
+       { }
+};
+
+U_BOOT_DRIVER(intel_i2c) = {
+       .name   = "i2c_intel",
+       .id     = UCLASS_I2C,
+       .of_match = intel_i2c_ids,
+       .per_child_auto_alloc_size = sizeof(struct dm_i2c_chip),
+       .ops    = &intel_i2c_ops,
+       .probe  = intel_i2c_probe,
+};
index 5f993b99052360b406860bc2098b67e68cfeb57c..221ff4fe7afa02b39c56a5cd12a1cf359ae975ac 100644 (file)
@@ -204,8 +204,8 @@ static int twsi_start(struct i2c_adapter *adap, int expected_status)
        /* globally set TWSIEN in case it was not */
        twsi_control_flags |= MVTWSI_CONTROL_TWSIEN;
        /* assert START */
-       twsi_control_flags |= MVTWSI_CONTROL_START | MVTWSI_CONTROL_CLEAR_IFLG;
-       writel(twsi_control_flags, &twsi->control);
+       writel(twsi_control_flags | MVTWSI_CONTROL_START |
+                                   MVTWSI_CONTROL_CLEAR_IFLG, &twsi->control);
        /* wait for controller to process START */
        return twsi_wait(adap, expected_status);
 }
index 02d71b934409f56e2ede04c31e40f611fc914987..ff770b16e27a6e25c50fa6a23226832865f2e324 100644 (file)
@@ -530,6 +530,10 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
                if (caps & SDHCI_CAN_DO_8BIT)
                        host->cfg.host_caps |= MMC_MODE_8BIT;
        }
+
+       if (host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)
+               host->cfg.host_caps &= ~(MMC_MODE_HS | MMC_MODE_HS_52MHz);
+
        if (host->host_caps)
                host->cfg.host_caps |= host->host_caps;
 
index 4fe3da93b206d0df8706efd371df44f653f4f60e..039ec16e91fe4b94775773a8d705fdb82de159e4 100644 (file)
 #include <malloc.h>
 #include <sdhci.h>
 
+#ifndef CONFIG_ZYNQ_SDHCI_MIN_FREQ
+# define CONFIG_ZYNQ_SDHCI_MIN_FREQ    0
+#endif
+
 static int arasan_sdhci_probe(struct udevice *dev)
 {
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
@@ -20,9 +24,15 @@ static int arasan_sdhci_probe(struct udevice *dev)
 
        host->quirks = SDHCI_QUIRK_WAIT_SEND_CMD |
                       SDHCI_QUIRK_BROKEN_R1B;
+
+#ifdef CONFIG_ZYNQ_HISPD_BROKEN
+       host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT;
+#endif
+
        host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
 
-       add_sdhci(host, CONFIG_ZYNQ_SDHCI_MAX_FREQ, 0);
+       add_sdhci(host, CONFIG_ZYNQ_SDHCI_MAX_FREQ,
+                 CONFIG_ZYNQ_SDHCI_MIN_FREQ);
 
        upriv->mmc = host->mmc;
 
index f15cf36c88e713f1fd38de5648e38410f0611441..ba019a07638917c4578059057a571d04de9174fd 100644 (file)
@@ -30,7 +30,7 @@
 #define        MXS_NAND_DMA_DESCRIPTOR_COUNT           4
 
 #define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE          512
-#if defined(CONFIG_MX6)
+#if (defined(CONFIG_MX6) || defined(CONFIG_MX7))
 #define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT    2
 #else
 #define        MXS_NAND_CHUNK_DATA_CHUNK_SIZE_SHIFT    0
@@ -152,7 +152,7 @@ static inline uint32_t mxs_nand_get_ecc_strength(uint32_t page_data_size,
        int max_ecc_strength_supported;
 
        /* Refer to Chapter 17 for i.MX6DQ, Chapter 18 for i.MX6SX */
-       if (is_cpu_type(MXC_CPU_MX6SX))
+       if (is_cpu_type(MXC_CPU_MX6SX) || is_soc_type(MXC_SOC_MX7))
                max_ecc_strength_supported = 62;
        else
                max_ecc_strength_supported = 40;
index f484e62b32c6c6695ab3af1ba0cebf2433af8e81..baf4e2d25b4c1c1f2bea6921bad905e642f2388b 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/slab.h>
 #include <linux/major.h>
 #else
+#include <linux/bug.h>
 #include <linux/log2.h>
 #endif
 #include <linux/err.h>
index de54ca8014c76ee80d74ef293120dba36fedf6c5..218e1fee22c3919d14ef6eda4aecf80b5a6a9b70 100644 (file)
@@ -102,6 +102,22 @@ config PCH_GBE
          This MAC is present in Intel Platform Controller Hub EG20T. It
          supports 10/100/1000 Mbps operation.
 
+config XILINX_AXIEMAC
+       depends on DM_ETH && (MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP)
+       select PHYLIB
+       select MII
+       bool "Xilinx AXI Ethernet"
+       help
+         This MAC is present in Xilinx Microblaze, Zynq and ZynqMP SoCs.
+
+config XILINX_EMACLITE
+       depends on DM_ETH && (MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP)
+       select PHYLIB
+       select MII
+       bool "Xilinx Ethernetlite"
+       help
+         This MAC is present in Xilinx Microblaze, Zynq and ZynqMP SoCs.
+
 config ZYNQ_GEM
        depends on DM_ETH && (ARCH_ZYNQ || ARCH_ZYNQMP)
        select PHYLIB
index f2cd32c548d86fc175520b9436c55032b2aaa79f..d4a6386810b6509bcfbcc5ef90556210129287ad 100644 (file)
@@ -240,23 +240,23 @@ static void eepro100_halt (struct eth_device *dev);
 
 static inline int INW (struct eth_device *dev, u_long addr)
 {
-       return le16_to_cpu (*(volatile u16 *) (addr + dev->iobase));
+       return le16_to_cpu(*(volatile u16 *)(addr + (u_long)dev->iobase));
 }
 
 static inline void OUTW (struct eth_device *dev, int command, u_long addr)
 {
-       *(volatile u16 *) ((addr + dev->iobase)) = cpu_to_le16 (command);
+       *(volatile u16 *)((addr + (u_long)dev->iobase)) = cpu_to_le16(command);
 }
 
 static inline void OUTL (struct eth_device *dev, int command, u_long addr)
 {
-       *(volatile u32 *) ((addr + dev->iobase)) = cpu_to_le32 (command);
+       *(volatile u32 *)((addr + (u_long)dev->iobase)) = cpu_to_le32(command);
 }
 
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
 static inline int INL (struct eth_device *dev, u_long addr)
 {
-       return le32_to_cpu (*(volatile u32 *) (addr + dev->iobase));
+       return le32_to_cpu(*(volatile u32 *)(addr + (u_long)dev->iobase));
 }
 
 static int get_phyreg (struct eth_device *dev, unsigned char addr,
index 9e042f6198338cb0564802eced6683497fd5a24b..d38e98a2fb76202c720837ad6d65aafb9669eb3f 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include <common.h>
 #include <errno.h>
+#include <linux/bug.h>
 #include <asm/io.h>
 #include <libfdt.h>
 #include <fdt_support.h>
index 541a57f98028937965cfa8337d334aed83f5ec73..c3912d52f320d36a6bca7ac99efe32bcde1060c8 100644 (file)
@@ -41,6 +41,8 @@
 
 /* PHY CTRL bits */
 #define DP83867_PHYCR_FIFO_DEPTH_SHIFT         14
+#define DP83867_MDI_CROSSOVER          5
+#define DP83867_MDI_CROSSOVER_AUTO     2
 
 /* RGMIIDCTL bits */
 #define DP83867_RGMII_TX_CLK_DELAY_SHIFT       4
@@ -149,6 +151,7 @@ static int dp83867_config(struct phy_device *phydev)
 
        if (phy_interface_is_rgmii(phydev)) {
                ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_DP83867_PHYCTRL,
+                       (DP83867_MDI_CROSSOVER_AUTO << DP83867_MDI_CROSSOVER) |
                        (FIFO_DEPTH << DP83867_PHYCR_FIFO_DEPTH_SHIFT));
                if (ret)
                        return ret;
index df053feee8c8b2de3df918d91ee1def1e2fa6403..81274ee13bca869567ecc3986f4f90fe8c071f7d 100644 (file)
@@ -8,15 +8,14 @@
 
 #include <config.h>
 #include <common.h>
+#include <dm.h>
 #include <net.h>
 #include <malloc.h>
 #include <asm/io.h>
 #include <phy.h>
 #include <miiphy.h>
 
-#if !defined(CONFIG_PHYLIB)
-# error AXI_ETHERNET requires PHYLIB
-#endif
+DECLARE_GLOBAL_DATA_PTR;
 
 /* Link setup */
 #define XAE_EMMC_LINKSPEED_MASK        0xC0000000 /* Link speed */
@@ -86,7 +85,8 @@ struct axidma_priv {
        struct axidma_reg *dmatx;
        struct axidma_reg *dmarx;
        int phyaddr;
-
+       struct axi_regs *iobase;
+       phy_interface_t interface;
        struct phy_device *phydev;
        struct mii_dev *bus;
 };
@@ -147,9 +147,8 @@ struct axi_regs {
  */
 #define PHY_DETECT_MASK 0x1808
 
-static inline int mdio_wait(struct eth_device *dev)
+static inline int mdio_wait(struct axi_regs *regs)
 {
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
        u32 timeout = 200;
 
        /* Wait till MDIO interface is ready to accept a new transaction. */
@@ -165,13 +164,13 @@ static inline int mdio_wait(struct eth_device *dev)
        return 0;
 }
 
-static u32 phyread(struct eth_device *dev, u32 phyaddress, u32 registernum,
-                                                               u16 *val)
+static u32 phyread(struct axidma_priv *priv, u32 phyaddress, u32 registernum,
+                  u16 *val)
 {
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       struct axi_regs *regs = priv->iobase;
        u32 mdioctrlreg = 0;
 
-       if (mdio_wait(dev))
+       if (mdio_wait(regs))
                return 1;
 
        mdioctrlreg = ((phyaddress << XAE_MDIO_MCR_PHYAD_SHIFT) &
@@ -183,7 +182,7 @@ static u32 phyread(struct eth_device *dev, u32 phyaddress, u32 registernum,
 
        out_be32(&regs->mdio_mcr, mdioctrlreg);
 
-       if (mdio_wait(dev))
+       if (mdio_wait(regs))
                return 1;
 
        /* Read data */
@@ -191,13 +190,13 @@ static u32 phyread(struct eth_device *dev, u32 phyaddress, u32 registernum,
        return 0;
 }
 
-static u32 phywrite(struct eth_device *dev, u32 phyaddress, u32 registernum,
-                                                               u32 data)
+static u32 phywrite(struct axidma_priv *priv, u32 phyaddress, u32 registernum,
+                   u32 data)
 {
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       struct axi_regs *regs = priv->iobase;
        u32 mdioctrlreg = 0;
 
-       if (mdio_wait(dev))
+       if (mdio_wait(regs))
                return 1;
 
        mdioctrlreg = ((phyaddress << XAE_MDIO_MCR_PHYAD_SHIFT) &
@@ -212,19 +211,18 @@ static u32 phywrite(struct eth_device *dev, u32 phyaddress, u32 registernum,
 
        out_be32(&regs->mdio_mcr, mdioctrlreg);
 
-       if (mdio_wait(dev))
+       if (mdio_wait(regs))
                return 1;
 
        return 0;
 }
 
-/* Setting axi emac and phy to proper setting */
-static int setup_phy(struct eth_device *dev)
+static int axiemac_phy_init(struct udevice *dev)
 {
        u16 phyreg;
-       u32 i, speed, emmc_reg, ret;
-       struct axidma_priv *priv = dev->priv;
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       u32 i, ret;
+       struct axidma_priv *priv = dev_get_priv(dev);
+       struct axi_regs *regs = priv->iobase;
        struct phy_device *phydev;
 
        u32 supported = SUPPORTED_10baseT_Half |
@@ -234,16 +232,19 @@ static int setup_phy(struct eth_device *dev)
                        SUPPORTED_1000baseT_Half |
                        SUPPORTED_1000baseT_Full;
 
+       /* Set default MDIO divisor */
+       out_be32(&regs->mdio_mc, XAE_MDIO_DIV_DFT | XAE_MDIO_MC_MDIOEN_MASK);
+
        if (priv->phyaddr == -1) {
                /* Detect the PHY address */
                for (i = 31; i >= 0; i--) {
-                       ret = phyread(dev, i, PHY_DETECT_REG, &phyreg);
+                       ret = phyread(priv, i, PHY_DETECT_REG, &phyreg);
                        if (!ret && (phyreg != 0xFFFF) &&
                        ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
                                /* Found a valid PHY address */
                                priv->phyaddr = i;
                                debug("axiemac: Found valid phy address, %x\n",
-                                                                       phyreg);
+                                     i);
                                break;
                        }
                }
@@ -256,6 +257,18 @@ static int setup_phy(struct eth_device *dev)
        phydev->advertising = phydev->supported;
        priv->phydev = phydev;
        phy_config(phydev);
+
+       return 0;
+}
+
+/* Setting axi emac and phy to proper setting */
+static int setup_phy(struct udevice *dev)
+{
+       u32 speed, emmc_reg;
+       struct axidma_priv *priv = dev_get_priv(dev);
+       struct axi_regs *regs = priv->iobase;
+       struct phy_device *phydev = priv->phydev;
+
        if (phy_startup(phydev)) {
                printf("axiemac: could not initialize PHY %s\n",
                       phydev->dev->name);
@@ -299,9 +312,9 @@ static int setup_phy(struct eth_device *dev)
 }
 
 /* STOP DMA transfers */
-static void axiemac_halt(struct eth_device *dev)
+static void axiemac_stop(struct udevice *dev)
 {
-       struct axidma_priv *priv = dev->priv;
+       struct axidma_priv *priv = dev_get_priv(dev);
        u32 temp;
 
        /* Stop the hardware */
@@ -316,9 +329,9 @@ static void axiemac_halt(struct eth_device *dev)
        debug("axiemac: Halted\n");
 }
 
-static int axi_ethernet_init(struct eth_device *dev)
+static int axi_ethernet_init(struct axidma_priv *priv)
 {
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       struct axi_regs *regs = priv->iobase;
        u32 timeout = 200;
 
        /*
@@ -359,25 +372,26 @@ static int axi_ethernet_init(struct eth_device *dev)
        return 0;
 }
 
-static int axiemac_setup_mac(struct eth_device *dev)
+static int axiemac_write_hwaddr(struct udevice *dev)
 {
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct axidma_priv *priv = dev_get_priv(dev);
+       struct axi_regs *regs = priv->iobase;
 
        /* Set the MAC address */
-       int val = ((dev->enetaddr[3] << 24) | (dev->enetaddr[2] << 16) |
-               (dev->enetaddr[1] << 8) | (dev->enetaddr[0]));
+       int val = ((pdata->enetaddr[3] << 24) | (pdata->enetaddr[2] << 16) |
+               (pdata->enetaddr[1] << 8) | (pdata->enetaddr[0]));
        out_be32(&regs->uaw0, val);
 
-       val = (dev->enetaddr[5] << 8) | dev->enetaddr[4] ;
+       val = (pdata->enetaddr[5] << 8) | pdata->enetaddr[4];
        val |= in_be32(&regs->uaw1) & ~XAE_UAW1_UNICASTADDR_MASK;
        out_be32(&regs->uaw1, val);
        return 0;
 }
 
 /* Reset DMA engine */
-static void axi_dma_init(struct eth_device *dev)
+static void axi_dma_init(struct axidma_priv *priv)
 {
-       struct axidma_priv *priv = dev->priv;
        u32 timeout = 500;
 
        /* Reset the engine so the hardware starts from a known state */
@@ -388,9 +402,9 @@ static void axi_dma_init(struct eth_device *dev)
        while (timeout--) {
                /* Check transmit/receive channel */
                /* Reset is done when the reset bit is low */
-               if (!(in_be32(&priv->dmatx->control) |
+               if (!((in_be32(&priv->dmatx->control) |
                                in_be32(&priv->dmarx->control))
-                                               & XAXIDMA_CR_RESET_MASK) {
+                                               & XAXIDMA_CR_RESET_MASK)) {
                        break;
                }
        }
@@ -398,10 +412,10 @@ static void axi_dma_init(struct eth_device *dev)
                printf("%s: Timeout\n", __func__);
 }
 
-static int axiemac_init(struct eth_device *dev, bd_t * bis)
+static int axiemac_start(struct udevice *dev)
 {
-       struct axidma_priv *priv = dev->priv;
-       struct axi_regs *regs = (struct axi_regs *)dev->iobase;
+       struct axidma_priv *priv = dev_get_priv(dev);
+       struct axi_regs *regs = priv->iobase;
        u32 temp;
 
        debug("axiemac: Init started\n");
@@ -411,10 +425,10 @@ static int axiemac_init(struct eth_device *dev, bd_t * bis)
         * reset, and since AXIDMA reset line is connected to AxiEthernet, this
         * would ensure a reset of AxiEthernet.
         */
-       axi_dma_init(dev);
+       axi_dma_init(priv);
 
        /* Initialize AxiEthernet hardware. */
-       if (axi_ethernet_init(dev))
+       if (axi_ethernet_init(priv))
                return -1;
 
        /* Disable all RX interrupts before RxBD space setup */
@@ -452,7 +466,7 @@ static int axiemac_init(struct eth_device *dev, bd_t * bis)
 
        /* PHY setup */
        if (!setup_phy(dev)) {
-               axiemac_halt(dev);
+               axiemac_stop(dev);
                return -1;
        }
 
@@ -460,9 +474,9 @@ static int axiemac_init(struct eth_device *dev, bd_t * bis)
        return 0;
 }
 
-static int axiemac_send(struct eth_device *dev, void *ptr, int len)
+static int axiemac_send(struct udevice *dev, void *ptr, int len)
 {
-       struct axidma_priv *priv = dev->priv;
+       struct axidma_priv *priv = dev_get_priv(dev);
        u32 timeout;
 
        if (len > PKTSIZE_ALIGN)
@@ -498,8 +512,8 @@ static int axiemac_send(struct eth_device *dev, void *ptr, int len)
        /* Wait for transmission to complete */
        debug("axiemac: Waiting for tx to be done\n");
        timeout = 200;
-       while (timeout && (!in_be32(&priv->dmatx->status) &
-                       (XAXIDMA_IRQ_DELAY_MASK | XAXIDMA_IRQ_IOC_MASK))) {
+       while (timeout && (!(in_be32(&priv->dmatx->status) &
+                       (XAXIDMA_IRQ_DELAY_MASK | XAXIDMA_IRQ_IOC_MASK)))) {
                timeout--;
                udelay(1);
        }
@@ -512,10 +526,9 @@ static int axiemac_send(struct eth_device *dev, void *ptr, int len)
        return 0;
 }
 
-static int isrxready(struct eth_device *dev)
+static int isrxready(struct axidma_priv *priv)
 {
        u32 status;
-       struct axidma_priv *priv = dev->priv;
 
        /* Read pending interrupts */
        status = in_be32(&priv->dmarx->status);
@@ -533,15 +546,15 @@ static int isrxready(struct eth_device *dev)
        return 0;
 }
 
-static int axiemac_recv(struct eth_device *dev)
+static int axiemac_recv(struct udevice *dev, int flags, uchar **packetp)
 {
        u32 length;
-       struct axidma_priv *priv = dev->priv;
+       struct axidma_priv *priv = dev_get_priv(dev);
        u32 temp;
 
        /* Wait for an incoming packet */
-       if (!isrxready(dev))
-               return 0;
+       if (!isrxready(priv))
+               return -1;
 
        debug("axiemac: RX data ready\n");
 
@@ -554,9 +567,14 @@ static int axiemac_recv(struct eth_device *dev)
 #ifdef DEBUG
        print_buffer(&rxframe, &rxframe[0], 1, length, 16);
 #endif
-       /* Pass the received frame up for processing */
-       if (length)
-               net_process_received_packet(rxframe, length);
+
+       *packetp = rxframe;
+       return length;
+}
+
+static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
+{
+       struct axidma_priv *priv = dev_get_priv(dev);
 
 #ifdef DEBUG
        /* It is useful to clear buffer to be sure that it is consistent */
@@ -581,76 +599,128 @@ static int axiemac_recv(struct eth_device *dev)
 
        debug("axiemac: RX completed, framelength = %d\n", length);
 
-       return length;
+       return 0;
 }
 
-static int axiemac_miiphy_read(const char *devname, uchar addr,
-                                                       uchar reg, ushort *val)
+static int axiemac_miiphy_read(struct mii_dev *bus, int addr,
+                              int devad, int reg)
 {
-       struct eth_device *dev = eth_get_dev();
-       u32 ret;
+       int ret;
+       u16 value;
 
-       ret = phyread(dev, addr, reg, val);
-       debug("axiemac: Read MII 0x%x, 0x%x, 0x%x\n", addr, reg, *val);
-       return ret;
+       ret = phyread(bus->priv, addr, reg, &value);
+       debug("axiemac: Read MII 0x%x, 0x%x, 0x%x, %d\n", addr, reg,
+             value, ret);
+       return value;
 }
 
-static int axiemac_miiphy_write(const char *devname, uchar addr,
-                                                       uchar reg, ushort val)
+static int axiemac_miiphy_write(struct mii_dev *bus, int addr, int devad,
+                               int reg, u16 value)
 {
-       struct eth_device *dev = eth_get_dev();
-
-       debug("axiemac: Write MII 0x%x, 0x%x, 0x%x\n", addr, reg, val);
-       return phywrite(dev, addr, reg, val);
+       debug("axiemac: Write MII 0x%x, 0x%x, 0x%x\n", addr, reg, value);
+       return phywrite(bus->priv, addr, reg, value);
 }
 
-static int axiemac_bus_reset(struct mii_dev *bus)
+static int axi_emac_probe(struct udevice *dev)
 {
-       debug("axiemac: Bus reset\n");
+       struct axidma_priv *priv = dev_get_priv(dev);
+       int ret;
+
+       priv->bus = mdio_alloc();
+       priv->bus->read = axiemac_miiphy_read;
+       priv->bus->write = axiemac_miiphy_write;
+       priv->bus->priv = priv;
+       strcpy(priv->bus->name, "axi_emac");
+
+       ret = mdio_register(priv->bus);
+       if (ret)
+               return ret;
+
+       axiemac_phy_init(dev);
+
        return 0;
 }
 
-int xilinx_axiemac_initialize(bd_t *bis, unsigned long base_addr,
-                                                       unsigned long dma_addr)
+static int axi_emac_remove(struct udevice *dev)
 {
-       struct eth_device *dev;
-       struct axidma_priv *priv;
+       struct axidma_priv *priv = dev_get_priv(dev);
 
-       dev = calloc(1, sizeof(struct eth_device));
-       if (dev == NULL)
-               return -1;
+       free(priv->phydev);
+       mdio_unregister(priv->bus);
+       mdio_free(priv->bus);
 
-       dev->priv = calloc(1, sizeof(struct axidma_priv));
-       if (dev->priv == NULL) {
-               free(dev);
-               return -1;
-       }
-       priv = dev->priv;
+       return 0;
+}
 
-       sprintf(dev->name, "aximac.%lx", base_addr);
+static const struct eth_ops axi_emac_ops = {
+       .start                  = axiemac_start,
+       .send                   = axiemac_send,
+       .recv                   = axiemac_recv,
+       .free_pkt               = axiemac_free_pkt,
+       .stop                   = axiemac_stop,
+       .write_hwaddr           = axiemac_write_hwaddr,
+};
 
-       dev->iobase = base_addr;
-       priv->dmatx = (struct axidma_reg *)dma_addr;
+static int axi_emac_ofdata_to_platdata(struct udevice *dev)
+{
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct axidma_priv *priv = dev_get_priv(dev);
+       int offset = 0;
+       const char *phy_mode;
+
+       pdata->iobase = (phys_addr_t)dev_get_addr(dev);
+       priv->iobase = (struct axi_regs *)pdata->iobase;
+
+       offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset,
+                                      "axistream-connected");
+       if (offset <= 0) {
+               printf("%s: axistream is not found\n", __func__);
+               return -EINVAL;
+       }
+       priv->dmatx = (struct axidma_reg *)fdtdec_get_int(gd->fdt_blob,
+                                                         offset, "reg", 0);
+       if (!priv->dmatx) {
+               printf("%s: axi_dma register space not found\n", __func__);
+               return -EINVAL;
+       }
        /* RX channel offset is 0x30 */
-       priv->dmarx = (struct axidma_reg *)(dma_addr + 0x30);
-       dev->init = axiemac_init;
-       dev->halt = axiemac_halt;
-       dev->send = axiemac_send;
-       dev->recv = axiemac_recv;
-       dev->write_hwaddr = axiemac_setup_mac;
-
-#ifdef CONFIG_PHY_ADDR
-       priv->phyaddr = CONFIG_PHY_ADDR;
-#else
+       priv->dmarx = (struct axidma_reg *)((u32)priv->dmatx + 0x30);
+
        priv->phyaddr = -1;
-#endif
 
-       eth_register(dev);
+       offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset,
+                                      "phy-handle");
+       if (offset > 0)
+               priv->phyaddr = fdtdec_get_int(gd->fdt_blob, offset, "reg", -1);
+
+       phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-mode", NULL);
+       if (phy_mode)
+               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
+       if (pdata->phy_interface == -1) {
+               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
+               return -EINVAL;
+       }
+       priv->interface = pdata->phy_interface;
+
+       printf("AXI EMAC: %lx, phyaddr %d, interface %s\n", (ulong)priv->iobase,
+              priv->phyaddr, phy_string_for_interface(priv->interface));
 
-#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
-       miiphy_register(dev->name, axiemac_miiphy_read, axiemac_miiphy_write);
-       priv->bus = miiphy_get_dev_by_name(dev->name);
-       priv->bus->reset = axiemac_bus_reset;
-#endif
-       return 1;
+       return 0;
 }
+
+static const struct udevice_id axi_emac_ids[] = {
+       { .compatible = "xlnx,axi-ethernet-1.00.a" },
+       { }
+};
+
+U_BOOT_DRIVER(axi_emac) = {
+       .name   = "axi_emac",
+       .id     = UCLASS_ETH,
+       .of_match = axi_emac_ids,
+       .ofdata_to_platdata = axi_emac_ofdata_to_platdata,
+       .probe  = axi_emac_probe,
+       .remove = axi_emac_remove,
+       .ops    = &axi_emac_ops,
+       .priv_auto_alloc_size = sizeof(struct axidma_priv),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+};
index 564205df83d39532f378bd0d5f32ad4e2c632b04..5862bf0a7e2d4d34d40ac4dbafab10c636b0d15c 100644 (file)
 #include <common.h>
 #include <net.h>
 #include <config.h>
+#include <dm.h>
+#include <console.h>
 #include <malloc.h>
 #include <asm/io.h>
+#include <phy.h>
+#include <miiphy.h>
 #include <fdtdec.h>
+#include <asm-generic/errno.h>
+#include <linux/kernel.h>
 
-#undef DEBUG
+DECLARE_GLOBAL_DATA_PTR;
 
 #define ENET_ADDR_LENGTH       6
-
-/* EmacLite constants */
-#define XEL_BUFFER_OFFSET      0x0800  /* Next buffer's offset */
-#define XEL_TPLR_OFFSET                0x07F4  /* Tx packet length */
-#define XEL_TSR_OFFSET         0x07FC  /* Tx status */
-#define XEL_RSR_OFFSET         0x17FC  /* Rx status */
-#define XEL_RXBUFF_OFFSET      0x1000  /* Receive Buffer */
+#define ETH_FCS_LEN            4 /* Octets in the FCS */
 
 /* Xmit complete */
 #define XEL_TSR_XMIT_BUSY_MASK         0x00000001UL
 /* Xmit interrupt enable bit */
 #define XEL_TSR_XMIT_IE_MASK           0x00000008UL
-/* Buffer is active, SW bit only */
-#define XEL_TSR_XMIT_ACTIVE_MASK       0x80000000UL
 /* Program the MAC address */
 #define XEL_TSR_PROGRAM_MASK           0x00000002UL
 /* define for programming the MAC address into the EMAC Lite */
 /* Recv interrupt enable bit */
 #define XEL_RSR_RECV_IE_MASK           0x00000008UL
 
+/* MDIO Address Register Bit Masks */
+#define XEL_MDIOADDR_REGADR_MASK  0x0000001F   /* Register Address */
+#define XEL_MDIOADDR_PHYADR_MASK  0x000003E0   /* PHY Address */
+#define XEL_MDIOADDR_PHYADR_SHIFT 5
+#define XEL_MDIOADDR_OP_MASK     0x00000400    /* RD/WR Operation */
+
+/* MDIO Write Data Register Bit Masks */
+#define XEL_MDIOWR_WRDATA_MASK   0x0000FFFF    /* Data to be Written */
+
+/* MDIO Read Data Register Bit Masks */
+#define XEL_MDIORD_RDDATA_MASK   0x0000FFFF    /* Data to be Read */
+
+/* MDIO Control Register Bit Masks */
+#define XEL_MDIOCTRL_MDIOSTS_MASK 0x00000001   /* MDIO Status Mask */
+#define XEL_MDIOCTRL_MDIOEN_MASK  0x00000008   /* MDIO Enable */
+
+struct emaclite_regs {
+       u32 tx_ping; /* 0x0 - TX Ping buffer */
+       u32 reserved1[504];
+       u32 mdioaddr; /* 0x7e4 - MDIO Address Register */
+       u32 mdiowr; /* 0x7e8 - MDIO Write Data Register */
+       u32 mdiord;/* 0x7ec - MDIO Read Data Register */
+       u32 mdioctrl; /* 0x7f0 - MDIO Control Register */
+       u32 tx_ping_tplr; /* 0x7f4 - Tx packet length */
+       u32 global_interrupt; /* 0x7f8 - Global interrupt enable */
+       u32 tx_ping_tsr; /* 0x7fc - Tx status */
+       u32 tx_pong; /* 0x800 - TX Pong buffer */
+       u32 reserved2[508];
+       u32 tx_pong_tplr; /* 0xff4 - Tx packet length */
+       u32 reserved3; /* 0xff8 */
+       u32 tx_pong_tsr; /* 0xffc - Tx status */
+       u32 rx_ping; /* 0x1000 - Receive Buffer */
+       u32 reserved4[510];
+       u32 rx_ping_rsr; /* 0x17fc - Rx status */
+       u32 rx_pong; /* 0x1800 - Receive Buffer */
+       u32 reserved5[510];
+       u32 rx_pong_rsr; /* 0x1ffc - Rx status */
+};
+
 struct xemaclite {
-       u32 nexttxbuffertouse;  /* Next TX buffer to write to */
-       u32 nextrxbuffertouse;  /* Next RX buffer to read from */
+       bool use_rx_pong_buffer_next;   /* Next RX buffer to read from */
        u32 txpp;               /* TX ping pong buffer */
        u32 rxpp;               /* RX ping pong buffer */
+       int phyaddr;
+       struct emaclite_regs *regs;
+       struct phy_device *phydev;
+       struct mii_dev *bus;
 };
 
-static u32 etherrxbuff[PKTSIZE_ALIGN/4]; /* Receive buffer */
+static uchar etherrxbuff[PKTSIZE_ALIGN]; /* Receive buffer */
 
 static void xemaclite_alignedread(u32 *srcptr, void *destptr, u32 bytecount)
 {
@@ -81,7 +121,7 @@ static void xemaclite_alignedread(u32 *srcptr, void *destptr, u32 bytecount)
                *to8ptr++ = *from8ptr++;
 }
 
-static void xemaclite_alignedwrite(void *srcptr, u32 destptr, u32 bytecount)
+static void xemaclite_alignedwrite(void *srcptr, u32 *destptr, u32 bytecount)
 {
        u32 i;
        u32 alignbuffer;
@@ -107,42 +147,206 @@ static void xemaclite_alignedwrite(void *srcptr, u32 destptr, u32 bytecount)
        *to32ptr++ = alignbuffer;
 }
 
-static void emaclite_halt(struct eth_device *dev)
+static int wait_for_bit(const char *func, u32 *reg, const u32 mask,
+                       bool set, unsigned int timeout)
+{
+       u32 val;
+       unsigned long start = get_timer(0);
+
+       while (1) {
+               val = readl(reg);
+
+               if (!set)
+                       val = ~val;
+
+               if ((val & mask) == mask)
+                       return 0;
+
+               if (get_timer(start) > timeout)
+                       break;
+
+               if (ctrlc()) {
+                       puts("Abort\n");
+                       return -EINTR;
+               }
+
+               udelay(1);
+       }
+
+       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n",
+             func, reg, mask, set);
+
+       return -ETIMEDOUT;
+}
+
+static int mdio_wait(struct emaclite_regs *regs)
 {
-       debug("eth_halt\n");
+       return wait_for_bit(__func__, &regs->mdioctrl,
+                           XEL_MDIOCTRL_MDIOSTS_MASK, false, 2000);
 }
 
-static int emaclite_init(struct eth_device *dev, bd_t *bis)
+static u32 phyread(struct xemaclite *emaclite, u32 phyaddress, u32 registernum,
+                  u16 *data)
 {
-       struct xemaclite *emaclite = dev->priv;
+       struct emaclite_regs *regs = emaclite->regs;
+
+       if (mdio_wait(regs))
+               return 1;
+
+       u32 ctrl_reg = in_be32(&regs->mdioctrl);
+       out_be32(&regs->mdioaddr, XEL_MDIOADDR_OP_MASK |
+                ((phyaddress << XEL_MDIOADDR_PHYADR_SHIFT) | registernum));
+       out_be32(&regs->mdioctrl, ctrl_reg | XEL_MDIOCTRL_MDIOSTS_MASK);
+
+       if (mdio_wait(regs))
+               return 1;
+
+       /* Read data */
+       *data = in_be32(&regs->mdiord);
+       return 0;
+}
+
+static u32 phywrite(struct xemaclite *emaclite, u32 phyaddress, u32 registernum,
+                   u16 data)
+{
+       struct emaclite_regs *regs = emaclite->regs;
+
+       if (mdio_wait(regs))
+               return 1;
+
+       /*
+        * Write the PHY address, register number and clear the OP bit in the
+        * MDIO Address register and then write the value into the MDIO Write
+        * Data register. Finally, set the Status bit in the MDIO Control
+        * register to start a MDIO write transaction.
+        */
+       u32 ctrl_reg = in_be32(&regs->mdioctrl);
+       out_be32(&regs->mdioaddr, ~XEL_MDIOADDR_OP_MASK &
+                ((phyaddress << XEL_MDIOADDR_PHYADR_SHIFT) | registernum));
+       out_be32(&regs->mdiowr, data);
+       out_be32(&regs->mdioctrl, ctrl_reg | XEL_MDIOCTRL_MDIOSTS_MASK);
+
+       if (mdio_wait(regs))
+               return 1;
+
+       return 0;
+}
+
+static void emaclite_stop(struct udevice *dev)
+{
+       debug("eth_stop\n");
+}
+
+/* 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
+
+static int setup_phy(struct udevice *dev)
+{
+       int i;
+       u16 phyreg;
+       struct xemaclite *emaclite = dev_get_priv(dev);
+       struct phy_device *phydev;
+
+       u32 supported = SUPPORTED_10baseT_Half |
+                       SUPPORTED_10baseT_Full |
+                       SUPPORTED_100baseT_Half |
+                       SUPPORTED_100baseT_Full;
+
+       if (emaclite->phyaddr != -1) {
+               phyread(emaclite, emaclite->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",
+                             emaclite->phyaddr);
+               } else {
+                       debug("PHY address is not setup correctly %d\n",
+                             emaclite->phyaddr);
+                       emaclite->phyaddr = -1;
+               }
+       }
+
+       if (emaclite->phyaddr == -1) {
+               /* detect the PHY address */
+               for (i = 31; i >= 0; i--) {
+                       phyread(emaclite, i, PHY_DETECT_REG, &phyreg);
+                       if ((phyreg != 0xFFFF) &&
+                           ((phyreg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
+                               /* Found a valid PHY address */
+                               emaclite->phyaddr = i;
+                               debug("emaclite: Found valid phy address, %d\n",
+                                     i);
+                               break;
+                       }
+               }
+       }
+
+       /* interface - look at tsec */
+       phydev = phy_connect(emaclite->bus, emaclite->phyaddr, dev,
+                            PHY_INTERFACE_MODE_MII);
+       /*
+        * Phy can support 1000baseT but device NOT that's why phydev->supported
+        * must be setup for 1000baseT. phydev->advertising setups what speeds
+        * will be used for autonegotiation where 1000baseT must be disabled.
+        */
+       phydev->supported = supported | SUPPORTED_1000baseT_Half |
+                                               SUPPORTED_1000baseT_Full;
+       phydev->advertising = supported;
+       emaclite->phydev = phydev;
+       phy_config(phydev);
+       phy_startup(phydev);
+
+       if (!phydev->link) {
+               printf("%s: No link.\n", phydev->dev->name);
+               return 0;
+       }
+
+       /* Do not setup anything */
+       return 1;
+}
+
+static int emaclite_start(struct udevice *dev)
+{
+       struct xemaclite *emaclite = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct emaclite_regs *regs = emaclite->regs;
+
        debug("EmacLite Initialization Started\n");
 
 /*
  * TX - TX_PING & TX_PONG initialization
  */
        /* Restart PING TX */
-       out_be32 (dev->iobase + XEL_TSR_OFFSET, 0);
+       out_be32(&regs->tx_ping_tsr, 0);
        /* Copy MAC address */
-       xemaclite_alignedwrite(dev->enetaddr, dev->iobase, ENET_ADDR_LENGTH);
+       xemaclite_alignedwrite(pdata->enetaddr, &regs->tx_ping,
+                              ENET_ADDR_LENGTH);
        /* Set the length */
-       out_be32 (dev->iobase + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
+       out_be32(&regs->tx_ping_tplr, ENET_ADDR_LENGTH);
        /* Update the MAC address in the EMAC Lite */
-       out_be32 (dev->iobase + XEL_TSR_OFFSET, XEL_TSR_PROG_MAC_ADDR);
+       out_be32(&regs->tx_ping_tsr, XEL_TSR_PROG_MAC_ADDR);
        /* Wait for EMAC Lite to finish with the MAC address update */
-       while ((in_be32 (dev->iobase + XEL_TSR_OFFSET) &
+       while ((in_be32 (&regs->tx_ping_tsr) &
                XEL_TSR_PROG_MAC_ADDR) != 0)
                ;
 
        if (emaclite->txpp) {
                /* The same operation with PONG TX */
-               out_be32 (dev->iobase + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0);
-               xemaclite_alignedwrite(dev->enetaddr, dev->iobase +
-                       XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH);
-               out_be32 (dev->iobase + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
-               out_be32 (dev->iobase + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET,
-                       XEL_TSR_PROG_MAC_ADDR);
-               while ((in_be32 (dev->iobase + XEL_TSR_OFFSET +
-                       XEL_BUFFER_OFFSET) & XEL_TSR_PROG_MAC_ADDR) != 0)
+               out_be32(&regs->tx_pong_tsr, 0);
+               xemaclite_alignedwrite(pdata->enetaddr, &regs->tx_pong,
+                                      ENET_ADDR_LENGTH);
+               out_be32(&regs->tx_pong_tplr, ENET_ADDR_LENGTH);
+               out_be32(&regs->tx_pong_tsr, XEL_TSR_PROG_MAC_ADDR);
+               while ((in_be32(&regs->tx_pong_tsr) &
+                      XEL_TSR_PROG_MAC_ADDR) != 0)
                        ;
        }
 
@@ -150,52 +354,48 @@ static int emaclite_init(struct eth_device *dev, bd_t *bis)
  * RX - RX_PING & RX_PONG initialization
  */
        /* Write out the value to flush the RX buffer */
-       out_be32 (dev->iobase + XEL_RSR_OFFSET, XEL_RSR_RECV_IE_MASK);
+       out_be32(&regs->rx_ping_rsr, XEL_RSR_RECV_IE_MASK);
 
        if (emaclite->rxpp)
-               out_be32 (dev->iobase + XEL_RSR_OFFSET + XEL_BUFFER_OFFSET,
-                       XEL_RSR_RECV_IE_MASK);
+               out_be32(&regs->rx_pong_rsr, XEL_RSR_RECV_IE_MASK);
+
+       out_be32(&regs->mdioctrl, XEL_MDIOCTRL_MDIOEN_MASK);
+       if (in_be32(&regs->mdioctrl) & XEL_MDIOCTRL_MDIOEN_MASK)
+               if (!setup_phy(dev))
+                       return -1;
 
        debug("EmacLite Initialization complete\n");
        return 0;
 }
 
-static int xemaclite_txbufferavailable(struct eth_device *dev)
+static int xemaclite_txbufferavailable(struct xemaclite *emaclite)
 {
-       u32 reg;
-       u32 txpingbusy;
-       u32 txpongbusy;
-       struct xemaclite *emaclite = dev->priv;
+       u32 tmp;
+       struct emaclite_regs *regs = emaclite->regs;
 
        /*
         * Read the other buffer register
         * and determine if the other buffer is available
         */
-       reg = in_be32 (dev->iobase +
-                       emaclite->nexttxbuffertouse + 0);
-       txpingbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) ==
-                       XEL_TSR_XMIT_BUSY_MASK);
-
-       reg = in_be32 (dev->iobase +
-                       (emaclite->nexttxbuffertouse ^ XEL_TSR_OFFSET) + 0);
-       txpongbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) ==
-                       XEL_TSR_XMIT_BUSY_MASK);
+       tmp = ~in_be32(&regs->tx_ping_tsr);
+       if (emaclite->txpp)
+               tmp |= ~in_be32(&regs->tx_pong_tsr);
 
-       return !(txpingbusy && txpongbusy);
+       return !(tmp & XEL_TSR_XMIT_BUSY_MASK);
 }
 
-static int emaclite_send(struct eth_device *dev, void *ptr, int len)
+static int emaclite_send(struct udevice *dev, void *ptr, int len)
 {
        u32 reg;
-       u32 baseaddress;
-       struct xemaclite *emaclite = dev->priv;
+       struct xemaclite *emaclite = dev_get_priv(dev);
+       struct emaclite_regs *regs = emaclite->regs;
 
        u32 maxtry = 1000;
 
        if (len > PKTSIZE)
                len = PKTSIZE;
 
-       while (!xemaclite_txbufferavailable(dev) && maxtry) {
+       while (xemaclite_txbufferavailable(emaclite) && maxtry) {
                udelay(10);
                maxtry--;
        }
@@ -203,58 +403,40 @@ static int emaclite_send(struct eth_device *dev, void *ptr, int len)
        if (!maxtry) {
                printf("Error: Timeout waiting for ethernet TX buffer\n");
                /* Restart PING TX */
-               out_be32 (dev->iobase + XEL_TSR_OFFSET, 0);
+               out_be32(&regs->tx_ping_tsr, 0);
                if (emaclite->txpp) {
-                       out_be32 (dev->iobase + XEL_TSR_OFFSET +
-                               XEL_BUFFER_OFFSET, 0);
+                       out_be32(&regs->tx_pong_tsr, 0);
                }
                return -1;
        }
 
-       /* Determine the expected TX buffer address */
-       baseaddress = (dev->iobase + emaclite->nexttxbuffertouse);
-
        /* Determine if the expected buffer address is empty */
-       reg = in_be32 (baseaddress + XEL_TSR_OFFSET);
-       if (((reg & XEL_TSR_XMIT_BUSY_MASK) == 0)
-               && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET)
-                       & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) {
-
-               if (emaclite->txpp)
-                       emaclite->nexttxbuffertouse ^= XEL_BUFFER_OFFSET;
-
-               debug("Send packet from 0x%x\n", baseaddress);
+       reg = in_be32(&regs->tx_ping_tsr);
+       if ((reg & XEL_TSR_XMIT_BUSY_MASK) == 0) {
+               debug("Send packet from tx_ping buffer\n");
                /* Write the frame to the buffer */
-               xemaclite_alignedwrite(ptr, baseaddress, len);
-               out_be32 (baseaddress + XEL_TPLR_OFFSET,(len &
-                       (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO)));
-               reg = in_be32 (baseaddress + XEL_TSR_OFFSET);
+               xemaclite_alignedwrite(ptr, &regs->tx_ping, len);
+               out_be32(&regs->tx_ping_tplr, len &
+                       (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO));
+               reg = in_be32(&regs->tx_ping_tsr);
                reg |= XEL_TSR_XMIT_BUSY_MASK;
-               if ((reg & XEL_TSR_XMIT_IE_MASK) != 0)
-                       reg |= XEL_TSR_XMIT_ACTIVE_MASK;
-               out_be32 (baseaddress + XEL_TSR_OFFSET, reg);
+               out_be32(&regs->tx_ping_tsr, reg);
                return 0;
        }
 
        if (emaclite->txpp) {
-               /* Switch to second buffer */
-               baseaddress ^= XEL_BUFFER_OFFSET;
                /* Determine if the expected buffer address is empty */
-               reg = in_be32 (baseaddress + XEL_TSR_OFFSET);
-               if (((reg & XEL_TSR_XMIT_BUSY_MASK) == 0)
-                       && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET)
-                               & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) {
-                       debug("Send packet from 0x%x\n", baseaddress);
+               reg = in_be32(&regs->tx_pong_tsr);
+               if ((reg & XEL_TSR_XMIT_BUSY_MASK) == 0) {
+                       debug("Send packet from tx_pong buffer\n");
                        /* Write the frame to the buffer */
-                       xemaclite_alignedwrite(ptr, baseaddress, len);
-                       out_be32 (baseaddress + XEL_TPLR_OFFSET, (len &
-                               (XEL_TPLR_LENGTH_MASK_HI |
-                                       XEL_TPLR_LENGTH_MASK_LO)));
-                       reg = in_be32 (baseaddress + XEL_TSR_OFFSET);
+                       xemaclite_alignedwrite(ptr, &regs->tx_pong, len);
+                       out_be32(&regs->tx_pong_tplr, len &
+                                (XEL_TPLR_LENGTH_MASK_HI |
+                                 XEL_TPLR_LENGTH_MASK_LO));
+                       reg = in_be32(&regs->tx_pong_tsr);
                        reg |= XEL_TSR_XMIT_BUSY_MASK;
-                       if ((reg & XEL_TSR_XMIT_IE_MASK) != 0)
-                               reg |= XEL_TSR_XMIT_ACTIVE_MASK;
-                       out_be32 (baseaddress + XEL_TSR_OFFSET, reg);
+                       out_be32(&regs->tx_pong_tsr, reg);
                        return 0;
                }
        }
@@ -263,130 +445,188 @@ static int emaclite_send(struct eth_device *dev, void *ptr, int len)
        return -1;
 }
 
-static int emaclite_recv(struct eth_device *dev)
+static int emaclite_recv(struct udevice *dev, int flags, uchar **packetp)
 {
-       u32 length;
-       u32 reg;
-       u32 baseaddress;
+       u32 length, first_read, reg, attempt = 0;
+       void *addr, *ack;
        struct xemaclite *emaclite = dev->priv;
+       struct emaclite_regs *regs = emaclite->regs;
+       struct ethernet_hdr *eth;
+       struct ip_udp_hdr *ip;
+
+try_again:
+       if (!emaclite->use_rx_pong_buffer_next) {
+               reg = in_be32(&regs->rx_ping_rsr);
+               debug("Testing data at rx_ping\n");
+               if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) {
+                       debug("Data found in rx_ping buffer\n");
+                       addr = &regs->rx_ping;
+                       ack = &regs->rx_ping_rsr;
+               } else {
+                       debug("Data not found in rx_ping buffer\n");
+                       /* Pong buffer is not available - return immediately */
+                       if (!emaclite->rxpp)
+                               return -1;
 
-       baseaddress = dev->iobase + emaclite->nextrxbuffertouse;
-       reg = in_be32 (baseaddress + XEL_RSR_OFFSET);
-       debug("Testing data at address 0x%x\n", baseaddress);
-       if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) {
-               if (emaclite->rxpp)
-                       emaclite->nextrxbuffertouse ^= XEL_BUFFER_OFFSET;
+                       /* Try pong buffer if this is first attempt */
+                       if (attempt++)
+                               return -1;
+                       emaclite->use_rx_pong_buffer_next =
+                                       !emaclite->use_rx_pong_buffer_next;
+                       goto try_again;
+               }
        } else {
-
-               if (!emaclite->rxpp) {
-                       debug("No data was available - address 0x%x\n",
-                                                               baseaddress);
-                       return 0;
+               reg = in_be32(&regs->rx_pong_rsr);
+               debug("Testing data at rx_pong\n");
+               if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) {
+                       debug("Data found in rx_pong buffer\n");
+                       addr = &regs->rx_pong;
+                       ack = &regs->rx_pong_rsr;
                } else {
-                       baseaddress ^= XEL_BUFFER_OFFSET;
-                       reg = in_be32 (baseaddress + XEL_RSR_OFFSET);
-                       if ((reg & XEL_RSR_RECV_DONE_MASK) !=
-                                               XEL_RSR_RECV_DONE_MASK) {
-                               debug("No data was available - address 0x%x\n",
-                                               baseaddress);
-                               return 0;
-                       }
+                       debug("Data not found in rx_pong buffer\n");
+                       /* Try ping buffer if this is first attempt */
+                       if (attempt++)
+                               return -1;
+                       emaclite->use_rx_pong_buffer_next =
+                                       !emaclite->use_rx_pong_buffer_next;
+                       goto try_again;
                }
        }
-       /* Get the length of the frame that arrived */
-       switch(((ntohl(in_be32 (baseaddress + XEL_RXBUFF_OFFSET + 0xC))) &
-                       0xFFFF0000 ) >> 16) {
-               case 0x806:
-                       length = 42 + 20; /* FIXME size of ARP */
-                       debug("ARP Packet\n");
-                       break;
-               case 0x800:
-                       length = 14 + 14 +
-                       (((ntohl(in_be32 (baseaddress + XEL_RXBUFF_OFFSET +
-                                               0x10))) & 0xFFFF0000) >> 16);
-                       /* FIXME size of IP packet */
-                       debug ("IP Packet\n");
-                       break;
-               default:
-                       debug("Other Packet\n");
-                       length = PKTSIZE;
-                       break;
+
+       /* Read all bytes for ARP packet with 32bit alignment - 48bytes  */
+       first_read = ALIGN(ETHER_HDR_SIZE + ARP_HDR_SIZE + ETH_FCS_LEN, 4);
+       xemaclite_alignedread(addr, etherrxbuff, first_read);
+
+       /* Detect real packet size */
+       eth = (struct ethernet_hdr *)etherrxbuff;
+       switch (ntohs(eth->et_protlen)) {
+       case PROT_ARP:
+               length = first_read;
+               debug("ARP Packet %x\n", length);
+               break;
+       case PROT_IP:
+               ip = (struct ip_udp_hdr *)(etherrxbuff + ETHER_HDR_SIZE);
+               length = ntohs(ip->ip_len);
+               length += ETHER_HDR_SIZE + ETH_FCS_LEN;
+               debug("IP Packet %x\n", length);
+               break;
+       default:
+               debug("Other Packet\n");
+               length = PKTSIZE;
+               break;
        }
 
-       xemaclite_alignedread((u32 *) (baseaddress + XEL_RXBUFF_OFFSET),
-                       etherrxbuff, length);
+       /* Read the rest of the packet which is longer then first read */
+       if (length != first_read)
+               xemaclite_alignedread(addr + first_read,
+                                     etherrxbuff + first_read,
+                                     length - first_read);
 
        /* Acknowledge the frame */
-       reg = in_be32 (baseaddress + XEL_RSR_OFFSET);
+       reg = in_be32(ack);
        reg &= ~XEL_RSR_RECV_DONE_MASK;
-       out_be32 (baseaddress + XEL_RSR_OFFSET, reg);
+       out_be32(ack, reg);
 
-       debug("Packet receive from 0x%x, length %dB\n", baseaddress, length);
-       net_process_received_packet((uchar *)etherrxbuff, length);
+       debug("Packet receive from 0x%p, length %dB\n", addr, length);
+       *packetp = etherrxbuff;
        return length;
-
 }
 
-int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr,
-                                                       int txpp, int rxpp)
+static int emaclite_miiphy_read(struct mii_dev *bus, int addr,
+                               int devad, int reg)
 {
-       struct eth_device *dev;
-       struct xemaclite *emaclite;
+       u32 ret;
+       u16 val = 0;
 
-       dev = calloc(1, sizeof(*dev));
-       if (dev == NULL)
-               return -1;
+       ret = phyread(bus->priv, addr, reg, &val);
+       debug("emaclite: Read MII 0x%x, 0x%x, 0x%x, %d\n", addr, reg, val, ret);
+       return val;
+}
 
-       emaclite = calloc(1, sizeof(struct xemaclite));
-       if (emaclite == NULL) {
-               free(dev);
-               return -1;
-       }
+static int emaclite_miiphy_write(struct mii_dev *bus, int addr, int devad,
+                                int reg, u16 value)
+{
+       debug("emaclite: Write MII 0x%x, 0x%x, 0x%x\n", addr, reg, value);
+       return phywrite(bus->priv, addr, reg, value);
+}
+
+static int emaclite_probe(struct udevice *dev)
+{
+       struct xemaclite *emaclite = dev_get_priv(dev);
+       int ret;
 
-       dev->priv = emaclite;
+       emaclite->bus = mdio_alloc();
+       emaclite->bus->read = emaclite_miiphy_read;
+       emaclite->bus->write = emaclite_miiphy_write;
+       emaclite->bus->priv = emaclite;
+       strcpy(emaclite->bus->name, "emaclite");
 
-       emaclite->txpp = txpp;
-       emaclite->rxpp = rxpp;
+       ret = mdio_register(emaclite->bus);
+       if (ret)
+               return ret;
 
-       sprintf(dev->name, "Xelite.%lx", base_addr);
+       return 0;
+}
 
-       dev->iobase = base_addr;
-       dev->init = emaclite_init;
-       dev->halt = emaclite_halt;
-       dev->send = emaclite_send;
-       dev->recv = emaclite_recv;
+static int emaclite_remove(struct udevice *dev)
+{
+       struct xemaclite *emaclite = dev_get_priv(dev);
 
-       eth_register(dev);
+       free(emaclite->phydev);
+       mdio_unregister(emaclite->bus);
+       mdio_free(emaclite->bus);
 
-       return 1;
+       return 0;
 }
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
-int xilinx_emaclite_of_init(const void *blob)
+static const struct eth_ops emaclite_ops = {
+       .start = emaclite_start,
+       .send = emaclite_send,
+       .recv = emaclite_recv,
+       .stop = emaclite_stop,
+};
+
+static int emaclite_ofdata_to_platdata(struct udevice *dev)
 {
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct xemaclite *emaclite = dev_get_priv(dev);
        int offset = 0;
-       u32 ret = 0;
-       u32 reg;
 
-       do {
-               offset = fdt_node_offset_by_compatible(blob, offset,
-                                       "xlnx,xps-ethernetlite-1.00.a");
-               if (offset != -1) {
-                       reg = fdtdec_get_addr(blob, offset, "reg");
-                       if (reg != FDT_ADDR_T_NONE) {
-                               u32 rxpp = fdtdec_get_int(blob, offset,
-                                                       "xlnx,rx-ping-pong", 0);
-                               u32 txpp = fdtdec_get_int(blob, offset,
-                                                       "xlnx,tx-ping-pong", 0);
-                               ret |= xilinx_emaclite_initialize(NULL, reg,
-                                                               txpp, rxpp);
-                       } else {
-                               debug("EMACLITE: Can't get base address\n");
-                               return -1;
-                       }
-               }
-       } while (offset != -1);
+       pdata->iobase = (phys_addr_t)dev_get_addr(dev);
+       emaclite->regs = (struct emaclite_regs *)pdata->iobase;
+
+       emaclite->phyaddr = -1;
+
+       offset = fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset,
+                                     "phy-handle");
+       if (offset > 0)
+               emaclite->phyaddr = fdtdec_get_int(gd->fdt_blob, offset,
+                                                  "reg", -1);
+
+       emaclite->txpp = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+                                       "xlnx,tx-ping-pong", 0);
+       emaclite->rxpp = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+                                       "xlnx,rx-ping-pong", 0);
 
-       return ret;
+       printf("EMACLITE: %lx, phyaddr %d, %d/%d\n", (ulong)emaclite->regs,
+              emaclite->phyaddr, emaclite->txpp, emaclite->rxpp);
+
+       return 0;
 }
-#endif
+
+static const struct udevice_id emaclite_ids[] = {
+       { .compatible = "xlnx,xps-ethernetlite-1.00.a" },
+       { }
+};
+
+U_BOOT_DRIVER(emaclite) = {
+       .name   = "emaclite",
+       .id     = UCLASS_ETH,
+       .of_match = emaclite_ids,
+       .ofdata_to_platdata = emaclite_ofdata_to_platdata,
+       .probe  = emaclite_probe,
+       .remove = emaclite_remove,
+       .ops    = &emaclite_ops,
+       .priv_auto_alloc_size = sizeof(struct xemaclite),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+};
index 7cc86571e4952e001f2d5da234795abd520d223a..ca09546ab59f7f7d4b540eb6903bdacaa9a55815 100644 (file)
@@ -303,7 +303,8 @@ int xilinx_ll_temac_initialize(bd_t *bis, struct ll_temac_info *devinf)
        if (devinf->devname) {
                strncpy(dev->name, devinf->devname, sizeof(dev->name));
        } else {
-               snprintf(dev->name, sizeof(dev->name), "lltemac.%lx", devinf->base_addr);
+               snprintf(dev->name, sizeof(dev->name), "ll_tem.%lx",
+                        devinf->base_addr);
                devinf->devname = dev->name;
        }
 
index 7059c8432a34959a2cc5a8caba230d9ac46e72fc..b3821c31a91dc36f0cf6e7169c9ecc7bbad10c02 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/io.h>
 #include <phy.h>
 #include <miiphy.h>
+#include <wait_bit.h>
 #include <watchdog.h>
 #include <asm/system.h>
 #include <asm/arch/hardware.h>
@@ -56,7 +57,11 @@ DECLARE_GLOBAL_DATA_PTR;
 #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 */
+#ifdef CONFIG_ARM64
+#define ZYNQ_GEM_NWCFG_MDCCLKDIV       0x000100000 /* Div pclk by 64, max 160MHz */
+#else
 #define ZYNQ_GEM_NWCFG_MDCCLKDIV       0x0000c0000 /* Div pclk by 48, max 120MHz */
+#endif
 
 #ifdef CONFIG_ARM64
 # define ZYNQ_GEM_DBUS_WIDTH   (1 << 21) /* 64 bit bus */
@@ -448,38 +453,6 @@ static int zynq_gem_init(struct udevice *dev)
        return 0;
 }
 
-static int wait_for_bit(const char *func, u32 *reg, const u32 mask,
-                       bool set, unsigned int timeout)
-{
-       u32 val;
-       unsigned long start = get_timer(0);
-
-       while (1) {
-               val = readl(reg);
-
-               if (!set)
-                       val = ~val;
-
-               if ((val & mask) == mask)
-                       return 0;
-
-               if (get_timer(start) > timeout)
-                       break;
-
-               if (ctrlc()) {
-                       puts("Abort\n");
-                       return -EINTR;
-               }
-
-               udelay(1);
-       }
-
-       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n",
-             func, reg, mask, set);
-
-       return -ETIMEDOUT;
-}
-
 static int zynq_gem_send(struct udevice *dev, void *ptr, int len)
 {
        u32 addr, size;
@@ -521,7 +494,7 @@ static int zynq_gem_send(struct udevice *dev, void *ptr, int len)
                printf("TX buffers exhausted in mid frame\n");
 
        return wait_for_bit(__func__, &regs->txsr, ZYNQ_GEM_TSR_DONE,
-                           true, 20000);
+                           true, 20000, true);
 }
 
 /* Do not check frame_recd flag in rx_status register 0x20 - just poll BD */
diff --git a/drivers/pch/Makefile b/drivers/pch/Makefile
new file mode 100644 (file)
index 0000000..dde9e86
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += pch-uclass.o
+obj-y += pch7.o
+obj-y += pch9.o
similarity index 50%
rename from arch/x86/lib/pch-uclass.c
rename to drivers/pch/pch-uclass.c
index 20dfa815d20c3847ec5cbceb74fdf86a11688def..4579ed12f65b5fb33809d2dc1d70d83e6623af22 100644 (file)
@@ -7,10 +7,42 @@
 
 #include <common.h>
 #include <dm.h>
+#include <pch.h>
 #include <dm/root.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+int pch_get_sbase(struct udevice *dev, ulong *sbasep)
+{
+       struct pch_ops *ops = pch_get_ops(dev);
+
+       *sbasep = 0;
+       if (!ops->get_sbase)
+               return -ENOSYS;
+
+       return ops->get_sbase(dev, sbasep);
+}
+
+enum pch_version pch_get_version(struct udevice *dev)
+{
+       struct pch_ops *ops = pch_get_ops(dev);
+
+       if (!ops->get_version)
+               return -ENOSYS;
+
+       return ops->get_version(dev);
+}
+
+int pch_set_spi_protect(struct udevice *dev, bool protect)
+{
+       struct pch_ops *ops = pch_get_ops(dev);
+
+       if (!ops->set_spi_protect)
+               return -ENOSYS;
+
+       return ops->set_spi_protect(dev, protect);
+}
+
 static int pch_uclass_post_bind(struct udevice *bus)
 {
        /*
diff --git a/drivers/pch/pch7.c b/drivers/pch/pch7.c
new file mode 100644 (file)
index 0000000..ef72422
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <pch.h>
+
+#define BIOS_CTRL      0xd8
+
+static int pch7_get_sbase(struct udevice *dev, ulong *sbasep)
+{
+       u32 rcba;
+
+       dm_pci_read_config32(dev, PCH_RCBA, &rcba);
+       /* Bits 31-14 are the base address, 13-1 are reserved, 0 is enable */
+       rcba = rcba & 0xffffc000;
+       *sbasep = rcba + 0x3020;
+
+       return 0;
+}
+
+static enum pch_version pch7_get_version(struct udevice *dev)
+{
+       return PCHV_7;
+}
+
+static int pch7_set_spi_protect(struct udevice *dev, bool protect)
+{
+       uint8_t bios_cntl;
+
+       /* Adjust the BIOS write protect to dis/allow write commands */
+       dm_pci_read_config8(dev, BIOS_CTRL, &bios_cntl);
+       if (protect)
+               bios_cntl &= ~BIOS_CTRL_BIOSWE;
+       else
+               bios_cntl |= BIOS_CTRL_BIOSWE;
+       dm_pci_write_config8(dev, BIOS_CTRL, bios_cntl);
+
+       return 0;
+}
+
+static const struct pch_ops pch7_ops = {
+       .get_sbase      = pch7_get_sbase,
+       .get_version    = pch7_get_version,
+       .set_spi_protect = pch7_set_spi_protect,
+};
+
+static const struct udevice_id pch7_ids[] = {
+       { .compatible = "intel,pch7" },
+       { }
+};
+
+U_BOOT_DRIVER(pch7_drv) = {
+       .name           = "intel-pch7",
+       .id             = UCLASS_PCH,
+       .of_match       = pch7_ids,
+       .ops            = &pch7_ops,
+};
diff --git a/drivers/pch/pch9.c b/drivers/pch/pch9.c
new file mode 100644 (file)
index 0000000..529cb02
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <pch.h>
+
+#define SBASE_ADDR     0x54
+
+static int pch9_get_sbase(struct udevice *dev, ulong *sbasep)
+{
+       uint32_t sbase_addr;
+
+       dm_pci_read_config32(dev, SBASE_ADDR, &sbase_addr);
+       *sbasep = sbase_addr & 0xfffffe00;
+
+       return 0;
+}
+
+static enum pch_version pch9_get_version(struct udevice *dev)
+{
+       return PCHV_9;
+}
+
+static const struct pch_ops pch9_ops = {
+       .get_sbase      = pch9_get_sbase,
+       .get_version    = pch9_get_version,
+};
+
+static const struct udevice_id pch9_ids[] = {
+       { .compatible = "intel,pch9" },
+       { }
+};
+
+U_BOOT_DRIVER(pch9_drv) = {
+       .name           = "intel-pch9",
+       .id             = UCLASS_PCH,
+       .of_match       = pch9_ids,
+       .ops            = &pch9_ops,
+};
index 685df9d274e4ba1c960523fad72fc2482335fdaa..61292d72bda8f1c496370ab0d72489e0b880bc42 100644 (file)
@@ -22,7 +22,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static int pci_get_bus(int busnum, struct udevice **busp)
+int pci_get_bus(int busnum, struct udevice **busp)
 {
        int ret;
 
@@ -41,20 +41,6 @@ static int pci_get_bus(int busnum, struct udevice **busp)
        return ret;
 }
 
-struct pci_controller *pci_bus_to_hose(int busnum)
-{
-       struct udevice *bus;
-       int ret;
-
-       ret = pci_get_bus(busnum, &bus);
-       if (ret) {
-               debug("%s: Cannot get bus %d: ret=%d\n", __func__, busnum, ret);
-               return NULL;
-       }
-
-       return dev_get_uclass_priv(bus);
-}
-
 struct udevice *pci_get_controller(struct udevice *dev)
 {
        while (device_is_on_pci_bus(dev))
@@ -1067,6 +1053,14 @@ u32 dm_pci_read_bar32(struct udevice *dev, int barnum)
                return addr & PCI_BASE_ADDRESS_MEM_MASK;
 }
 
+void dm_pci_write_bar32(struct udevice *dev, int barnum, u32 addr)
+{
+       int bar;
+
+       bar = PCI_BASE_ADDRESS_0 + barnum * 4;
+       dm_pci_write_config32(dev, bar, addr);
+}
+
 static int _dm_pci_bus_to_phys(struct udevice *ctlr,
                               pci_addr_t bus_addr, unsigned long flags,
                               unsigned long skip_mask, phys_addr_t *pa)
index 5cfa135ba6e51d93a92b31d7b6e2904b23f3b85a..88bc416c61628fd2c44042dbd22dd79eb0480729 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <pci.h>
 
@@ -167,8 +168,8 @@ void dm_pciauto_prescan_setup_bridge(struct udevice *dev, int sub_bus)
        struct pci_region *pci_prefetch;
        struct pci_region *pci_io;
        u16 cmdstat, prefechable_64;
-       /* The root controller has the region information */
-       struct pci_controller *ctlr_hose = pci_bus_to_hose(0);
+       struct udevice *ctlr = pci_get_controller(dev);
+       struct pci_controller *ctlr_hose = dev_get_uclass_priv(ctlr);
 
        pci_mem = ctlr_hose->pci_mem;
        pci_prefetch = ctlr_hose->pci_prefetch;
@@ -248,9 +249,8 @@ void dm_pciauto_postscan_setup_bridge(struct udevice *dev, int sub_bus)
        struct pci_region *pci_mem;
        struct pci_region *pci_prefetch;
        struct pci_region *pci_io;
-
-       /* The root controller has the region information */
-       struct pci_controller *ctlr_hose = pci_bus_to_hose(0);
+       struct udevice *ctlr = pci_get_controller(dev);
+       struct pci_controller *ctlr_hose = dev_get_uclass_priv(ctlr);
 
        pci_mem = ctlr_hose->pci_mem;
        pci_prefetch = ctlr_hose->pci_prefetch;
@@ -311,13 +311,13 @@ int dm_pciauto_config_device(struct udevice *dev)
        unsigned int sub_bus = PCI_BUS(dm_pci_get_bdf(dev));
        unsigned short class;
        bool enum_only = false;
+       struct udevice *ctlr = pci_get_controller(dev);
+       struct pci_controller *ctlr_hose = dev_get_uclass_priv(ctlr);
        int n;
 
 #ifdef CONFIG_PCI_ENUM_ONLY
        enum_only = true;
 #endif
-       /* The root controller has the region information */
-       struct pci_controller *ctlr_hose = pci_bus_to_hose(0);
 
        pci_mem = ctlr_hose->pci_mem;
        pci_prefetch = ctlr_hose->pci_prefetch;
index dd15eb19f85a3f13d8847e883872ffabbba52830..ddaf358e26dc5ffa24012aed736ec73ad8d31037 100644 (file)
@@ -12,6 +12,7 @@
 #include <pci.h>
 #include <dm/device-internal.h>
 #include <dm/lists.h>
+#include "pci_internal.h"
 
 #define PCI_HOSE_OP(rw, name, size, type)                              \
 int pci_hose_##rw##_config_##name(struct pci_controller *hose,         \
@@ -36,3 +37,17 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
                return -1;
        return dm_pci_get_bdf(dev);
 }
+
+struct pci_controller *pci_bus_to_hose(int busnum)
+{
+       struct udevice *bus;
+       int ret;
+
+       ret = pci_get_bus(busnum, &bus);
+       if (ret) {
+               debug("%s: Cannot get bus %d: ret=%d\n", __func__, busnum, ret);
+               return NULL;
+       }
+
+       return dev_get_uclass_priv(bus);
+}
index 0867575a58f9d7cbcc97faa9e547236026686e8e..616b9c174ced3729144eba159f275bb3b70c377e 100644 (file)
@@ -47,4 +47,16 @@ void dm_pciauto_postscan_setup_bridge(struct udevice *dev, int sub_bus);
  */
 int dm_pciauto_config_device(struct udevice *dev);
 
+/**
+ * pci_get_bus() - Get a pointer to a bus, given its number
+ *
+ * This looks up a PCI bus based on its bus number. The bus is probed if
+ * necessary.
+ *
+ * @busnum:    PCI bus number to look up
+ * @busp:      Returns PCI bus on success
+ * @return 0 on success, or -ve error
+ */
+int pci_get_bus(int busnum, struct udevice **busp);
+
 #endif
index ed2f61dfc33c67d363679ddf31772034578125a5..d5bf6f4c471646018663c84cf8f7ed7f31751214 100644 (file)
@@ -328,12 +328,12 @@ int dm_pci_run_vga_bios(struct udevice *dev, int (*int15_handler)(void),
 #ifdef CONFIG_BIOSEMU
                BE_VGAInfo *info;
 
-               ret = biosemu_setup(dm_pci_get_bdf(dev), &info);
+               ret = biosemu_setup(dev, &info);
                if (ret)
                        goto err;
                biosemu_set_interrupt_handler(0x15, int15_handler);
-               ret = biosemu_run(dm_pci_get_bdf(dev), (uchar *)ram, 1 << 16,
-                                 info, true, vesa_mode, &mode_info);
+               ret = biosemu_run(dev, (uchar *)ram, 1 << 16, info,
+                                 true, vesa_mode, &mode_info);
                if (ret)
                        goto err;
 #endif
index 7eaec6a7024fbcd6912202b7fcbb394beb660115..6bdebf28cd59de02ffd7d72d56d1d6d5bd28d1a6 100644 (file)
@@ -7,9 +7,7 @@
 #ifndef __PINCTRL_UNIPHIER_H__
 #define __PINCTRL_UNIPHIER_H__
 
-/* TODO: move this to include/linux/bug.h */
-#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
-
+#include <linux/bug.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 
index e86dd72c14f74c7c1385810b9c8b05e5dfcb30ac..10683a21d971eb9a06e817aa6437f6f9689315f4 100644 (file)
@@ -20,6 +20,7 @@ config SUNXI_NO_PMIC
 config AXP152_POWER
        boolean "axp152 pmic support"
        depends on MACH_SUN5I
+       select CMD_POWEROFF
        ---help---
        Select this to enable support for the axp152 pmic found on most
        A10s boards.
@@ -27,6 +28,7 @@ config AXP152_POWER
 config AXP209_POWER
        boolean "axp209 pmic support"
        depends on MACH_SUN4I || MACH_SUN5I || MACH_SUN7I
+       select CMD_POWEROFF
        ---help---
        Select this to enable support for the axp209 pmic found on most
        A10, A13 and A20 boards.
@@ -34,6 +36,7 @@ config AXP209_POWER
 config AXP221_POWER
        boolean "axp221 / axp223 pmic support"
        depends on MACH_SUN6I || MACH_SUN8I_A23 || MACH_SUN8I_A33
+       select CMD_POWEROFF
        ---help---
        Select this to enable support for the axp221/axp223 pmic found on most
        A23 and A31 boards.
@@ -118,20 +121,24 @@ config AXP_DCDC5_VOLT
 
 config AXP_ALDO1_VOLT
        int "axp pmic (a)ldo1 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0 if MACH_SUN6I
+       default 1800 if MACH_SUN8I_A83T
        default 3000 if MACH_SUN8I
        ---help---
        Set the voltage (mV) to program the axp pmic aldo1 at, set to 0 to
        disable aldo1.
        On A31 boards aldo1 is often used to power the wifi module.
        On A23 / A33 boards aldo1 is used for VCC-IO and should be 3.0V.
+       On A83T / H8 boards aldo1 is used for MIPI CSI, DSI, HDMI, EFUSE, and
+       should be 1.8V.
 
 config AXP_ALDO2_VOLT
        int "axp pmic (a)ldo2 voltage"
        depends on AXP152_POWER || AXP209_POWER || AXP221_POWER || AXP818_POWER
        default 3000 if AXP152_POWER || AXP209_POWER
        default 0 if MACH_SUN6I
+       default 1800 if MACH_SUN8I_A83T
        default 2500 if MACH_SUN8I
        ---help---
        Set the voltage (mV) to program the axp pmic aldo2 at, set to 0 to
@@ -140,18 +147,21 @@ config AXP_ALDO2_VOLT
        On A31 boards aldo2 is typically unused and should be disabled.
        On A31 boards aldo2 may be used for LPDDR2 then it should be 1.8V.
        On A23 / A33 boards aldo2 is used for VDD-DLL and should be 2.5V.
+       On A83T / H8 boards aldo2 powers VDD-DLL, VCC18-PLL, CPVDD, VDD18-ADC,
+       LPDDR2, and the codec. It should be 1.8V.
 
 config AXP_ALDO3_VOLT
        int "axp pmic (a)ldo3 voltage"
        depends on AXP209_POWER || AXP221_POWER || AXP818_POWER
-       default 0 if AXP209_POWER || AXP818_POWER
+       default 0 if AXP209_POWER
        default 3000 if MACH_SUN6I || MACH_SUN8I
        ---help---
        Set the voltage (mV) to program the axp pmic aldo3 at, set to 0 to
        disable aldo3.
        On A10(s) / A13 / A20 boards aldo3 should be 2.8V.
        On A23 / A31 / A33 boards aldo3 is VCC-PLL and AVCC and should be 3.0V.
-       On A83T aldo3 is used for LVDS, DSI, MIPI, HDMI, etc.
+       On A83T / H8 boards aldo3 is AVCC, VCC-PL, and VCC-LED, and should be
+       3.0V.
 
 config AXP_ALDO4_VOLT
        int "axp pmic (a)ldo4 voltage"
@@ -164,7 +174,7 @@ config AXP_ALDO4_VOLT
 
 config AXP_DLDO1_VOLT
        int "axp pmic dldo1 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic dldo1 at, set to 0 to
@@ -174,7 +184,7 @@ config AXP_DLDO1_VOLT
 
 config AXP_DLDO2_VOLT
        int "axp pmic dldo2 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic dldo2 at, set to 0 to
@@ -182,7 +192,7 @@ config AXP_DLDO2_VOLT
 
 config AXP_DLDO3_VOLT
        int "axp pmic dldo3 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic dldo3 at, set to 0 to
@@ -198,7 +208,7 @@ config AXP_DLDO4_VOLT
 
 config AXP_ELDO1_VOLT
        int "axp pmic eldo1 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic eldo1 at, set to 0 to
@@ -206,7 +216,7 @@ config AXP_ELDO1_VOLT
 
 config AXP_ELDO2_VOLT
        int "axp pmic eldo2 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic eldo2 at, set to 0 to
@@ -214,7 +224,7 @@ config AXP_ELDO2_VOLT
 
 config AXP_ELDO3_VOLT
        int "axp pmic eldo3 voltage"
-       depends on AXP221_POWER
+       depends on AXP221_POWER || AXP818_POWER
        default 0
        ---help---
        Set the voltage (mV) to program the axp pmic eldo3 at, set to 0 to
index 297258692d3d2f4d423ad02a2317c90d035d1cc3..cd07275d9ffd9e1ef671a4177e274e540766710f 100644 (file)
@@ -5,6 +5,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <common.h>
+#include <command.h>
 #include <asm/arch/pmic_bus.h>
 #include <axp_pmic.h>
 
@@ -78,3 +79,14 @@ int axp_init(void)
 
        return 0;
 }
+
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       pmic_bus_write(AXP152_SHUTDOWN, AXP152_POWEROFF);
+
+       /* infinite loop during shutdown */
+       while (1) {}
+
+       /* not reached */
+       return 0;
+}
index 71aa000daab759b459a4215c71091bcc09b75f16..fc162a149eb37d4edf1aa1d4ee911c3afb904f86 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <asm/arch/pmic_bus.h>
 #include <axp_pmic.h>
 
@@ -168,3 +169,14 @@ int axp_init(void)
 
        return 0;
 }
+
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       pmic_bus_write(AXP209_SHUTDOWN, AXP209_POWEROFF);
+
+       /* infinite loop during shutdown */
+       while (1) {}
+
+       /* not reached */
+       return 0;
+}
index 65802e4a713f9eec76dfc41d18a0db048160544b..cb1f88b185ccacc802394b6706c0fa6864b9b3ff 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <errno.h>
 #include <asm/arch/pmic_bus.h>
 #include <axp_pmic.h>
@@ -115,74 +116,6 @@ int axp_set_dcdc5(unsigned int mvolt)
                                AXP221_OUTPUT_CTRL1_DCDC5_EN);
 }
 
-int axp_set_dldo1(unsigned int mvolt)
-{
-       int ret;
-       u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
-
-       if (mvolt == 0)
-               return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
-                                       AXP221_OUTPUT_CTRL2_DLDO1_EN);
-
-       ret = pmic_bus_write(AXP221_DLDO1_CTRL, cfg);
-       if (ret)
-               return ret;
-
-       return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
-                               AXP221_OUTPUT_CTRL2_DLDO1_EN);
-}
-
-int axp_set_dldo2(unsigned int mvolt)
-{
-       int ret;
-       u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
-
-       if (mvolt == 0)
-               return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
-                                       AXP221_OUTPUT_CTRL2_DLDO2_EN);
-
-       ret = pmic_bus_write(AXP221_DLDO2_CTRL, cfg);
-       if (ret)
-               return ret;
-
-       return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
-                               AXP221_OUTPUT_CTRL2_DLDO2_EN);
-}
-
-int axp_set_dldo3(unsigned int mvolt)
-{
-       int ret;
-       u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
-
-       if (mvolt == 0)
-               return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
-                                       AXP221_OUTPUT_CTRL2_DLDO3_EN);
-
-       ret = pmic_bus_write(AXP221_DLDO3_CTRL, cfg);
-       if (ret)
-               return ret;
-
-       return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
-                               AXP221_OUTPUT_CTRL2_DLDO3_EN);
-}
-
-int axp_set_dldo4(unsigned int mvolt)
-{
-       int ret;
-       u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
-
-       if (mvolt == 0)
-               return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
-                                       AXP221_OUTPUT_CTRL2_DLDO4_EN);
-
-       ret = pmic_bus_write(AXP221_DLDO4_CTRL, cfg);
-       if (ret)
-               return ret;
-
-       return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
-                               AXP221_OUTPUT_CTRL2_DLDO4_EN);
-}
-
 int axp_set_aldo1(unsigned int mvolt)
 {
        int ret;
@@ -234,6 +167,26 @@ int axp_set_aldo3(unsigned int mvolt)
                                AXP221_OUTPUT_CTRL3_ALDO3_EN);
 }
 
+int axp_set_dldo(int dldo_num, unsigned int mvolt)
+{
+       u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
+       int ret;
+
+       if (dldo_num < 1 || dldo_num > 4)
+               return -EINVAL;
+
+       if (mvolt == 0)
+               return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
+                               AXP221_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
+
+       ret = pmic_bus_write(AXP221_DLDO1_CTRL + (dldo_num - 1), cfg);
+       if (ret)
+               return ret;
+
+       return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
+                               AXP221_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
+}
+
 int axp_set_eldo(int eldo_num, unsigned int mvolt)
 {
        int ret;
@@ -312,3 +265,14 @@ int axp_get_sid(unsigned int *sid)
 
        return 0;
 }
+
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       pmic_bus_write(AXP221_SHUTDOWN, AXP221_SHUTDOWN_POWEROFF);
+
+       /* infinite loop during shutdown */
+       while (1) {}
+
+       /* not reached */
+       return 0;
+}
index 4b21a838798558220d786d28fadcc702b78f3d1f..e885d029840335d42a60184c72d3af7fd2b2cf47 100644 (file)
@@ -110,6 +110,87 @@ int axp_set_dcdc5(unsigned int mvolt)
                                AXP818_OUTPUT_CTRL1_DCDC5_EN);
 }
 
+int axp_set_aldo(int aldo_num, unsigned int mvolt)
+{
+       int ret;
+       u8 cfg;
+
+       if (aldo_num < 1 || aldo_num > 3)
+               return -EINVAL;
+
+       if (mvolt == 0)
+               return pmic_bus_clrbits(AXP818_OUTPUT_CTRL3,
+                               AXP818_OUTPUT_CTRL3_ALDO1_EN << (aldo_num - 1));
+
+       cfg = axp818_mvolt_to_cfg(mvolt, 700, 3300, 100);
+       ret = pmic_bus_write(AXP818_ALDO1_CTRL + (aldo_num - 1), cfg);
+       if (ret)
+               return ret;
+
+       return pmic_bus_setbits(AXP818_OUTPUT_CTRL3,
+                               AXP818_OUTPUT_CTRL3_ALDO1_EN << (aldo_num - 1));
+}
+
+/* TODO: re-work other AXP drivers to consolidate ALDO functions. */
+int axp_set_aldo1(unsigned int mvolt)
+{
+       return axp_set_aldo(1, mvolt);
+}
+
+int axp_set_aldo2(unsigned int mvolt)
+{
+       return axp_set_aldo(2, mvolt);
+}
+
+int axp_set_aldo3(unsigned int mvolt)
+{
+       return axp_set_aldo(3, mvolt);
+}
+
+int axp_set_dldo(int dldo_num, unsigned int mvolt)
+{
+       int ret;
+       u8 cfg;
+
+       if (dldo_num < 1 || dldo_num > 4)
+               return -EINVAL;
+
+       if (mvolt == 0)
+               return pmic_bus_clrbits(AXP818_OUTPUT_CTRL2,
+                               AXP818_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
+
+       cfg = axp818_mvolt_to_cfg(mvolt, 700, 3300, 100);
+       if (dldo_num == 2 && mvolt > 3300)
+               cfg += 1 + axp818_mvolt_to_cfg(mvolt, 3400, 4200, 200);
+       ret = pmic_bus_write(AXP818_ELDO1_CTRL + (dldo_num - 1), cfg);
+       if (ret)
+               return ret;
+
+       return pmic_bus_setbits(AXP818_OUTPUT_CTRL2,
+                               AXP818_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
+}
+
+int axp_set_eldo(int eldo_num, unsigned int mvolt)
+{
+       int ret;
+       u8 cfg;
+
+       if (eldo_num < 1 || eldo_num > 3)
+               return -EINVAL;
+
+       if (mvolt == 0)
+               return pmic_bus_clrbits(AXP818_OUTPUT_CTRL2,
+                               AXP818_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
+
+       cfg = axp818_mvolt_to_cfg(mvolt, 700, 1900, 50);
+       ret = pmic_bus_write(AXP818_ELDO1_CTRL + (eldo_num - 1), cfg);
+       if (ret)
+               return ret;
+
+       return pmic_bus_setbits(AXP818_OUTPUT_CTRL2,
+                               AXP818_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
+}
+
 int axp_init(void)
 {
        u8 axp_chip_id;
index 83068cfd50f4c53aac9f1a906602be22624d4b5f..1ab612826914e71872c37b895a30bae27b042633 100644 (file)
@@ -112,6 +112,13 @@ config DEBUG_UART_S5P
          will need to provide parameters to make this work. The driver will
          be available until the real driver-model serial is running.
 
+config DEBUG_UART_UARTLITE
+       bool "Xilinx Uartlite"
+       help
+         Select this to enable a debug UART using the serial_uartlite driver.
+         You will need to provide parameters to make this work. The driver will
+         be available until the real driver-model serial is running.
+
 config DEBUG_UART_ZYNQ
        bool "Xilinx Zynq"
        help
@@ -271,4 +278,11 @@ config UNIPHIER_SERIAL
          If you have a UniPhier based board and want to use the on-chip
          serial ports, say Y to this option. If unsure, say N.
 
+config XILINX_UARTLITE
+       bool "Xilinx Uarlite support"
+       depends on DM_SERIAL && (MICROBLAZE || ARCH_ZYNQ || ARCH_ZYNQMP || 4xx)
+       help
+         If you have a Xilinx based board and want to use the uartlite
+         serial ports, say Y to this option. If unsure, say N.
+
 endmenu
index 021b211ab4047c3b9c10322bf3a0b2662c18e02f..93dad338b37597aeea3303c9b395ba1f333a6207 100644 (file)
@@ -423,11 +423,15 @@ const struct dm_serial_ops ns16550_serial_ops = {
 };
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
+/*
+ * Please consider existing compatible strings before adding a new
+ * one to keep this table compact. Or you may add a generic "ns16550"
+ * compatible string to your dts.
+ */
 static const struct udevice_id ns16550_serial_ids[] = {
        { .compatible = "ns16550" },
        { .compatible = "ns16550a" },
        { .compatible = "nvidia,tegra20-uart" },
-       { .compatible = "rockchip,rk3036-uart" },
        { .compatible = "snps,dw-apb-uart" },
        { .compatible = "ti,omap2-uart" },
        { .compatible = "ti,omap3-uart" },
index 799ef6a667d16a1d38427be6e642633848c9a9c4..fcb1e95e81002ab49244d4bf5f3482afe407cd81 100644 (file)
@@ -127,11 +127,6 @@ static void _serial_putc(const char c, const int port)
        NS16550_putc(PORT, c);
 }
 
-static void _serial_putc_raw(const char c, const int port)
-{
-       NS16550_putc(PORT, c);
-}
-
 static void _serial_puts(const char *s, const int port)
 {
        while (*s) {
@@ -164,12 +159,6 @@ serial_putc_dev(unsigned int dev_index,const char c)
        _serial_putc(c,dev_index);
 }
 
-static inline void
-serial_putc_raw_dev(unsigned int dev_index,const char c)
-{
-       _serial_putc_raw(c,dev_index);
-}
-
 static inline void
 serial_puts_dev(unsigned int dev_index,const char *s)
 {
index 988438e75471a37f2643328c910ff13b0fe753e5..a2e93039257133aa97ef101d5f2208ebb100f187 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2008-2011 Michal Simek <monstr@monstr.eu>
+ * (C) Copyright 2008 - 2015 Michal Simek <monstr@monstr.eu>
  * Clean driver and add xilinx constant from header file
  *
  * (C) Copyright 2004 Atmark Techno, Inc.
 
 #include <config.h>
 #include <common.h>
+#include <dm.h>
 #include <asm/io.h>
 #include <linux/compiler.h>
 #include <serial.h>
 
-#define SR_TX_FIFO_FULL                0x08 /* transmit FIFO full */
-#define SR_RX_FIFO_VALID_DATA  0x01 /* data in receive FIFO */
-#define SR_RX_FIFO_FULL                0x02 /* receive FIFO full */
+DECLARE_GLOBAL_DATA_PTR;
+
+#define SR_TX_FIFO_FULL                BIT(3) /* transmit FIFO full */
+#define SR_TX_FIFO_EMPTY       BIT(2) /* transmit FIFO empty */
+#define SR_RX_FIFO_VALID_DATA  BIT(0) /* data in receive FIFO */
+#define SR_RX_FIFO_FULL                BIT(1) /* receive FIFO full */
 
 #define ULITE_CONTROL_RST_TX   0x01
 #define ULITE_CONTROL_RST_RX   0x02
@@ -28,135 +32,111 @@ struct uartlite {
        unsigned int control;
 };
 
-static struct uartlite *userial_ports[4] = {
-#ifdef XILINX_UARTLITE_BASEADDR
-       [0] = (struct uartlite *)XILINX_UARTLITE_BASEADDR,
-#endif
-#ifdef XILINX_UARTLITE_BASEADDR1
-       [1] = (struct uartlite *)XILINX_UARTLITE_BASEADDR1,
-#endif
-#ifdef XILINX_UARTLITE_BASEADDR2
-       [2] = (struct uartlite *)XILINX_UARTLITE_BASEADDR2,
-#endif
-#ifdef XILINX_UARTLITE_BASEADDR3
-       [3] = (struct uartlite *)XILINX_UARTLITE_BASEADDR3
-#endif
+struct uartlite_platdata {
+       struct uartlite *regs;
 };
 
-static void uartlite_serial_putc(const char c, const int port)
+static int uartlite_serial_putc(struct udevice *dev, const char ch)
 {
-       struct uartlite *regs = userial_ports[port];
+       struct uartlite_platdata *plat = dev_get_platdata(dev);
+       struct uartlite *regs = plat->regs;
 
-       if (c == '\n')
-               uartlite_serial_putc('\r', port);
+       if (in_be32(&regs->status) & SR_TX_FIFO_FULL)
+               return -EAGAIN;
 
-       while (in_be32(&regs->status) & SR_TX_FIFO_FULL)
-               ;
-       out_be32(&regs->tx_fifo, c & 0xff);
-}
+       out_be32(&regs->tx_fifo, ch & 0xff);
 
-static void uartlite_serial_puts(const char *s, const int port)
-{
-       while (*s)
-               uartlite_serial_putc(*s++, port);
+       return 0;
 }
 
-static int uartlite_serial_getc(const int port)
+static int uartlite_serial_getc(struct udevice *dev)
 {
-       struct uartlite *regs = userial_ports[port];
+       struct uartlite_platdata *plat = dev_get_platdata(dev);
+       struct uartlite *regs = plat->regs;
+
+       if (!(in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA))
+               return -EAGAIN;
 
-       while (!(in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA))
-               ;
        return in_be32(&regs->rx_fifo) & 0xff;
 }
 
-static int uartlite_serial_tstc(const int port)
+static int uartlite_serial_pending(struct udevice *dev, bool input)
 {
-       struct uartlite *regs = userial_ports[port];
+       struct uartlite_platdata *plat = dev_get_platdata(dev);
+       struct uartlite *regs = plat->regs;
+
+       if (input)
+               return in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA;
 
-       return in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA;
+       return !(in_be32(&regs->status) & SR_TX_FIFO_EMPTY);
 }
 
-static int uartlite_serial_init(const int port)
+static int uartlite_serial_probe(struct udevice *dev)
 {
-       struct uartlite *regs = userial_ports[port];
+       struct uartlite_platdata *plat = dev_get_platdata(dev);
+       struct uartlite *regs = plat->regs;
 
-       if (regs) {
-               out_be32(&regs->control, 0);
-               out_be32(&regs->control,
-                        ULITE_CONTROL_RST_RX | ULITE_CONTROL_RST_TX);
-               in_be32(&regs->control);
-               return 0;
-       }
+       out_be32(&regs->control, 0);
+       out_be32(&regs->control, ULITE_CONTROL_RST_RX | ULITE_CONTROL_RST_TX);
+       in_be32(&regs->control);
 
-       return -1;
+       return 0;
 }
 
-/* Multi serial device functions */
-#define DECLARE_ESERIAL_FUNCTIONS(port) \
-       static int userial##port##_init(void) \
-                               { return uartlite_serial_init(port); } \
-       static void userial##port##_setbrg(void) {} \
-       static int userial##port##_getc(void) \
-                               { return uartlite_serial_getc(port); } \
-       static int userial##port##_tstc(void) \
-                               { return uartlite_serial_tstc(port); } \
-       static void userial##port##_putc(const char c) \
-                               { uartlite_serial_putc(c, port); } \
-       static void userial##port##_puts(const char *s) \
-                               { uartlite_serial_puts(s, port); }
-
-/* Serial device descriptor */
-#define INIT_ESERIAL_STRUCTURE(port, __name) { \
-       .name   = __name,                       \
-       .start  = userial##port##_init,         \
-       .stop   = NULL,                         \
-       .setbrg = userial##port##_setbrg,       \
-       .getc   = userial##port##_getc,         \
-       .tstc   = userial##port##_tstc,         \
-       .putc   = userial##port##_putc,         \
-       .puts   = userial##port##_puts,         \
+static int uartlite_serial_ofdata_to_platdata(struct udevice *dev)
+{
+       struct uartlite_platdata *plat = dev_get_platdata(dev);
+
+       plat->regs = (struct uartlite *)dev_get_addr(dev);
+
+       return 0;
 }
 
-DECLARE_ESERIAL_FUNCTIONS(0);
-struct serial_device uartlite_serial0_device =
-       INIT_ESERIAL_STRUCTURE(0, "ttyUL0");
-DECLARE_ESERIAL_FUNCTIONS(1);
-struct serial_device uartlite_serial1_device =
-       INIT_ESERIAL_STRUCTURE(1, "ttyUL1");
-DECLARE_ESERIAL_FUNCTIONS(2);
-struct serial_device uartlite_serial2_device =
-       INIT_ESERIAL_STRUCTURE(2, "ttyUL2");
-DECLARE_ESERIAL_FUNCTIONS(3);
-struct serial_device uartlite_serial3_device =
-       INIT_ESERIAL_STRUCTURE(3, "ttyUL3");
-
-__weak struct serial_device *default_serial_console(void)
+static const struct dm_serial_ops uartlite_serial_ops = {
+       .putc = uartlite_serial_putc,
+       .pending = uartlite_serial_pending,
+       .getc = uartlite_serial_getc,
+};
+
+static const struct udevice_id uartlite_serial_ids[] = {
+       { .compatible = "xlnx,opb-uartlite-1.00.b", },
+       { .compatible = "xlnx,xps-uartlite-1.00.a" },
+       { }
+};
+
+U_BOOT_DRIVER(serial_uartlite) = {
+       .name   = "serial_uartlite",
+       .id     = UCLASS_SERIAL,
+       .of_match = uartlite_serial_ids,
+       .ofdata_to_platdata = uartlite_serial_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct uartlite_platdata),
+       .probe = uartlite_serial_probe,
+       .ops    = &uartlite_serial_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
+
+#ifdef CONFIG_DEBUG_UART_UARTLITE
+
+#include <debug_uart.h>
+
+static inline void _debug_uart_init(void)
 {
-       if (userial_ports[0])
-               return &uartlite_serial0_device;
-       if (userial_ports[1])
-               return &uartlite_serial1_device;
-       if (userial_ports[2])
-               return &uartlite_serial2_device;
-       if (userial_ports[3])
-               return &uartlite_serial3_device;
-
-       return NULL;
+       struct uartlite *regs = (struct uartlite *)CONFIG_DEBUG_UART_BASE;
+
+       out_be32(&regs->control, 0);
+       out_be32(&regs->control, ULITE_CONTROL_RST_RX | ULITE_CONTROL_RST_TX);
+       in_be32(&regs->control);
 }
 
-void uartlite_serial_initialize(void)
+static inline void _debug_uart_putc(int ch)
 {
-#ifdef XILINX_UARTLITE_BASEADDR
-       serial_register(&uartlite_serial0_device);
-#endif /* XILINX_UARTLITE_BASEADDR */
-#ifdef XILINX_UARTLITE_BASEADDR1
-       serial_register(&uartlite_serial1_device);
-#endif /* XILINX_UARTLITE_BASEADDR1 */
-#ifdef XILINX_UARTLITE_BASEADDR2
-       serial_register(&uartlite_serial2_device);
-#endif /* XILINX_UARTLITE_BASEADDR2 */
-#ifdef XILINX_UARTLITE_BASEADDR3
-       serial_register(&uartlite_serial3_device);
-#endif /* XILINX_UARTLITE_BASEADDR3 */
+       struct uartlite *regs = (struct uartlite *)CONFIG_DEBUG_UART_BASE;
+
+       while (in_be32(&regs->status) & SR_TX_FIFO_FULL)
+               ;
+
+       out_be32(&regs->tx_fifo, ch & 0xff);
 }
+
+DEBUG_UART_FUNCS
+#endif
index 3430482f8d8b9e9a63c9dda792a07035d58a6401..e79d997cbab722580f2c8c2876a7f518577a1f41 100644 (file)
@@ -156,13 +156,8 @@ static int zynq_serial_pending(struct udevice *dev, bool input)
 static int zynq_serial_ofdata_to_platdata(struct udevice *dev)
 {
        struct zynq_uart_priv *priv = dev_get_priv(dev);
-       fdt_addr_t addr;
 
-       addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg");
-       if (addr == FDT_ADDR_T_NONE)
-               return -EINVAL;
-
-       priv->regs = (struct uart_zynq *)addr;
+       priv->regs = (struct uart_zynq *)dev_get_addr(dev);
 
        return 0;
 }
@@ -177,6 +172,7 @@ static const struct dm_serial_ops zynq_serial_ops = {
 static const struct udevice_id zynq_serial_ids[] = {
        { .compatible = "xlnx,xuartps" },
        { .compatible = "cdns,uart-r1p8" },
+       { .compatible = "cdns,uart-r1p12" },
        { }
 };
 
index 59eaaea69396e8082ba373558d37c84f4ab8d53d..e543b8f0cf4cbe9c27f9a7dd35e4bdde67b14027 100644 (file)
@@ -5,14 +5,14 @@
  *
  * This file is derived from the flashrom project.
  */
-
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
 #include <malloc.h>
-#include <spi.h>
+#include <pch.h>
 #include <pci.h>
 #include <pci_ids.h>
+#include <spi.h>
 #include <asm/io.h>
 
 #include "ich.h"
 #define SPI_OPCODE_WREN      0x06
 #define SPI_OPCODE_FAST_READ 0x0b
 
+#ifdef DEBUG_TRACE
+#define debug_trace(fmt, args...) debug(fmt, ##args)
+#else
+#define debug_trace(x, args...)
+#endif
+
 struct ich_spi_platdata {
-       pci_dev_t dev;          /* PCI device number */
-       int ich_version;        /* Controller version, 7 or 9 */
-       bool use_sbase;         /* Use SBASE instead of RCB */
+       enum pch_version ich_version;   /* Controller version, 7 or 9 */
 };
 
 struct ich_spi_priv {
@@ -52,7 +56,7 @@ static u8 ich_readb(struct ich_spi_priv *priv, int reg)
 {
        u8 value = readb(priv->base + reg);
 
-       debug("read %2.2x from %4.4x\n", value, reg);
+       debug_trace("read %2.2x from %4.4x\n", value, reg);
 
        return value;
 }
@@ -61,7 +65,7 @@ static u16 ich_readw(struct ich_spi_priv *priv, int reg)
 {
        u16 value = readw(priv->base + reg);
 
-       debug("read %4.4x from %4.4x\n", value, reg);
+       debug_trace("read %4.4x from %4.4x\n", value, reg);
 
        return value;
 }
@@ -70,7 +74,7 @@ static u32 ich_readl(struct ich_spi_priv *priv, int reg)
 {
        u32 value = readl(priv->base + reg);
 
-       debug("read %8.8x from %4.4x\n", value, reg);
+       debug_trace("read %8.8x from %4.4x\n", value, reg);
 
        return value;
 }
@@ -78,19 +82,19 @@ static u32 ich_readl(struct ich_spi_priv *priv, int reg)
 static void ich_writeb(struct ich_spi_priv *priv, u8 value, int reg)
 {
        writeb(value, priv->base + reg);
-       debug("wrote %2.2x to %4.4x\n", value, reg);
+       debug_trace("wrote %2.2x to %4.4x\n", value, reg);
 }
 
 static void ich_writew(struct ich_spi_priv *priv, u16 value, int reg)
 {
        writew(value, priv->base + reg);
-       debug("wrote %4.4x to %4.4x\n", value, reg);
+       debug_trace("wrote %4.4x to %4.4x\n", value, reg);
 }
 
 static void ich_writel(struct ich_spi_priv *priv, u32 value, int reg)
 {
        writel(value, priv->base + reg);
-       debug("wrote %8.8x to %4.4x\n", value, reg);
+       debug_trace("wrote %8.8x to %4.4x\n", value, reg);
 }
 
 static void write_reg(struct ich_spi_priv *priv, const void *value,
@@ -116,40 +120,16 @@ static void ich_set_bbar(struct ich_spi_priv *ctlr, uint32_t minaddr)
        ich_writel(ctlr, ichspi_bbar, ctlr->bbar);
 }
 
-/*
- * Check if this device ID matches one of supported Intel PCH devices.
- *
- * Return the ICH version if there is a match, or zero otherwise.
- */
-static int get_ich_version(uint16_t device_id)
-{
-       if (device_id == PCI_DEVICE_ID_INTEL_TGP_LPC ||
-           device_id == PCI_DEVICE_ID_INTEL_ITC_LPC ||
-           device_id == PCI_DEVICE_ID_INTEL_QRK_ILB)
-               return 7;
-
-       if ((device_id >= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN &&
-            device_id <= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX) ||
-           (device_id >= PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MIN &&
-            device_id <= PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MAX) ||
-           device_id == PCI_DEVICE_ID_INTEL_VALLEYVIEW_LPC ||
-           device_id == PCI_DEVICE_ID_INTEL_LYNXPOINT_LPC ||
-           device_id == PCI_DEVICE_ID_INTEL_WILDCATPOINT_LPC)
-               return 9;
-
-       return 0;
-}
-
 /* @return 1 if the SPI flash supports the 33MHz speed */
-static int ich9_can_do_33mhz(pci_dev_t dev)
+static int ich9_can_do_33mhz(struct udevice *dev)
 {
        u32 fdod, speed;
 
        /* Observe SPI Descriptor Component Section 0 */
-       pci_write_config_dword(dev, 0xb0, 0x1000);
+       dm_pci_write_config32(dev->parent, 0xb0, 0x1000);
 
        /* Extract the Write/Erase SPI Frequency from descriptor */
-       pci_read_config_dword(dev, 0xb4, &fdod);
+       dm_pci_read_config32(dev->parent, 0xb4, &fdod);
 
        /* Bits 23:21 have the fast read clock frequency, 0=20MHz, 1=33MHz */
        speed = (fdod >> 21) & 7;
@@ -157,59 +137,22 @@ static int ich9_can_do_33mhz(pci_dev_t dev)
        return speed == 1;
 }
 
-static int ich_find_spi_controller(struct ich_spi_platdata *ich)
-{
-       int last_bus = pci_last_busno();
-       int bus;
-
-       if (last_bus == -1) {
-               debug("No PCI busses?\n");
-               return -ENODEV;
-       }
-
-       for (bus = 0; bus <= last_bus; bus++) {
-               uint16_t vendor_id, device_id;
-               uint32_t ids;
-               pci_dev_t dev;
-
-               dev = PCI_BDF(bus, 31, 0);
-               pci_read_config_dword(dev, 0, &ids);
-               vendor_id = ids;
-               device_id = ids >> 16;
-
-               if (vendor_id == PCI_VENDOR_ID_INTEL) {
-                       ich->dev = dev;
-                       ich->ich_version = get_ich_version(device_id);
-                       if (device_id == PCI_DEVICE_ID_INTEL_VALLEYVIEW_LPC)
-                               ich->use_sbase = true;
-                       return ich->ich_version == 0 ? -ENODEV : 0;
-               }
-       }
-
-       debug("ICH SPI: No ICH found.\n");
-       return -ENODEV;
-}
-
-static int ich_init_controller(struct ich_spi_platdata *plat,
+static int ich_init_controller(struct udevice *dev,
+                              struct ich_spi_platdata *plat,
                               struct ich_spi_priv *ctlr)
 {
-       uint8_t *rcrb; /* Root Complex Register Block */
-       uint32_t rcba; /* Root Complex Base Address */
-       uint32_t sbase_addr;
-       uint8_t *sbase;
-
-       pci_read_config_dword(plat->dev, 0xf0, &rcba);
-       /* Bits 31-14 are the base address, 13-1 are reserved, 0 is enable. */
-       rcrb = (uint8_t *)(rcba & 0xffffc000);
+       ulong sbase_addr;
+       void *sbase;
 
        /* SBASE is similar */
-       pci_read_config_dword(plat->dev, 0x54, &sbase_addr);
-       sbase = (uint8_t *)(sbase_addr & 0xfffffe00);
+       pch_get_sbase(dev->parent, &sbase_addr);
+       sbase = (void *)sbase_addr;
+       debug("%s: sbase=%p\n", __func__, sbase);
 
-       if (plat->ich_version == 7) {
-               struct ich7_spi_regs *ich7_spi;
+       if (plat->ich_version == PCHV_7) {
+               struct ich7_spi_regs *ich7_spi = sbase;
 
-               ich7_spi = (struct ich7_spi_regs *)(rcrb + 0x3020);
+               ich7_spi = (struct ich7_spi_regs *)sbase;
                ctlr->ichspi_lock = readw(&ich7_spi->spis) & SPIS_LOCK;
                ctlr->opmenu = offsetof(struct ich7_spi_regs, opmenu);
                ctlr->menubytes = sizeof(ich7_spi->opmenu);
@@ -222,13 +165,9 @@ static int ich_init_controller(struct ich_spi_platdata *plat,
                ctlr->bbar = offsetof(struct ich7_spi_regs, bbar);
                ctlr->preop = offsetof(struct ich7_spi_regs, preop);
                ctlr->base = ich7_spi;
-       } else if (plat->ich_version == 9) {
-               struct ich9_spi_regs *ich9_spi;
+       } else if (plat->ich_version == PCHV_9) {
+               struct ich9_spi_regs *ich9_spi = sbase;
 
-               if (plat->use_sbase)
-                       ich9_spi = (struct ich9_spi_regs *)sbase;
-               else
-                       ich9_spi = (struct ich9_spi_regs *)(rcrb + 0x3800);
                ctlr->ichspi_lock = readw(&ich9_spi->hsfs) & HSFS_FLOCKDN;
                ctlr->opmenu = offsetof(struct ich9_spi_regs, opmenu);
                ctlr->menubytes = sizeof(ich9_spi->opmenu);
@@ -252,9 +191,9 @@ static int ich_init_controller(struct ich_spi_platdata *plat,
 
        /* Work out the maximum speed we can support */
        ctlr->max_speed = 20000000;
-       if (plat->ich_version == 9 && ich9_can_do_33mhz(plat->dev))
+       if (plat->ich_version == PCHV_9 && ich9_can_do_33mhz(dev))
                ctlr->max_speed = 33000000;
-       debug("ICH SPI: Version %d detected at %p, speed %ld\n",
+       debug("ICH SPI: Version ID %d detected at %p, speed %ld\n",
              plat->ich_version, ctlr->base, ctlr->max_speed);
 
        ich_set_bbar(ctlr, 0);
@@ -447,7 +386,7 @@ static int ich_spi_xfer(struct udevice *dev, unsigned int bitlen,
                }
                memcpy(trans->cmd, dout, bytes);
                trans->cmd_len = bytes;
-               debug("ICH SPI: Saved %d bytes\n", bytes);
+               debug_trace("ICH SPI: Saved %d bytes\n", bytes);
                return 0;
        }
 
@@ -462,7 +401,7 @@ static int ich_spi_xfer(struct udevice *dev, unsigned int bitlen,
                trans->out = trans->cmd;
                trans->bytesout = trans->cmd_len;
                using_cmd = 1;
-               debug("ICH SPI: Using %d bytes\n", trans->cmd_len);
+               debug_trace("ICH SPI: Using %d bytes\n", trans->cmd_len);
        } else {
                trans->out = dout;
                trans->bytesout = dout ? bytes : 0;
@@ -481,7 +420,7 @@ static int ich_spi_xfer(struct udevice *dev, unsigned int bitlen,
        if (ret < 0)
                return ret;
 
-       if (plat->ich_version == 7)
+       if (plat->ich_version == PCHV_7)
                ich_writew(ctlr, SPIS_CDS | SPIS_FCERR, ctlr->status);
        else
                ich_writeb(ctlr, SPIS_CDS | SPIS_FCERR, ctlr->status);
@@ -520,7 +459,7 @@ static int ich_spi_xfer(struct udevice *dev, unsigned int bitlen,
        if (using_cmd && dout && bytes) {
                trans->out = dout;
                trans->bytesout = bytes;
-               debug("ICH SPI: Moving to data, %d bytes\n", bytes);
+               debug_trace("ICH SPI: Moving to data, %d bytes\n", bytes);
        }
 
        /* Preset control fields */
@@ -676,30 +615,30 @@ int spi_write_protect_region(struct udevice *dev, uint32_t lower_limit,
        return 0;
 }
 
-static int ich_spi_probe(struct udevice *bus)
+static int ich_spi_probe(struct udevice *dev)
 {
-       struct ich_spi_platdata *plat = dev_get_platdata(bus);
-       struct ich_spi_priv *priv = dev_get_priv(bus);
+       struct ich_spi_platdata *plat = dev_get_platdata(dev);
+       struct ich_spi_priv *priv = dev_get_priv(dev);
        uint8_t bios_cntl;
        int ret;
 
-       ret = ich_init_controller(plat, priv);
+       /* Check the ICH version */
+       plat->ich_version = pch_get_version(dev->parent);
+
+       ret = ich_init_controller(dev, plat, priv);
        if (ret)
                return ret;
-       /*
-        * Disable the BIOS write protect so write commands are allowed.  On
-        * v9, deassert SMM BIOS Write Protect Disable.
-        */
-       if (plat->use_sbase) {
+       /* Disable the BIOS write protect so write commands are allowed */
+       ret = pch_set_spi_protect(dev->parent, false);
+       if (ret == -ENOSYS) {
                bios_cntl = ich_readb(priv, priv->bcr);
                bios_cntl &= ~BIT(5);   /* clear Enable InSMM_STS (EISS) */
                bios_cntl |= 1;         /* Write Protect Disable (WPD) */
                ich_writeb(priv, bios_cntl, priv->bcr);
-       } else {
-               pci_read_config_byte(plat->dev, 0xdc, &bios_cntl);
-               if (plat->ich_version == 9)
-                       bios_cntl &= ~BIT(5);
-               pci_write_config_byte(plat->dev, 0xdc, bios_cntl | 0x1);
+       } else if (ret) {
+               debug("%s: Failed to disable write-protect: err=%d\n",
+                     __func__, ret);
+               return ret;
        }
 
        priv->cur_speed = priv->max_speed;
@@ -707,18 +646,6 @@ static int ich_spi_probe(struct udevice *bus)
        return 0;
 }
 
-static int ich_spi_ofdata_to_platdata(struct udevice *bus)
-{
-       struct ich_spi_platdata *plat = dev_get_platdata(bus);
-       int ret;
-
-       ret = ich_find_spi_controller(plat);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
 static int ich_spi_set_speed(struct udevice *bus, uint speed)
 {
        struct ich_spi_priv *priv = dev_get_priv(bus);
@@ -751,7 +678,7 @@ static int ich_spi_child_pre_probe(struct udevice *dev)
         * ICH 7 SPI controller only supports array read command
         * and byte program command for SST flash
         */
-       if (plat->ich_version == 7) {
+       if (plat->ich_version == PCHV_7) {
                slave->mode_rx = SPI_RX_SLOW;
                slave->mode = SPI_TX_BYTE;
        }
@@ -779,7 +706,6 @@ U_BOOT_DRIVER(ich_spi) = {
        .id     = UCLASS_SPI,
        .of_match = ich_spi_ids,
        .ops    = &ich_spi_ops,
-       .ofdata_to_platdata = ich_spi_ofdata_to_platdata,
        .platdata_auto_alloc_size = sizeof(struct ich_spi_platdata),
        .priv_auto_alloc_size = sizeof(struct ich_spi_priv),
        .child_pre_probe = ich_spi_child_pre_probe,
index 8ff949d241f6e9c13c13432d3a54db1bdfba44f2..25ccc01d1b68bbc6fb511ec8b0bc69bb6bebc6fc 100644 (file)
@@ -18,6 +18,7 @@
 #include <malloc.h>
 #include <asm/dma-mapping.h>
 #include <usb/lin_gadget_compat.h>
+#include <linux/bug.h>
 #include <linux/list.h>
 
 #include <linux/usb/ch9.h>
index 6c9c2791a8bb7b413e61ba1b87e717670da232da..9e944a31be11f4edaccbfc857c493e3808ee3c53 100644 (file)
@@ -17,8 +17,6 @@
 #define dev_WARN(dev, format, arg...)  debug(format, ##arg)
 #define WARN_ON_ONCE(val)              debug("Error %d\n", val)
 
-#define BUILD_BUG_ON_NOT_POWER_OF_2(n)
-
 static inline size_t strlcat(char *dest, const char *src, size_t n)
 {
        strcat(dest, src);
index c92d2b02d261e4254772e7e547c2874a83150815..4c44efc7a15a3aad21de336df7420e4d6a46715a 100644 (file)
@@ -9,3 +9,4 @@ obj-$(CONFIG_USB_ETHER_ASIX) += asix.o
 obj-$(CONFIG_USB_ETHER_ASIX88179) += asix88179.o
 obj-$(CONFIG_USB_ETHER_MCS7830) += mcs7830.o
 obj-$(CONFIG_USB_ETHER_SMSC95XX) += smsc95xx.o
+obj-$(CONFIG_USB_ETHER_RTL8152) += r8152.o r8152_fw.o
diff --git a/drivers/usb/eth/r8152.c b/drivers/usb/eth/r8152.c
new file mode 100644 (file)
index 0000000..325b70c
--- /dev/null
@@ -0,0 +1,1456 @@
+/*
+ * Copyright (c) 2015 Realtek Semiconductor Corp. All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ *
+  */
+
+#include <common.h>
+#include <errno.h>
+#include <malloc.h>
+#include <usb.h>
+#include <usb/lin_gadget_compat.h>
+#include <linux/mii.h>
+#include <linux/bitops.h>
+#include "usb_ether.h"
+#include "r8152.h"
+
+/* local vars */
+static int curr_eth_dev; /* index for name of next device detected */
+
+struct r8152_dongle {
+       unsigned short vendor;
+       unsigned short product;
+};
+
+struct r8152_version {
+       unsigned short tcr;
+       unsigned short version;
+       bool           gmii;
+};
+
+static const struct r8152_dongle const r8152_dongles[] = {
+       /* Realtek */
+       { 0x0bda, 0x8050 },
+       { 0x0bda, 0x8152 },
+       { 0x0bda, 0x8153 },
+
+       /* Samsung */
+       { 0x04e8, 0xa101 },
+
+       /* Lenovo */
+       { 0x17ef, 0x304f },
+       { 0x17ef, 0x3052 },
+       { 0x17ef, 0x3054 },
+       { 0x17ef, 0x3057 },
+       { 0x17ef, 0x7205 },
+       { 0x17ef, 0x720a },
+       { 0x17ef, 0x720b },
+       { 0x17ef, 0x720c },
+
+       /* TP-LINK */
+       { 0x2357, 0x0601 },
+
+       /* Nvidia */
+       { 0x0955, 0x09ff },
+};
+
+static const struct r8152_version const r8152_versions[] = {
+       { 0x4c00, RTL_VER_01, 0 },
+       { 0x4c10, RTL_VER_02, 0 },
+       { 0x5c00, RTL_VER_03, 1 },
+       { 0x5c10, RTL_VER_04, 1 },
+       { 0x5c20, RTL_VER_05, 1 },
+       { 0x5c30, RTL_VER_06, 1 },
+       { 0x4800, RTL_VER_07, 0 },
+};
+
+static
+int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
+{
+       return usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0),
+                              RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
+                              value, index, data, size, 500);
+}
+
+static
+int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
+{
+       return usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0),
+                              RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
+                              value, index, data, size, 500);
+}
+
+int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
+                    void *data, u16 type)
+{
+       u16 burst_size = 64;
+       int ret;
+       int txsize;
+
+       /* both size and index must be 4 bytes align */
+       if ((size & 3) || !size || (index & 3) || !data)
+               return -EINVAL;
+
+       if (index + size > 0xffff)
+               return -EINVAL;
+
+       while (size) {
+               txsize = min(size, burst_size);
+               ret = get_registers(tp, index, type, txsize, data);
+               if (ret < 0)
+                       break;
+
+               index += txsize;
+               data += txsize;
+               size -= txsize;
+       }
+
+       return ret;
+}
+
+int generic_ocp_write(struct r8152 *tp, u16 index, u16 byteen,
+                     u16 size, void *data, u16 type)
+{
+       int ret;
+       u16 byteen_start, byteen_end, byte_en_to_hw;
+       u16 burst_size = 512;
+       int txsize;
+
+       /* both size and index must be 4 bytes align */
+       if ((size & 3) || !size || (index & 3) || !data)
+               return -EINVAL;
+
+       if (index + size > 0xffff)
+               return -EINVAL;
+
+       byteen_start = byteen & BYTE_EN_START_MASK;
+       byteen_end = byteen & BYTE_EN_END_MASK;
+
+       byte_en_to_hw = byteen_start | (byteen_start << 4);
+       ret = set_registers(tp, index, type | byte_en_to_hw, 4, data);
+       if (ret < 0)
+               return ret;
+
+       index += 4;
+       data += 4;
+       size -= 4;
+
+       if (size) {
+               size -= 4;
+
+               while (size) {
+                       txsize = min(size, burst_size);
+
+                       ret = set_registers(tp, index,
+                                           type | BYTE_EN_DWORD,
+                                           txsize, data);
+                       if (ret < 0)
+                               return ret;
+
+                       index += txsize;
+                       data += txsize;
+                       size -= txsize;
+               }
+
+               byte_en_to_hw = byteen_end | (byteen_end >> 4);
+               ret = set_registers(tp, index, type | byte_en_to_hw, 4, data);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return ret;
+}
+
+int pla_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data)
+{
+       return generic_ocp_read(tp, index, size, data, MCU_TYPE_PLA);
+}
+
+int pla_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
+{
+       return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_PLA);
+}
+
+int usb_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data)
+{
+       return generic_ocp_read(tp, index, size, data, MCU_TYPE_USB);
+}
+
+int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
+{
+       return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_USB);
+}
+
+u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index)
+{
+       __le32 data;
+
+       generic_ocp_read(tp, index, sizeof(data), &data, type);
+
+       return __le32_to_cpu(data);
+}
+
+void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data)
+{
+       __le32 tmp = __cpu_to_le32(data);
+
+       generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type);
+}
+
+u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
+{
+       u32 data;
+       __le32 tmp;
+       u8 shift = index & 2;
+
+       index &= ~3;
+
+       generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
+
+       data = __le32_to_cpu(tmp);
+       data >>= (shift * 8);
+       data &= 0xffff;
+
+       return data;
+}
+
+void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
+{
+       u32 mask = 0xffff;
+       __le32 tmp;
+       u16 byen = BYTE_EN_WORD;
+       u8 shift = index & 2;
+
+       data &= mask;
+
+       if (index & 2) {
+               byen <<= shift;
+               mask <<= (shift * 8);
+               data <<= (shift * 8);
+               index &= ~3;
+       }
+
+       tmp = __cpu_to_le32(data);
+
+       generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
+}
+
+u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
+{
+       u32 data;
+       __le32 tmp;
+       u8 shift = index & 3;
+
+       index &= ~3;
+
+       generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
+
+       data = __le32_to_cpu(tmp);
+       data >>= (shift * 8);
+       data &= 0xff;
+
+       return data;
+}
+
+void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
+{
+       u32 mask = 0xff;
+       __le32 tmp;
+       u16 byen = BYTE_EN_BYTE;
+       u8 shift = index & 3;
+
+       data &= mask;
+
+       if (index & 3) {
+               byen <<= shift;
+               mask <<= (shift * 8);
+               data <<= (shift * 8);
+               index &= ~3;
+       }
+
+       tmp = __cpu_to_le32(data);
+
+       generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
+}
+
+u16 ocp_reg_read(struct r8152 *tp, u16 addr)
+{
+       u16 ocp_base, ocp_index;
+
+       ocp_base = addr & 0xf000;
+       if (ocp_base != tp->ocp_base) {
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base);
+               tp->ocp_base = ocp_base;
+       }
+
+       ocp_index = (addr & 0x0fff) | 0xb000;
+       return ocp_read_word(tp, MCU_TYPE_PLA, ocp_index);
+}
+
+void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
+{
+       u16 ocp_base, ocp_index;
+
+       ocp_base = addr & 0xf000;
+       if (ocp_base != tp->ocp_base) {
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base);
+               tp->ocp_base = ocp_base;
+       }
+
+       ocp_index = (addr & 0x0fff) | 0xb000;
+       ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data);
+}
+
+static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value)
+{
+       ocp_reg_write(tp, OCP_BASE_MII + reg_addr * 2, value);
+}
+
+static int r8152_mdio_read(struct r8152 *tp, u32 reg_addr)
+{
+       return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2);
+}
+
+void sram_write(struct r8152 *tp, u16 addr, u16 data)
+{
+       ocp_reg_write(tp, OCP_SRAM_ADDR, addr);
+       ocp_reg_write(tp, OCP_SRAM_DATA, data);
+}
+
+int r8152_wait_for_bit(struct r8152 *tp, bool ocp_reg, u16 type, u16 index,
+                      const u32 mask, bool set, unsigned int timeout)
+{
+       u32 val;
+
+       while (--timeout) {
+               if (ocp_reg)
+                       val = ocp_reg_read(tp, index);
+               else
+                       val = ocp_read_dword(tp, type, index);
+
+               if (!set)
+                       val = ~val;
+
+               if ((val & mask) == mask)
+                       return 0;
+
+               mdelay(1);
+       }
+
+       debug("%s: Timeout (index=%04x mask=%08x timeout=%d)\n",
+             __func__, index, mask, timeout);
+
+       return -ETIMEDOUT;
+}
+
+static void r8152b_reset_packet_filter(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_FMC);
+       ocp_data &= ~FMC_FCR_MCU_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data);
+       ocp_data |= FMC_FCR_MCU_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data);
+}
+
+static void rtl8152_wait_fifo_empty(struct r8152 *tp)
+{
+       int ret;
+
+       ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
+                                PLA_PHY_PWR_TXEMP, 1, R8152_WAIT_TIMEOUT);
+       if (ret)
+               debug("Timeout waiting for FIFO empty\n");
+
+       ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_TCR0,
+                                TCR0_TX_EMPTY, 1, R8152_WAIT_TIMEOUT);
+       if (ret)
+               debug("Timeout waiting for TX empty\n");
+}
+
+static void rtl8152_nic_reset(struct r8152 *tp)
+{
+       int ret;
+       u32 ocp_data;
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, BIST_CTRL);
+       ocp_data |= BIST_CTRL_SW_RESET;
+       ocp_write_dword(tp, MCU_TYPE_PLA, BIST_CTRL, ocp_data);
+
+       ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, BIST_CTRL,
+                                BIST_CTRL_SW_RESET, 0, R8152_WAIT_TIMEOUT);
+       if (ret)
+               debug("Timeout waiting for NIC reset\n");
+}
+
+static u8 rtl8152_get_speed(struct r8152 *tp)
+{
+       return ocp_read_byte(tp, MCU_TYPE_PLA, PLA_PHYSTATUS);
+}
+
+static void rtl_set_eee_plus(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR);
+       ocp_data &= ~EEEP_CR_EEEP_TX;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR, ocp_data);
+}
+
+static void rxdy_gated_en(struct r8152 *tp, bool enable)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MISC_1);
+       if (enable)
+               ocp_data |= RXDY_GATED_EN;
+       else
+               ocp_data &= ~RXDY_GATED_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
+}
+
+static void rtl8152_set_rx_mode(struct r8152 *tp)
+{
+       u32 ocp_data;
+       __le32 tmp[2];
+
+       tmp[0] = 0xffffffff;
+       tmp[1] = 0xffffffff;
+
+       pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(tmp), tmp);
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data |= RCR_APM | RCR_AM | RCR_AB;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+}
+
+static int rtl_enable(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       r8152b_reset_packet_filter(tp);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR);
+       ocp_data |= PLA_CR_RE | PLA_CR_TE;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data);
+
+       rxdy_gated_en(tp, false);
+
+       rtl8152_set_rx_mode(tp);
+
+       return 0;
+}
+
+static int rtl8152_enable(struct r8152 *tp)
+{
+       rtl_set_eee_plus(tp);
+
+       return rtl_enable(tp);
+}
+
+static void r8153_set_rx_early_timeout(struct r8152 *tp)
+{
+       u32 ocp_data = tp->coalesce / 8;
+
+       ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT, ocp_data);
+}
+
+static void r8153_set_rx_early_size(struct r8152 *tp)
+{
+       u32 ocp_data = (RTL8152_AGG_BUF_SZ - RTL8153_RMS) / 4;
+
+       ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
+}
+
+static int rtl8153_enable(struct r8152 *tp)
+{
+       rtl_set_eee_plus(tp);
+       r8153_set_rx_early_timeout(tp);
+       r8153_set_rx_early_size(tp);
+
+       return rtl_enable(tp);
+}
+
+static void rtl_disable(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data &= ~RCR_ACPT_ALL;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+
+       rxdy_gated_en(tp, true);
+
+       rtl8152_wait_fifo_empty(tp);
+       rtl8152_nic_reset(tp);
+}
+
+static void r8152_power_cut_en(struct r8152 *tp, bool enable)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_UPS_CTRL);
+       if (enable)
+               ocp_data |= POWER_CUT;
+       else
+               ocp_data &= ~POWER_CUT;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_UPS_CTRL, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS);
+       ocp_data &= ~RESUME_INDICATE;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data);
+}
+
+static void rtl_rx_vlan_en(struct r8152 *tp, bool enable)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
+       if (enable)
+               ocp_data |= CPCR_RX_VLAN;
+       else
+               ocp_data &= ~CPCR_RX_VLAN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
+}
+
+static void r8153_u1u2en(struct r8152 *tp, bool enable)
+{
+       u8 u1u2[8];
+
+       if (enable)
+               memset(u1u2, 0xff, sizeof(u1u2));
+       else
+               memset(u1u2, 0x00, sizeof(u1u2));
+
+       usb_ocp_write(tp, USB_TOLERANCE, BYTE_EN_SIX_BYTES, sizeof(u1u2), u1u2);
+}
+
+static void r8153_u2p3en(struct r8152 *tp, bool enable)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL);
+       if (enable && tp->version != RTL_VER_03 && tp->version != RTL_VER_04)
+               ocp_data |= U2P3_ENABLE;
+       else
+               ocp_data &= ~U2P3_ENABLE;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data);
+}
+
+static void r8153_power_cut_en(struct r8152 *tp, bool enable)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_POWER_CUT);
+       if (enable)
+               ocp_data |= PWR_EN | PHASE2_EN;
+       else
+               ocp_data &= ~(PWR_EN | PHASE2_EN);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
+       ocp_data &= ~PCUT_STATUS;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
+}
+
+static int r8152_read_mac(struct r8152 *tp, unsigned char *macaddr)
+{
+       int ret;
+       unsigned char enetaddr[8] = {0};
+
+       ret = pla_ocp_read(tp, PLA_IDR, 8, enetaddr);
+       if (ret < 0)
+               return ret;
+
+       memcpy(macaddr, enetaddr, ETH_ALEN);
+       return 0;
+}
+
+static void r8152b_disable_aldps(struct r8152 *tp)
+{
+       ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPDNPS | LINKENA | DIS_SDSAVE);
+       mdelay(20);
+}
+
+static void r8152b_enable_aldps(struct r8152 *tp)
+{
+       ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPWRSAVE | ENPDNPS |
+               LINKENA | DIS_SDSAVE);
+}
+
+static void rtl8152_disable(struct r8152 *tp)
+{
+       r8152b_disable_aldps(tp);
+       rtl_disable(tp);
+       r8152b_enable_aldps(tp);
+}
+
+static void r8152b_hw_phy_cfg(struct r8152 *tp)
+{
+       u16 data;
+
+       data = r8152_mdio_read(tp, MII_BMCR);
+       if (data & BMCR_PDOWN) {
+               data &= ~BMCR_PDOWN;
+               r8152_mdio_write(tp, MII_BMCR, data);
+       }
+
+       r8152b_firmware(tp);
+}
+
+static void rtl8152_reinit_ll(struct r8152 *tp)
+{
+       u32 ocp_data;
+       int ret;
+
+       ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
+                                PLA_PHY_PWR_LLR, 1, R8152_WAIT_TIMEOUT);
+       if (ret)
+               debug("Timeout waiting for link list ready\n");
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
+       ocp_data |= RE_INIT_LL;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
+
+       ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
+                                PLA_PHY_PWR_LLR, 1, R8152_WAIT_TIMEOUT);
+       if (ret)
+               debug("Timeout waiting for link list ready\n");
+}
+
+static void r8152b_exit_oob(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data &= ~RCR_ACPT_ALL;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+
+       rxdy_gated_en(tp, true);
+       r8152b_hw_phy_cfg(tp);
+
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data &= ~NOW_IS_OOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
+       ocp_data &= ~MCU_BORW_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
+
+       rtl8152_reinit_ll(tp);
+       rtl8152_nic_reset(tp);
+
+       /* rx share fifo credit full threshold */
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
+
+       if (tp->udev->speed == USB_SPEED_FULL ||
+           tp->udev->speed == USB_SPEED_LOW) {
+               /* rx share fifo credit near full threshold */
+               ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
+                               RXFIFO_THR2_FULL);
+               ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2,
+                               RXFIFO_THR3_FULL);
+       } else {
+               /* rx share fifo credit near full threshold */
+               ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
+                               RXFIFO_THR2_HIGH);
+               ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2,
+                               RXFIFO_THR3_HIGH);
+       }
+
+       /* TX share fifo free credit full threshold */
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL);
+
+       ocp_write_byte(tp, MCU_TYPE_USB, USB_TX_AGG, TX_AGG_MAX_THRESHOLD);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_HIGH);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_TX_DMA,
+                       TEST_MODE_DISABLE | TX_SIZE_ADJUST1);
+
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
+       ocp_data |= TCR0_AUTO_FIFO;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data);
+}
+
+static void r8152b_enter_oob(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data &= ~NOW_IS_OOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_OOB);
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_OOB);
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_OOB);
+
+       rtl_disable(tp);
+
+       rtl8152_reinit_ll(tp);
+
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
+
+       rtl_rx_vlan_en(tp, false);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
+       ocp_data |= ALDPS_PROXY_MODE;
+       ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       rxdy_gated_en(tp, false);
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data |= RCR_APM | RCR_AM | RCR_AB;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+}
+
+static void r8153_hw_phy_cfg(struct r8152 *tp)
+{
+       u32 ocp_data;
+       u16 data;
+
+       if (tp->version == RTL_VER_03 || tp->version == RTL_VER_04 ||
+           tp->version == RTL_VER_05)
+               ocp_reg_write(tp, OCP_ADC_CFG, CKADSEL_L | ADC_EN | EN_EMI_L);
+
+       data = r8152_mdio_read(tp, MII_BMCR);
+       if (data & BMCR_PDOWN) {
+               data &= ~BMCR_PDOWN;
+               r8152_mdio_write(tp, MII_BMCR, data);
+       }
+
+       r8153_firmware(tp);
+
+       if (tp->version == RTL_VER_03) {
+               data = ocp_reg_read(tp, OCP_EEE_CFG);
+               data &= ~CTAP_SHORT_EN;
+               ocp_reg_write(tp, OCP_EEE_CFG, data);
+       }
+
+       data = ocp_reg_read(tp, OCP_POWER_CFG);
+       data |= EEE_CLKDIV_EN;
+       ocp_reg_write(tp, OCP_POWER_CFG, data);
+
+       data = ocp_reg_read(tp, OCP_DOWN_SPEED);
+       data |= EN_10M_BGOFF;
+       ocp_reg_write(tp, OCP_DOWN_SPEED, data);
+       data = ocp_reg_read(tp, OCP_POWER_CFG);
+       data |= EN_10M_PLLOFF;
+       ocp_reg_write(tp, OCP_POWER_CFG, data);
+       sram_write(tp, SRAM_IMPEDANCE, 0x0b13);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
+       ocp_data |= PFM_PWM_SWITCH;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
+
+       /* Enable LPF corner auto tune */
+       sram_write(tp, SRAM_LPF_CFG, 0xf70f);
+
+       /* Adjust 10M Amplitude */
+       sram_write(tp, SRAM_10M_AMP1, 0x00af);
+       sram_write(tp, SRAM_10M_AMP2, 0x0208);
+}
+
+static void r8153_first_init(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       rxdy_gated_en(tp, true);
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data &= ~RCR_ACPT_ALL;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+
+       r8153_hw_phy_cfg(tp);
+
+       rtl8152_nic_reset(tp);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data &= ~NOW_IS_OOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
+       ocp_data &= ~MCU_BORW_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
+
+       rtl8152_reinit_ll(tp);
+
+       rtl_rx_vlan_en(tp, false);
+
+       ocp_data = RTL8153_RMS;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
+       ocp_data |= TCR0_AUTO_FIFO;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data);
+
+       rtl8152_nic_reset(tp);
+
+       /* rx share fifo credit full threshold */
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_NORMAL);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_NORMAL);
+       /* TX share fifo free credit full threshold */
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL2);
+
+       /* rx aggregation */
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
+
+       ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
+}
+
+static void r8153_enter_oob(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data &= ~NOW_IS_OOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       rtl_disable(tp);
+
+       rtl8152_reinit_ll(tp);
+
+       ocp_data = RTL8153_RMS;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
+       ocp_data &= ~TEREDO_WAKE_MASK;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, ocp_data);
+
+       rtl_rx_vlan_en(tp, false);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
+       ocp_data |= ALDPS_PROXY_MODE;
+       ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
+       ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
+
+       rxdy_gated_en(tp, false);
+
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
+       ocp_data |= RCR_APM | RCR_AM | RCR_AB;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
+}
+
+static void r8153_disable_aldps(struct r8152 *tp)
+{
+       u16 data;
+
+       data = ocp_reg_read(tp, OCP_POWER_CFG);
+       data &= ~EN_ALDPS;
+       ocp_reg_write(tp, OCP_POWER_CFG, data);
+       mdelay(20);
+}
+
+static void rtl8153_disable(struct r8152 *tp)
+{
+       r8153_disable_aldps(tp);
+       rtl_disable(tp);
+}
+
+static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
+{
+       u16 bmcr, anar, gbcr;
+
+       anar = r8152_mdio_read(tp, MII_ADVERTISE);
+       anar &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
+                 ADVERTISE_100HALF | ADVERTISE_100FULL);
+       if (tp->supports_gmii) {
+               gbcr = r8152_mdio_read(tp, MII_CTRL1000);
+               gbcr &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
+       } else {
+               gbcr = 0;
+       }
+
+       if (autoneg == AUTONEG_DISABLE) {
+               if (speed == SPEED_10) {
+                       bmcr = 0;
+                       anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
+               } else if (speed == SPEED_100) {
+                       bmcr = BMCR_SPEED100;
+                       anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
+               } else if (speed == SPEED_1000 && tp->supports_gmii) {
+                       bmcr = BMCR_SPEED1000;
+                       gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
+               } else {
+                       return -EINVAL;
+               }
+
+               if (duplex == DUPLEX_FULL)
+                       bmcr |= BMCR_FULLDPLX;
+       } else {
+               if (speed == SPEED_10) {
+                       if (duplex == DUPLEX_FULL)
+                               anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
+                       else
+                               anar |= ADVERTISE_10HALF;
+               } else if (speed == SPEED_100) {
+                       if (duplex == DUPLEX_FULL) {
+                               anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
+                               anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
+                       } else {
+                               anar |= ADVERTISE_10HALF;
+                               anar |= ADVERTISE_100HALF;
+                       }
+               } else if (speed == SPEED_1000 && tp->supports_gmii) {
+                       if (duplex == DUPLEX_FULL) {
+                               anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
+                               anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
+                               gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
+                       } else {
+                               anar |= ADVERTISE_10HALF;
+                               anar |= ADVERTISE_100HALF;
+                               gbcr |= ADVERTISE_1000HALF;
+                       }
+               } else {
+                       return -EINVAL;
+               }
+
+               bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
+       }
+
+       if (tp->supports_gmii)
+               r8152_mdio_write(tp, MII_CTRL1000, gbcr);
+
+       r8152_mdio_write(tp, MII_ADVERTISE, anar);
+       r8152_mdio_write(tp, MII_BMCR, bmcr);
+
+       return 0;
+}
+
+static void rtl8152_up(struct r8152 *tp)
+{
+       r8152b_disable_aldps(tp);
+       r8152b_exit_oob(tp);
+       r8152b_enable_aldps(tp);
+}
+
+static void rtl8152_down(struct r8152 *tp)
+{
+       r8152_power_cut_en(tp, false);
+       r8152b_disable_aldps(tp);
+       r8152b_enter_oob(tp);
+       r8152b_enable_aldps(tp);
+}
+
+static void rtl8153_up(struct r8152 *tp)
+{
+       r8153_u1u2en(tp, false);
+       r8153_disable_aldps(tp);
+       r8153_first_init(tp);
+       r8153_u2p3en(tp, false);
+}
+
+static void rtl8153_down(struct r8152 *tp)
+{
+       r8153_u1u2en(tp, false);
+       r8153_u2p3en(tp, false);
+       r8153_power_cut_en(tp, false);
+       r8153_disable_aldps(tp);
+       r8153_enter_oob(tp);
+}
+
+static void r8152b_get_version(struct r8152 *tp)
+{
+       u32 ocp_data;
+       u16 tcr;
+       int i;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR1);
+       tcr = (u16)(ocp_data & VERSION_MASK);
+
+       for (i = 0; i < ARRAY_SIZE(r8152_versions); i++) {
+               if (tcr == r8152_versions[i].tcr) {
+                       /* Found a supported version */
+                       tp->version = r8152_versions[i].version;
+                       tp->supports_gmii = r8152_versions[i].gmii;
+                       break;
+               }
+       }
+
+       if (tp->version == RTL_VER_UNKNOWN)
+               debug("r8152 Unknown tcr version 0x%04x\n", tcr);
+}
+
+static void r8152b_enable_fc(struct r8152 *tp)
+{
+       u16 anar;
+       anar = r8152_mdio_read(tp, MII_ADVERTISE);
+       anar |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+       r8152_mdio_write(tp, MII_ADVERTISE, anar);
+}
+
+static void rtl_tally_reset(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY);
+       ocp_data |= TALLY_RESET;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
+}
+
+static void r8152b_init(struct r8152 *tp)
+{
+       u32 ocp_data;
+
+       r8152b_disable_aldps(tp);
+
+       if (tp->version == RTL_VER_01) {
+               ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
+               ocp_data &= ~LED_MODE_MASK;
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
+       }
+
+       r8152_power_cut_en(tp, false);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
+       ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
+       ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL);
+       ocp_data &= ~MCU_CLK_RATIO_MASK;
+       ocp_data |= MCU_CLK_RATIO | D3_CLK_GATED_EN;
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ocp_data);
+       ocp_data = GPHY_STS_MSK | SPEED_DOWN_MSK |
+                  SPDWN_RXDV_MSK | SPDWN_LINKCHG_MSK;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_GPHY_INTR_IMR, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_TIMER);
+       ocp_data |= BIT(15);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_USB_TIMER, ocp_data);
+       ocp_write_word(tp, MCU_TYPE_USB, 0xcbfc, 0x03e8);
+       ocp_data &= ~BIT(15);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_USB_TIMER, ocp_data);
+
+       r8152b_enable_fc(tp);
+       rtl_tally_reset(tp);
+
+       /* enable rx aggregation */
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
+
+       ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
+}
+
+static void r8153_init(struct r8152 *tp)
+{
+       int i;
+       u32 ocp_data;
+
+       r8153_disable_aldps(tp);
+       r8153_u1u2en(tp, false);
+
+       r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_BOOT_CTRL,
+                          AUTOLOAD_DONE, 1, R8152_WAIT_TIMEOUT);
+
+       for (i = 0; i < R8152_WAIT_TIMEOUT; i++) {
+               ocp_data = ocp_reg_read(tp, OCP_PHY_STATUS) & PHY_STAT_MASK;
+               if (ocp_data == PHY_STAT_LAN_ON || ocp_data == PHY_STAT_PWRDN)
+                       break;
+
+               mdelay(1);
+       }
+
+       r8153_u2p3en(tp, false);
+
+       if (tp->version == RTL_VER_04) {
+               ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2);
+               ocp_data &= ~pwd_dn_scale_mask;
+               ocp_data |= pwd_dn_scale(96);
+               ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2, ocp_data);
+
+               ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
+               ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
+               ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
+       } else if (tp->version == RTL_VER_05) {
+               ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0);
+               ocp_data &= ~ECM_ALDPS;
+               ocp_write_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0, ocp_data);
+
+               ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
+               if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
+                       ocp_data &= ~DYNAMIC_BURST;
+               else
+                       ocp_data |= DYNAMIC_BURST;
+               ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
+       } else if (tp->version == RTL_VER_06) {
+               ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
+               if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
+                       ocp_data &= ~DYNAMIC_BURST;
+               else
+                       ocp_data |= DYNAMIC_BURST;
+               ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
+       }
+
+       ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2);
+       ocp_data |= EP4_FULL_FC;
+       ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL);
+       ocp_data &= ~TIMER11_EN;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
+       ocp_data &= ~LED_MODE_MASK;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
+
+       ocp_data = FIFO_EMPTY_1FB | ROK_EXIT_LPM;
+       if (tp->version == RTL_VER_04 && tp->udev->speed != USB_SPEED_SUPER)
+               ocp_data |= LPM_TIMER_500MS;
+       else
+               ocp_data |= LPM_TIMER_500US;
+       ocp_write_byte(tp, MCU_TYPE_USB, USB_LPM_CTRL, ocp_data);
+
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2);
+       ocp_data &= ~SEN_VAL_MASK;
+       ocp_data |= SEN_VAL_NORMAL | SEL_RXIDLE;
+       ocp_write_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2, ocp_data);
+
+       ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
+
+       r8153_power_cut_en(tp, false);
+
+       r8152b_enable_fc(tp);
+       rtl_tally_reset(tp);
+}
+
+static void rtl8152_unload(struct r8152 *tp)
+{
+       if (tp->version != RTL_VER_01)
+               r8152_power_cut_en(tp, true);
+}
+
+static void rtl8153_unload(struct r8152 *tp)
+{
+       r8153_power_cut_en(tp, false);
+}
+
+static int rtl_ops_init(struct r8152 *tp)
+{
+       struct rtl_ops *ops = &tp->rtl_ops;
+       int ret = 0;
+
+       switch (tp->version) {
+       case RTL_VER_01:
+       case RTL_VER_02:
+       case RTL_VER_07:
+               ops->init               = r8152b_init;
+               ops->enable             = rtl8152_enable;
+               ops->disable            = rtl8152_disable;
+               ops->up                 = rtl8152_up;
+               ops->down               = rtl8152_down;
+               ops->unload             = rtl8152_unload;
+               break;
+
+       case RTL_VER_03:
+       case RTL_VER_04:
+       case RTL_VER_05:
+       case RTL_VER_06:
+               ops->init               = r8153_init;
+               ops->enable             = rtl8153_enable;
+               ops->disable            = rtl8153_disable;
+               ops->up                 = rtl8153_up;
+               ops->down               = rtl8153_down;
+               ops->unload             = rtl8153_unload;
+               break;
+
+       default:
+               ret = -ENODEV;
+               printf("r8152 Unknown Device\n");
+               break;
+       }
+
+       return ret;
+}
+
+static int r8152_init(struct eth_device *eth, bd_t *bd)
+{
+       struct ueth_data *dev = (struct ueth_data *)eth->priv;
+       struct r8152 *tp = (struct r8152 *)dev->dev_priv;
+
+       u8 speed;
+       int timeout = 0;
+       int link_detected;
+
+       debug("** %s()\n", __func__);
+
+       do {
+               speed = rtl8152_get_speed(tp);
+
+               link_detected = speed & LINK_STATUS;
+               if (!link_detected) {
+                       if (timeout == 0)
+                               printf("Waiting for Ethernet connection... ");
+                       mdelay(TIMEOUT_RESOLUTION);
+                       timeout += TIMEOUT_RESOLUTION;
+               }
+       } while (!link_detected && timeout < PHY_CONNECT_TIMEOUT);
+       if (link_detected) {
+               tp->rtl_ops.enable(tp);
+
+               if (timeout != 0)
+                       printf("done.\n");
+       } else {
+               printf("unable to connect.\n");
+       }
+
+       return 0;
+}
+
+static int r8152_send(struct eth_device *eth, void *packet, int length)
+{
+       struct ueth_data *dev = (struct ueth_data *)eth->priv;
+
+       u32 opts1, opts2 = 0;
+
+       int err;
+
+       int actual_len;
+       unsigned char msg[PKTSIZE + sizeof(struct tx_desc)];
+       struct tx_desc *tx_desc = (struct tx_desc *)msg;
+
+       debug("** %s(), len %d\n", __func__, length);
+
+       opts1 = length | TX_FS | TX_LS;
+
+       tx_desc->opts2 = cpu_to_le32(opts2);
+       tx_desc->opts1 = cpu_to_le32(opts1);
+
+       memcpy(msg + sizeof(struct tx_desc), (void *)packet, length);
+
+       err = usb_bulk_msg(dev->pusb_dev,
+                               usb_sndbulkpipe(dev->pusb_dev, dev->ep_out),
+                               (void *)msg,
+                               length + sizeof(struct tx_desc),
+                               &actual_len,
+                               USB_BULK_SEND_TIMEOUT);
+       debug("Tx: len = %zu, actual = %u, err = %d\n",
+             length + sizeof(struct tx_desc), actual_len, err);
+
+       return err;
+}
+
+static int r8152_recv(struct eth_device *eth)
+{
+       struct ueth_data *dev = (struct ueth_data *)eth->priv;
+
+       static unsigned char  recv_buf[RTL8152_AGG_BUF_SZ];
+       unsigned char *pkt_ptr;
+       int err;
+       int actual_len;
+       u16 packet_len;
+
+       u32 bytes_process = 0;
+       struct rx_desc *rx_desc;
+
+       debug("** %s()\n", __func__);
+
+       err = usb_bulk_msg(dev->pusb_dev,
+                               usb_rcvbulkpipe(dev->pusb_dev, dev->ep_in),
+                               (void *)recv_buf,
+                               RTL8152_AGG_BUF_SZ,
+                               &actual_len,
+                               USB_BULK_RECV_TIMEOUT);
+       debug("Rx: len = %u, actual = %u, err = %d\n", RTL8152_AGG_BUF_SZ,
+             actual_len, err);
+       if (err != 0) {
+               debug("Rx: failed to receive\n");
+               return -1;
+       }
+       if (actual_len > RTL8152_AGG_BUF_SZ) {
+               debug("Rx: received too many bytes %d\n", actual_len);
+               return -1;
+       }
+
+       while (bytes_process < actual_len) {
+               rx_desc = (struct rx_desc *)(recv_buf + bytes_process);
+               pkt_ptr = recv_buf + sizeof(struct rx_desc) + bytes_process;
+
+               packet_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
+               packet_len -= CRC_SIZE;
+
+               net_process_received_packet(pkt_ptr, packet_len);
+
+               bytes_process +=
+                       (packet_len + sizeof(struct rx_desc) + CRC_SIZE);
+
+               if (bytes_process % 8)
+                       bytes_process = bytes_process + 8 - (bytes_process % 8);
+       }
+
+       return 0;
+}
+
+static void r8152_halt(struct eth_device *eth)
+{
+       struct ueth_data *dev = (struct ueth_data *)eth->priv;
+       struct r8152 *tp = (struct r8152 *)dev->dev_priv;
+
+       debug("** %s()\n", __func__);
+
+       tp->rtl_ops.disable(tp);
+}
+
+static int r8152_write_hwaddr(struct eth_device *eth)
+{
+       struct ueth_data *dev = (struct ueth_data *)eth->priv;
+       struct r8152 *tp = (struct r8152 *)dev->dev_priv;
+
+       unsigned char enetaddr[8] = {0};
+
+       memcpy(enetaddr, eth->enetaddr, ETH_ALEN);
+
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
+       pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, enetaddr);
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
+
+       debug("MAC %pM\n", eth->enetaddr);
+       return 0;
+}
+
+void r8152_eth_before_probe(void)
+{
+       curr_eth_dev = 0;
+}
+
+/* Probe to see if a new device is actually an realtek device */
+int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
+                     struct ueth_data *ss)
+{
+       struct usb_interface *iface;
+       struct usb_interface_descriptor *iface_desc;
+       int ep_in_found = 0, ep_out_found = 0;
+       int i;
+
+       struct r8152 *tp;
+
+       /* let's examine the device now */
+       iface = &dev->config.if_desc[ifnum];
+       iface_desc = &dev->config.if_desc[ifnum].desc;
+
+       for (i = 0; i < ARRAY_SIZE(r8152_dongles); i++) {
+               if (dev->descriptor.idVendor == r8152_dongles[i].vendor &&
+                   dev->descriptor.idProduct == r8152_dongles[i].product)
+                       /* Found a supported dongle */
+                       break;
+       }
+
+       if (i == ARRAY_SIZE(r8152_dongles))
+               return 0;
+
+       memset(ss, 0, sizeof(struct ueth_data));
+
+       /* At this point, we know we've got a live one */
+       debug("\n\nUSB Ethernet device detected: %#04x:%#04x\n",
+             dev->descriptor.idVendor, dev->descriptor.idProduct);
+
+       /* Initialize the ueth_data structure with some useful info */
+       ss->ifnum = ifnum;
+       ss->pusb_dev = dev;
+       ss->subclass = iface_desc->bInterfaceSubClass;
+       ss->protocol = iface_desc->bInterfaceProtocol;
+
+       /* alloc driver private */
+       ss->dev_priv = calloc(1, sizeof(struct r8152));
+
+       if (!ss->dev_priv)
+               return 0;
+
+       /*
+        * We are expecting a minimum of 3 endpoints - in, out (bulk), and
+        * int. We will ignore any others.
+        */
+       for (i = 0; i < iface_desc->bNumEndpoints; i++) {
+               /* is it an BULK endpoint? */
+               if ((iface->ep_desc[i].bmAttributes &
+                    USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
+                       u8 ep_addr = iface->ep_desc[i].bEndpointAddress;
+                       if ((ep_addr & USB_DIR_IN) && !ep_in_found) {
+                               ss->ep_in = ep_addr &
+                                       USB_ENDPOINT_NUMBER_MASK;
+                               ep_in_found = 1;
+                       } else {
+                               if (!ep_out_found) {
+                                       ss->ep_out = ep_addr &
+                                               USB_ENDPOINT_NUMBER_MASK;
+                                       ep_out_found = 1;
+                               }
+                       }
+               }
+
+               /* is it an interrupt endpoint? */
+               if ((iface->ep_desc[i].bmAttributes &
+                   USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
+                       ss->ep_int = iface->ep_desc[i].bEndpointAddress &
+                               USB_ENDPOINT_NUMBER_MASK;
+                       ss->irqinterval = iface->ep_desc[i].bInterval;
+               }
+       }
+
+       debug("Endpoints In %d Out %d Int %d\n",
+             ss->ep_in, ss->ep_out, ss->ep_int);
+
+       /* Do some basic sanity checks, and bail if we find a problem */
+       if (usb_set_interface(dev, iface_desc->bInterfaceNumber, 0) ||
+           !ss->ep_in || !ss->ep_out || !ss->ep_int) {
+               debug("Problems with device\n");
+               return 0;
+       }
+
+       dev->privptr = (void *)ss;
+
+       tp = ss->dev_priv;
+       tp->udev = dev;
+       tp->intf = iface;
+
+       r8152b_get_version(tp);
+
+       if (rtl_ops_init(tp))
+               return 0;
+
+       tp->rtl_ops.init(tp);
+       tp->rtl_ops.up(tp);
+
+       rtl8152_set_speed(tp, AUTONEG_ENABLE,
+                         tp->supports_gmii ? SPEED_1000 : SPEED_100,
+                         DUPLEX_FULL);
+
+       return 1;
+}
+
+int r8152_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
+                               struct eth_device *eth)
+{
+       if (!eth) {
+               debug("%s: missing parameter.\n", __func__);
+               return 0;
+       }
+
+       sprintf(eth->name, "%s#%d", R8152_BASE_NAME, curr_eth_dev++);
+       eth->init = r8152_init;
+       eth->send = r8152_send;
+       eth->recv = r8152_recv;
+       eth->halt = r8152_halt;
+       eth->write_hwaddr = r8152_write_hwaddr;
+       eth->priv = ss;
+
+       /* Get the MAC address */
+       if (r8152_read_mac(ss->dev_priv, eth->enetaddr) < 0)
+               return 0;
+
+       debug("MAC %pM\n", eth->enetaddr);
+       return 1;
+}
diff --git a/drivers/usb/eth/r8152.h b/drivers/usb/eth/r8152.h
new file mode 100644 (file)
index 0000000..cd44da2
--- /dev/null
@@ -0,0 +1,631 @@
+/*
+ * Copyright (c) 2015 Realtek Semiconductor Corp. All rights reserved.
+ *
+ * SPDX-License-Identifier:     GPL-2.0
+ *
+  */
+
+#ifndef _RTL8152_ETH_H
+#define _RTL8152_ETH_H
+
+#define R8152_BASE_NAME                "r8152"
+
+#define PLA_IDR                        0xc000
+#define PLA_RCR                        0xc010
+#define PLA_RMS                        0xc016
+#define PLA_RXFIFO_CTRL0       0xc0a0
+#define PLA_RXFIFO_CTRL1       0xc0a4
+#define PLA_RXFIFO_CTRL2       0xc0a8
+#define PLA_DMY_REG0           0xc0b0
+#define PLA_FMC                        0xc0b4
+#define PLA_CFG_WOL            0xc0b6
+#define PLA_TEREDO_CFG         0xc0bc
+#define PLA_MAR                        0xcd00
+#define PLA_BACKUP             0xd000
+#define PAL_BDC_CR             0xd1a0
+#define PLA_TEREDO_TIMER       0xd2cc
+#define PLA_REALWOW_TIMER      0xd2e8
+#define PLA_LEDSEL             0xdd90
+#define PLA_LED_FEATURE                0xdd92
+#define PLA_PHYAR              0xde00
+#define PLA_BOOT_CTRL          0xe004
+#define PLA_GPHY_INTR_IMR      0xe022
+#define PLA_EEE_CR             0xe040
+#define PLA_EEEP_CR            0xe080
+#define PLA_MAC_PWR_CTRL       0xe0c0
+#define PLA_MAC_PWR_CTRL2      0xe0ca
+#define PLA_MAC_PWR_CTRL3      0xe0cc
+#define PLA_MAC_PWR_CTRL4      0xe0ce
+#define PLA_WDT6_CTRL          0xe428
+#define PLA_TCR0               0xe610
+#define PLA_TCR1               0xe612
+#define PLA_MTPS               0xe615
+#define PLA_TXFIFO_CTRL                0xe618
+#define PLA_RSTTALLY           0xe800
+#define BIST_CTRL              0xe810
+#define PLA_CR                 0xe813
+#define PLA_CRWECR             0xe81c
+#define PLA_CONFIG12           0xe81e  /* CONFIG1, CONFIG2 */
+#define PLA_CONFIG34           0xe820  /* CONFIG3, CONFIG4 */
+#define PLA_CONFIG5            0xe822
+#define PLA_PHY_PWR            0xe84c
+#define PLA_OOB_CTRL           0xe84f
+#define PLA_CPCR               0xe854
+#define PLA_MISC_0             0xe858
+#define PLA_MISC_1             0xe85a
+#define PLA_OCP_GPHY_BASE      0xe86c
+#define PLA_TALLYCNT           0xe890
+#define PLA_SFF_STS_7          0xe8de
+#define PLA_PHYSTATUS          0xe908
+#define PLA_BP_BA              0xfc26
+#define PLA_BP_0               0xfc28
+#define PLA_BP_1               0xfc2a
+#define PLA_BP_2               0xfc2c
+#define PLA_BP_3               0xfc2e
+#define PLA_BP_4               0xfc30
+#define PLA_BP_5               0xfc32
+#define PLA_BP_6               0xfc34
+#define PLA_BP_7               0xfc36
+#define PLA_BP_EN              0xfc38
+
+#define USB_USB2PHY            0xb41e
+#define USB_SSPHYLINK2         0xb428
+#define USB_U2P3_CTRL          0xb460
+#define USB_CSR_DUMMY1         0xb464
+#define USB_CSR_DUMMY2         0xb466
+#define USB_DEV_STAT           0xb808
+#define USB_CONNECT_TIMER      0xcbf8
+#define USB_BURST_SIZE         0xcfc0
+#define USB_USB_CTRL           0xd406
+#define USB_PHY_CTRL           0xd408
+#define USB_TX_AGG             0xd40a
+#define USB_RX_BUF_TH          0xd40c
+#define USB_USB_TIMER          0xd428
+#define USB_RX_EARLY_TIMEOUT   0xd42c
+#define USB_RX_EARLY_SIZE      0xd42e
+#define USB_PM_CTRL_STATUS     0xd432
+#define USB_TX_DMA             0xd434
+#define USB_TOLERANCE          0xd490
+#define USB_LPM_CTRL           0xd41a
+#define USB_UPS_CTRL           0xd800
+#define USB_MISC_0             0xd81a
+#define USB_POWER_CUT          0xd80a
+#define USB_AFE_CTRL2          0xd824
+#define USB_WDT11_CTRL         0xe43c
+#define USB_BP_BA              0xfc26
+#define USB_BP_0               0xfc28
+#define USB_BP_1               0xfc2a
+#define USB_BP_2               0xfc2c
+#define USB_BP_3               0xfc2e
+#define USB_BP_4               0xfc30
+#define USB_BP_5               0xfc32
+#define USB_BP_6               0xfc34
+#define USB_BP_7               0xfc36
+#define USB_BP_EN              0xfc38
+
+/* OCP Registers */
+#define OCP_ALDPS_CONFIG       0x2010
+#define OCP_EEE_CONFIG1                0x2080
+#define OCP_EEE_CONFIG2                0x2092
+#define OCP_EEE_CONFIG3                0x2094
+#define OCP_BASE_MII           0xa400
+#define OCP_EEE_AR             0xa41a
+#define OCP_EEE_DATA           0xa41c
+#define OCP_PHY_STATUS         0xa420
+#define OCP_POWER_CFG          0xa430
+#define OCP_EEE_CFG            0xa432
+#define OCP_SRAM_ADDR          0xa436
+#define OCP_SRAM_DATA          0xa438
+#define OCP_DOWN_SPEED         0xa442
+#define OCP_EEE_ABLE           0xa5c4
+#define OCP_EEE_ADV            0xa5d0
+#define OCP_EEE_LPABLE         0xa5d2
+#define OCP_PHY_STATE          0xa708          /* nway state for 8153 */
+#define OCP_ADC_CFG            0xbc06
+
+/* SRAM Register */
+#define SRAM_LPF_CFG           0x8012
+#define SRAM_10M_AMP1          0x8080
+#define SRAM_10M_AMP2          0x8082
+#define SRAM_IMPEDANCE         0x8084
+
+/* PLA_RCR */
+#define RCR_AAP                        0x00000001
+#define RCR_APM                        0x00000002
+#define RCR_AM                 0x00000004
+#define RCR_AB                 0x00000008
+#define RCR_ACPT_ALL           (RCR_AAP | RCR_APM | RCR_AM | RCR_AB)
+
+/* PLA_RXFIFO_CTRL0 */
+#define RXFIFO_THR1_NORMAL     0x00080002
+#define RXFIFO_THR1_OOB                0x01800003
+
+/* PLA_RXFIFO_CTRL1 */
+#define RXFIFO_THR2_FULL       0x00000060
+#define RXFIFO_THR2_HIGH       0x00000038
+#define RXFIFO_THR2_OOB                0x0000004a
+#define RXFIFO_THR2_NORMAL     0x00a0
+
+/* PLA_RXFIFO_CTRL2 */
+#define RXFIFO_THR3_FULL       0x00000078
+#define RXFIFO_THR3_HIGH       0x00000048
+#define RXFIFO_THR3_OOB                0x0000005a
+#define RXFIFO_THR3_NORMAL     0x0110
+
+/* PLA_TXFIFO_CTRL */
+#define TXFIFO_THR_NORMAL      0x00400008
+#define TXFIFO_THR_NORMAL2     0x01000008
+
+/* PLA_DMY_REG0 */
+#define ECM_ALDPS              0x0002
+
+/* PLA_FMC */
+#define FMC_FCR_MCU_EN         0x0001
+
+/* PLA_EEEP_CR */
+#define EEEP_CR_EEEP_TX                0x0002
+
+/* PLA_WDT6_CTRL */
+#define WDT6_SET_MODE          0x0010
+
+/* PLA_TCR0 */
+#define TCR0_TX_EMPTY          0x0800
+#define TCR0_AUTO_FIFO         0x0080
+
+/* PLA_TCR1 */
+#define VERSION_MASK           0x7cf0
+
+/* PLA_MTPS */
+#define MTPS_JUMBO             (12 * 1024 / 64)
+#define MTPS_DEFAULT           (6 * 1024 / 64)
+
+/* PLA_RSTTALLY */
+#define TALLY_RESET            0x0001
+
+/* PLA_CR */
+#define PLA_CR_RST             0x10
+#define PLA_CR_RE              0x08
+#define PLA_CR_TE              0x04
+
+/* PLA_BIST_CTRL */
+#define BIST_CTRL_SW_RESET (0x10 << 24)
+
+/* PLA_CRWECR */
+#define CRWECR_NORAML          0x00
+#define CRWECR_CONFIG          0xc0
+
+/* PLA_OOB_CTRL */
+#define NOW_IS_OOB             0x80
+#define TXFIFO_EMPTY           0x20
+#define RXFIFO_EMPTY           0x10
+#define LINK_LIST_READY                0x02
+#define DIS_MCU_CLROOB         0x01
+#define FIFO_EMPTY             (TXFIFO_EMPTY | RXFIFO_EMPTY)
+
+/* PLA_PHY_PWR */
+#define PLA_PHY_PWR_LLR        (LINK_LIST_READY << 24)
+#define PLA_PHY_PWR_TXEMP      (TXFIFO_EMPTY << 24)
+
+/* PLA_MISC_1 */
+#define RXDY_GATED_EN          0x0008
+
+/* PLA_SFF_STS_7 */
+#define RE_INIT_LL             0x8000
+#define MCU_BORW_EN            0x4000
+
+/* PLA_CPCR */
+#define CPCR_RX_VLAN           0x0040
+
+/* PLA_CFG_WOL */
+#define MAGIC_EN               0x0001
+
+/* PLA_TEREDO_CFG */
+#define TEREDO_SEL             0x8000
+#define TEREDO_WAKE_MASK       0x7f00
+#define TEREDO_RS_EVENT_MASK   0x00fe
+#define OOB_TEREDO_EN          0x0001
+
+/* PAL_BDC_CR */
+#define ALDPS_PROXY_MODE       0x0001
+
+/* PLA_CONFIG34 */
+#define LINK_ON_WAKE_EN                0x0010
+#define LINK_OFF_WAKE_EN       0x0008
+
+/* PLA_CONFIG5 */
+#define BWF_EN                 0x0040
+#define MWF_EN                 0x0020
+#define UWF_EN                 0x0010
+#define LAN_WAKE_EN            0x0002
+
+/* PLA_LED_FEATURE */
+#define LED_MODE_MASK          0x0700
+
+/* PLA_PHY_PWR */
+#define TX_10M_IDLE_EN         0x0080
+#define PFM_PWM_SWITCH         0x0040
+
+/* PLA_MAC_PWR_CTRL */
+#define D3_CLK_GATED_EN                0x00004000
+#define MCU_CLK_RATIO          0x07010f07
+#define MCU_CLK_RATIO_MASK     0x0f0f0f0f
+#define ALDPS_SPDWN_RATIO      0x0f87
+
+/* PLA_MAC_PWR_CTRL2 */
+#define EEE_SPDWN_RATIO                0x8007
+
+/* PLA_MAC_PWR_CTRL3 */
+#define PKT_AVAIL_SPDWN_EN     0x0100
+#define SUSPEND_SPDWN_EN       0x0004
+#define U1U2_SPDWN_EN          0x0002
+#define L1_SPDWN_EN            0x0001
+
+/* PLA_MAC_PWR_CTRL4 */
+#define PWRSAVE_SPDWN_EN       0x1000
+#define RXDV_SPDWN_EN          0x0800
+#define TX10MIDLE_EN           0x0100
+#define TP100_SPDWN_EN         0x0020
+#define TP500_SPDWN_EN         0x0010
+#define TP1000_SPDWN_EN                0x0008
+#define EEE_SPDWN_EN           0x0001
+
+/* PLA_GPHY_INTR_IMR */
+#define GPHY_STS_MSK           0x0001
+#define SPEED_DOWN_MSK         0x0002
+#define SPDWN_RXDV_MSK         0x0004
+#define SPDWN_LINKCHG_MSK      0x0008
+
+/* PLA_PHYAR */
+#define PHYAR_FLAG             0x80000000
+
+/* PLA_EEE_CR */
+#define EEE_RX_EN              0x0001
+#define EEE_TX_EN              0x0002
+
+/* PLA_BOOT_CTRL */
+#define AUTOLOAD_DONE          0x0002
+
+/* USB_USB2PHY */
+#define USB2PHY_SUSPEND                0x0001
+#define USB2PHY_L1             0x0002
+
+/* USB_SSPHYLINK2 */
+#define pwd_dn_scale_mask      0x3ffe
+#define pwd_dn_scale(x)                ((x) << 1)
+
+/* USB_CSR_DUMMY1 */
+#define DYNAMIC_BURST          0x0001
+
+/* USB_CSR_DUMMY2 */
+#define EP4_FULL_FC            0x0001
+
+/* USB_DEV_STAT */
+#define STAT_SPEED_MASK                0x0006
+#define STAT_SPEED_HIGH                0x0000
+#define STAT_SPEED_FULL                0x0002
+
+/* USB_TX_AGG */
+#define TX_AGG_MAX_THRESHOLD   0x03
+
+/* USB_RX_BUF_TH */
+#define RX_THR_SUPPER          0x0c350180
+#define RX_THR_HIGH            0x7a120180
+#define RX_THR_SLOW            0xffff0180
+
+/* USB_TX_DMA */
+#define TEST_MODE_DISABLE      0x00000001
+#define TX_SIZE_ADJUST1                0x00000100
+
+/* USB_UPS_CTRL */
+#define POWER_CUT              0x0100
+
+/* USB_PM_CTRL_STATUS */
+#define RESUME_INDICATE                0x0001
+
+/* USB_USB_CTRL */
+#define RX_AGG_DISABLE         0x0010
+#define RX_ZERO_EN             0x0080
+
+/* USB_U2P3_CTRL */
+#define U2P3_ENABLE            0x0001
+
+/* USB_POWER_CUT */
+#define PWR_EN                 0x0001
+#define PHASE2_EN              0x0008
+
+/* USB_MISC_0 */
+#define PCUT_STATUS            0x0001
+
+/* USB_RX_EARLY_TIMEOUT */
+#define COALESCE_SUPER          85000U
+#define COALESCE_HIGH          250000U
+#define COALESCE_SLOW          524280U
+
+/* USB_WDT11_CTRL */
+#define TIMER11_EN             0x0001
+
+/* USB_LPM_CTRL */
+/* bit 4 ~ 5: fifo empty boundary */
+#define FIFO_EMPTY_1FB         0x30    /* 0x1fb * 64 = 32448 bytes */
+/* bit 2 ~ 3: LMP timer */
+#define LPM_TIMER_MASK         0x0c
+#define LPM_TIMER_500MS                0x04    /* 500 ms */
+#define LPM_TIMER_500US                0x0c    /* 500 us */
+#define ROK_EXIT_LPM           0x02
+
+/* USB_AFE_CTRL2 */
+#define SEN_VAL_MASK           0xf800
+#define SEN_VAL_NORMAL         0xa000
+#define SEL_RXIDLE             0x0100
+
+/* OCP_ALDPS_CONFIG */
+#define ENPWRSAVE              0x8000
+#define ENPDNPS                        0x0200
+#define LINKENA                        0x0100
+#define DIS_SDSAVE             0x0010
+
+/* OCP_PHY_STATUS */
+#define PHY_STAT_MASK          0x0007
+#define PHY_STAT_LAN_ON                3
+#define PHY_STAT_PWRDN         5
+
+/* OCP_POWER_CFG */
+#define EEE_CLKDIV_EN          0x8000
+#define EN_ALDPS               0x0004
+#define EN_10M_PLLOFF          0x0001
+
+/* OCP_EEE_CONFIG1 */
+#define RG_TXLPI_MSK_HFDUP     0x8000
+#define RG_MATCLR_EN           0x4000
+#define EEE_10_CAP             0x2000
+#define EEE_NWAY_EN            0x1000
+#define TX_QUIET_EN            0x0200
+#define RX_QUIET_EN            0x0100
+#define sd_rise_time_mask      0x0070
+#define sd_rise_time(x)                (min((x), 7) << 4)      /* bit 4 ~ 6 */
+#define RG_RXLPI_MSK_HFDUP     0x0008
+#define SDFALLTIME             0x0007  /* bit 0 ~ 2 */
+
+/* OCP_EEE_CONFIG2 */
+#define RG_LPIHYS_NUM          0x7000  /* bit 12 ~ 15 */
+#define RG_DACQUIET_EN         0x0400
+#define RG_LDVQUIET_EN         0x0200
+#define RG_CKRSEL              0x0020
+#define RG_EEEPRG_EN           0x0010
+
+/* OCP_EEE_CONFIG3 */
+#define fast_snr_mask          0xff80
+#define fast_snr(x)            (min((x), 0x1ff) << 7)  /* bit 7 ~ 15 */
+#define RG_LFS_SEL             0x0060  /* bit 6 ~ 5 */
+#define MSK_PH                 0x0006  /* bit 0 ~ 3 */
+
+/* OCP_EEE_AR */
+/* bit[15:14] function */
+#define FUN_ADDR               0x0000
+#define FUN_DATA               0x4000
+/* bit[4:0] device addr */
+
+/* OCP_EEE_CFG */
+#define CTAP_SHORT_EN          0x0040
+#define EEE10_EN               0x0010
+
+/* OCP_DOWN_SPEED */
+#define EN_10M_BGOFF           0x0080
+
+/* OCP_PHY_STATE */
+#define TXDIS_STATE            0x01
+#define ABD_STATE              0x02
+
+/* OCP_ADC_CFG */
+#define CKADSEL_L              0x0100
+#define ADC_EN                 0x0080
+#define EN_EMI_L               0x0040
+
+/* SRAM_LPF_CFG */
+#define LPF_AUTO_TUNE          0x8000
+
+/* SRAM_10M_AMP1 */
+#define GDAC_IB_UPALL          0x0008
+
+/* SRAM_10M_AMP2 */
+#define AMP_DN                 0x0200
+
+/* SRAM_IMPEDANCE */
+#define RX_DRIVING_MASK                0x6000
+
+#define RTL8152_MAX_TX         4
+#define RTL8152_MAX_RX         10
+#define INTBUFSIZE             2
+#define CRC_SIZE               4
+#define TX_ALIGN               4
+#define RX_ALIGN               8
+
+#define INTR_LINK              0x0004
+
+#define RTL8152_REQT_READ      0xc0
+#define RTL8152_REQT_WRITE     0x40
+#define RTL8152_REQ_GET_REGS   0x05
+#define RTL8152_REQ_SET_REGS   0x05
+
+#define BYTE_EN_DWORD          0xff
+#define BYTE_EN_WORD           0x33
+#define BYTE_EN_BYTE           0x11
+#define BYTE_EN_SIX_BYTES      0x3f
+#define BYTE_EN_START_MASK     0x0f
+#define BYTE_EN_END_MASK       0xf0
+
+#define RTL8152_ETH_FRAME_LEN  1514
+#define RTL8152_AGG_BUF_SZ     2048
+
+#define RTL8152_RMS            (RTL8152_ETH_FRAME_LEN + CRC_SIZE)
+#define RTL8153_RMS            (RTL8152_ETH_FRAME_LEN + CRC_SIZE)
+#define RTL8152_TX_TIMEOUT     (5 * HZ)
+
+#define MCU_TYPE_PLA                   0x0100
+#define MCU_TYPE_USB                   0x0000
+
+/* The forced speed, 10Mb, 100Mb, gigabit. */
+#define SPEED_10                10
+#define SPEED_100               100
+#define SPEED_1000              1000
+
+#define SPEED_UNKNOWN           -1
+
+/* Duplex, half or full. */
+#define DUPLEX_HALF             0x00
+#define DUPLEX_FULL             0x01
+#define DUPLEX_UNKNOWN          0xff
+
+/* Enable or disable autonegotiation. */
+#define AUTONEG_DISABLE         0x00
+#define AUTONEG_ENABLE          0x01
+
+/* Generic MII registers. */
+#define MII_BMCR                0x00    /* Basic mode control register */
+#define MII_BMSR                0x01    /* Basic mode status register  */
+#define MII_PHYSID1             0x02    /* PHYS ID 1                   */
+#define MII_PHYSID2             0x03    /* PHYS ID 2                   */
+#define MII_ADVERTISE           0x04    /* Advertisement control reg   */
+#define MII_LPA                 0x05    /* Link partner ability reg    */
+#define MII_EXPANSION           0x06    /* Expansion register          */
+#define MII_CTRL1000            0x09    /* 1000BASE-T control          */
+#define MII_STAT1000            0x0a    /* 1000BASE-T status           */
+#define MII_MMD_CTRL            0x0d    /* MMD Access Control Register */
+#define MII_MMD_DATA            0x0e    /* MMD Access Data Register */
+#define MII_ESTATUS             0x0f    /* Extended Status             */
+#define MII_DCOUNTER            0x12    /* Disconnect counter          */
+#define MII_FCSCOUNTER          0x13    /* False carrier counter       */
+#define MII_NWAYTEST            0x14    /* N-way auto-neg test reg     */
+#define MII_RERRCOUNTER         0x15    /* Receive error counter       */
+#define MII_SREVISION           0x16    /* Silicon revision            */
+#define MII_RESV1               0x17    /* Reserved...                 */
+#define MII_LBRERROR            0x18    /* Lpback, rx, bypass error    */
+#define MII_PHYADDR             0x19    /* PHY address                 */
+#define MII_RESV2               0x1a    /* Reserved...                 */
+#define MII_TPISTATUS           0x1b    /* TPI status for 10mbps       */
+#define MII_NCONFIG             0x1c    /* Network interface config    */
+
+#define TIMEOUT_RESOLUTION     50
+#define PHY_CONNECT_TIMEOUT     5000
+#define USB_BULK_SEND_TIMEOUT   5000
+#define USB_BULK_RECV_TIMEOUT   5000
+#define R8152_WAIT_TIMEOUT     2000
+
+struct rx_desc {
+       __le32 opts1;
+#define RD_CRC                         BIT(15)
+#define RX_LEN_MASK                    0x7fff
+
+       __le32 opts2;
+#define RD_UDP_CS                      BIT(23)
+#define RD_TCP_CS                      BIT(22)
+#define RD_IPV6_CS                     BIT(20)
+#define RD_IPV4_CS                     BIT(19)
+
+       __le32 opts3;
+#define IPF                            BIT(23) /* IP checksum fail */
+#define UDPF                           BIT(22) /* UDP checksum fail */
+#define TCPF                           BIT(21) /* TCP checksum fail */
+#define RX_VLAN_TAG                    BIT(16)
+
+       __le32 opts4;
+       __le32 opts5;
+       __le32 opts6;
+};
+
+struct tx_desc {
+       __le32 opts1;
+#define TX_FS                  BIT(31) /* First segment of a packet */
+#define TX_LS                  BIT(30) /* Final segment of a packet */
+#define LGSEND                 BIT(29)
+#define GTSENDV4               BIT(28)
+#define GTSENDV6               BIT(27)
+#define GTTCPHO_SHIFT          18
+#define GTTCPHO_MAX            0x7fU
+#define TX_LEN_MAX             0x3ffffU
+
+       __le32 opts2;
+#define UDP_CS                 BIT(31) /* Calculate UDP/IP checksum */
+#define TCP_CS                 BIT(30) /* Calculate TCP/IP checksum */
+#define IPV4_CS                        BIT(29) /* Calculate IPv4 checksum */
+#define IPV6_CS                        BIT(28) /* Calculate IPv6 checksum */
+#define MSS_SHIFT              17
+#define MSS_MAX                        0x7ffU
+#define TCPHO_SHIFT            17
+#define TCPHO_MAX              0x7ffU
+#define TX_VLAN_TAG            BIT(16)
+};
+
+enum rtl_version {
+       RTL_VER_UNKNOWN = 0,
+       RTL_VER_01,
+       RTL_VER_02,
+       RTL_VER_03,
+       RTL_VER_04,
+       RTL_VER_05,
+       RTL_VER_06,
+       RTL_VER_07,
+       RTL_VER_MAX
+};
+
+enum rtl_register_content {
+       _1000bps        = 0x10,
+       _100bps         = 0x08,
+       _10bps          = 0x04,
+       LINK_STATUS     = 0x02,
+       FULL_DUP        = 0x01,
+};
+
+struct r8152 {
+       struct usb_device *udev;
+       struct usb_interface *intf;
+       bool supports_gmii;
+
+       struct rtl_ops {
+               void (*init)(struct r8152 *);
+               int (*enable)(struct r8152 *);
+               void (*disable)(struct r8152 *);
+               void (*up)(struct r8152 *);
+               void (*down)(struct r8152 *);
+               void (*unload)(struct r8152 *);
+       } rtl_ops;
+
+       u32 coalesce;
+       u16 ocp_base;
+
+       u8 version;
+};
+
+int generic_ocp_write(struct r8152 *tp, u16 index, u16 byteen,
+                     u16 size, void *data, u16 type);
+int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
+                    void *data, u16 type);
+
+int pla_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data);
+int pla_ocp_write(struct r8152 *tp, u16 index, u16 byteen,
+                 u16 size, void *data);
+
+int usb_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data);
+int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen,
+                 u16 size, void *data);
+
+u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index);
+void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data);
+
+u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index);
+void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data);
+
+u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index);
+void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data);
+
+u16 ocp_reg_read(struct r8152 *tp, u16 addr);
+void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data);
+
+void sram_write(struct r8152 *tp, u16 addr, u16 data);
+
+int r8152_wait_for_bit(struct r8152 *tp, bool ocp_reg, u16 type, u16 index,
+                      const u32 mask, bool set, unsigned int timeout);
+
+void r8152b_firmware(struct r8152 *tp);
+void r8153_firmware(struct r8152 *tp);
+#endif
diff --git a/drivers/usb/eth/r8152_fw.c b/drivers/usb/eth/r8152_fw.c
new file mode 100644 (file)
index 0000000..f820b16
--- /dev/null
@@ -0,0 +1,980 @@
+/*
+ * Copyright (c) 2015 Realtek Semiconductor Corp. All rights reserved.
+ *
+ * SPDX-License-Identifier:     GPL-2.0
+ *
+  */
+#include <common.h>
+#include <errno.h>
+#include "r8152.h"
+
+static u8 r8152b_pla_patch_a[] = {
+       0x08, 0xe0, 0x40, 0xe0, 0x78, 0xe0, 0x85, 0xe0,
+       0x5d, 0xe1, 0xa1, 0xe1, 0xa3, 0xe1, 0xab, 0xe1,
+       0x31, 0xc3, 0x60, 0x72, 0xa0, 0x49, 0x10, 0xf0,
+       0xa4, 0x49, 0x0e, 0xf0, 0x2c, 0xc3, 0x62, 0x72,
+       0x26, 0x70, 0x80, 0x49, 0x05, 0xf0, 0x2f, 0x48,
+       0x62, 0x9a, 0x24, 0x70, 0x60, 0x98, 0x24, 0xc3,
+       0x60, 0x99, 0x23, 0xc3, 0x00, 0xbb, 0x2c, 0x75,
+       0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13, 0x0a, 0xf0,
+       0x03, 0x13, 0x08, 0xf0, 0x02, 0x13, 0x06, 0xf0,
+       0x01, 0x13, 0x04, 0xf0, 0x08, 0x13, 0x02, 0xf0,
+       0x03, 0xe0, 0xd4, 0x49, 0x04, 0xf1, 0x14, 0xc2,
+       0x12, 0xc3, 0x00, 0xbb, 0x12, 0xc3, 0x60, 0x75,
+       0xd0, 0x49, 0x05, 0xf1, 0x50, 0x48, 0x60, 0x9d,
+       0x09, 0xc6, 0x00, 0xbe, 0xd0, 0x48, 0x60, 0x9d,
+       0xf3, 0xe7, 0xc2, 0xc0, 0x38, 0xd2, 0xc6, 0xd2,
+       0x84, 0x17, 0xa2, 0x13, 0x0c, 0x17, 0xbc, 0xc0,
+       0xa2, 0xd1, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
+       0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
+       0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
+       0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
+       0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
+       0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
+       0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
+       0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
+       0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
+       0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
+       0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
+       0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
+       0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
+       0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
+       0x22, 0x02, 0xf0, 0xc0, 0x0b, 0xc0, 0x00, 0x71,
+       0x0a, 0xc0, 0x00, 0x72, 0xa0, 0x49, 0x04, 0xf0,
+       0xa4, 0x49, 0x02, 0xf0, 0x93, 0x48, 0x04, 0xc0,
+       0x00, 0xb8, 0x00, 0xe4, 0xc2, 0xc0, 0x8c, 0x09,
+       0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
+       0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
+       0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
+       0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
+       0x02, 0xc2, 0x00, 0xba, 0x82, 0x18, 0x00, 0xa0,
+       0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
+       0x00, 0x80, 0x00, 0x60, 0x2c, 0x75, 0xd4, 0x49,
+       0x12, 0xf1, 0x29, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
+       0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
+       0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
+       0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
+       0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
+       0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
+       0x32, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
+       0xdc, 0x21, 0xbc, 0x25, 0x27, 0xc6, 0xc0, 0x77,
+       0x04, 0x13, 0x18, 0xf0, 0x03, 0x13, 0x19, 0xf0,
+       0x02, 0x13, 0x1a, 0xf0, 0x01, 0x13, 0x1b, 0xf0,
+       0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5, 0x00, 0xbd,
+       0xcd, 0xc6, 0xc6, 0x67, 0x2e, 0x75, 0xd7, 0x22,
+       0xdd, 0x26, 0x05, 0x15, 0x1a, 0xf0, 0x14, 0xc6,
+       0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd, 0x12, 0xc5,
+       0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1, 0xef, 0xe7,
+       0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7, 0xf3, 0x49,
+       0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49, 0xf4, 0xf1,
+       0xe6, 0xe7, 0xb6, 0xc0, 0x6a, 0x14, 0xac, 0x13,
+       0xd6, 0x13, 0xfa, 0x14, 0xa0, 0xd1, 0x00, 0x00,
+       0xc0, 0x75, 0xd0, 0x49, 0x46, 0xf0, 0x26, 0x72,
+       0xa7, 0x49, 0x43, 0xf0, 0x22, 0x72, 0x25, 0x25,
+       0x20, 0x1f, 0x97, 0x30, 0x91, 0x30, 0x40, 0x73,
+       0xf3, 0xc4, 0x1c, 0x40, 0x04, 0xf0, 0xd7, 0x49,
+       0x05, 0xf1, 0x37, 0xe0, 0x53, 0x48, 0xc0, 0x9d,
+       0x08, 0x02, 0x40, 0x66, 0x64, 0x27, 0x06, 0x16,
+       0x30, 0xf1, 0x46, 0x63, 0x3b, 0x13, 0x2d, 0xf1,
+       0x34, 0x9b, 0x18, 0x1b, 0x93, 0x30, 0x2b, 0xc3,
+       0x10, 0x1c, 0x2b, 0xe8, 0x01, 0x14, 0x25, 0xf1,
+       0x00, 0x1d, 0x26, 0x1a, 0x8a, 0x30, 0x22, 0x73,
+       0xb5, 0x25, 0x0e, 0x0b, 0x00, 0x1c, 0x2c, 0xe8,
+       0x1f, 0xc7, 0x27, 0x40, 0x1a, 0xf1, 0x38, 0xe8,
+       0x32, 0x1f, 0x8f, 0x30, 0x08, 0x1b, 0x24, 0xe8,
+       0x36, 0x72, 0x46, 0x77, 0x00, 0x17, 0x0d, 0xf0,
+       0x13, 0xc3, 0x1f, 0x40, 0x03, 0xf1, 0x00, 0x1f,
+       0x46, 0x9f, 0x44, 0x77, 0x9f, 0x44, 0x5f, 0x44,
+       0x17, 0xe8, 0x0a, 0xc7, 0x27, 0x40, 0x05, 0xf1,
+       0x02, 0xc3, 0x00, 0xbb, 0x50, 0x1a, 0x06, 0x1a,
+       0xff, 0xc7, 0x00, 0xbf, 0xb8, 0xcd, 0xff, 0xff,
+       0x02, 0x0c, 0x54, 0xa5, 0xdc, 0xa5, 0x2f, 0x40,
+       0x05, 0xf1, 0x00, 0x14, 0xfa, 0xf1, 0x01, 0x1c,
+       0x02, 0xe0, 0x00, 0x1c, 0x80, 0xff, 0xb0, 0x49,
+       0x04, 0xf0, 0x01, 0x0b, 0xd3, 0xa1, 0x03, 0xe0,
+       0x02, 0x0b, 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37,
+       0x02, 0x0b, 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37,
+       0x00, 0x13, 0xfb, 0xf1, 0x80, 0xff, 0x22, 0x73,
+       0xb5, 0x25, 0x18, 0x1e, 0xde, 0x30, 0xd9, 0x30,
+       0x64, 0x72, 0x11, 0x1e, 0x68, 0x23, 0x16, 0x31,
+       0x80, 0xff, 0xd4, 0x49, 0x28, 0xf0, 0x02, 0xb4,
+       0x2a, 0xc4, 0x00, 0x1d, 0x2e, 0xe8, 0xe0, 0x73,
+       0xb9, 0x21, 0xbd, 0x25, 0x04, 0x13, 0x02, 0xf0,
+       0x1a, 0xe0, 0x22, 0xc4, 0x23, 0xc3, 0x2f, 0xe8,
+       0x23, 0xc3, 0x2d, 0xe8, 0x00, 0x1d, 0x21, 0xe8,
+       0xe2, 0x73, 0xbb, 0x49, 0xfc, 0xf0, 0xe0, 0x73,
+       0xb7, 0x48, 0x03, 0xb4, 0x81, 0x1d, 0x19, 0xe8,
+       0x40, 0x1a, 0x84, 0x1d, 0x16, 0xe8, 0x12, 0xc3,
+       0x1e, 0xe8, 0x03, 0xb0, 0x81, 0x1d, 0x11, 0xe8,
+       0x0e, 0xc3, 0x19, 0xe8, 0x02, 0xb0, 0x06, 0xc7,
+       0x04, 0x1e, 0xe0, 0x9e, 0x02, 0xc6, 0x00, 0xbe,
+       0x22, 0x02, 0x20, 0xe4, 0x04, 0xb8, 0x34, 0xb0,
+       0x00, 0x02, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0c,
+       0x09, 0xc7, 0xe0, 0x9b, 0xe2, 0x9a, 0xe4, 0x9c,
+       0xe6, 0x8d, 0xe6, 0x76, 0xef, 0x49, 0xfe, 0xf1,
+       0x80, 0xff, 0x08, 0xea, 0x82, 0x1d, 0xf5, 0xef,
+       0x00, 0x1a, 0x88, 0x1d, 0xf2, 0xef, 0xed, 0xc2,
+       0xf0, 0xef, 0x80, 0xff, 0x02, 0xc6, 0x00, 0xbe,
+       0x46, 0x06, 0x08, 0xc2, 0x40, 0x73, 0x3a, 0x48,
+       0x40, 0x9b, 0x06, 0xff, 0x02, 0xc6, 0x00, 0xbe,
+       0x86, 0x17, 0x1e, 0xfc, 0x36, 0xf0, 0x08, 0x1c,
+       0xea, 0x8c, 0xe3, 0x64, 0xc7, 0x49, 0x25, 0xf1,
+       0xe0, 0x75, 0xff, 0x1b, 0xeb, 0x47, 0xff, 0x1b,
+       0x6b, 0x47, 0xe0, 0x9d, 0x15, 0xc3, 0x60, 0x75,
+       0xd8, 0x49, 0x04, 0xf0, 0x81, 0x1d, 0xe2, 0x8d,
+       0x05, 0xe0, 0xe2, 0x63, 0x81, 0x1d, 0xdd, 0x47,
+       0xe2, 0x8b, 0x0b, 0xc3, 0x00, 0x1d, 0x61, 0x8d,
+       0x3c, 0x03, 0x60, 0x75, 0xd8, 0x49, 0x06, 0xf1,
+       0xdf, 0x48, 0x61, 0x95, 0x16, 0xe0, 0x4e, 0xe8,
+       0x12, 0xe8, 0x21, 0xc5, 0xa0, 0x73, 0xb0, 0x49,
+       0x03, 0xf0, 0x31, 0x48, 0xa0, 0x9b, 0x0d, 0xe0,
+       0xc0, 0x49, 0x0b, 0xf1, 0xe2, 0x63, 0x7e, 0x1d,
+       0xdd, 0x46, 0xe2, 0x8b, 0xe0, 0x75, 0x83, 0x1b,
+       0xeb, 0x46, 0xfe, 0x1b, 0x6b, 0x46, 0xe0, 0x9d,
+       0xe4, 0x49, 0x11, 0xf0, 0x10, 0x1d, 0xea, 0x8d,
+       0xe3, 0x64, 0xc6, 0x49, 0x09, 0xf1, 0x07, 0xc5,
+       0xa0, 0x73, 0xb1, 0x48, 0xa0, 0x9b, 0x02, 0xc5,
+       0x00, 0xbd, 0xe6, 0x04, 0xa0, 0xd1, 0x02, 0xc5,
+       0x00, 0xbd, 0xfe, 0x04, 0x02, 0xc5, 0x00, 0xbd,
+       0x30, 0x05, 0x00, 0x00 };
+
+static u16 r8152b_ram_code1[] = {
+       0x9700, 0x7fe0, 0x4c00, 0x4007, 0x4400, 0x4800, 0x7c1f, 0x4c00,
+       0x5310, 0x6000, 0x7c07, 0x6800, 0x673e, 0x0000, 0x0000, 0x571f,
+       0x5ffb, 0xaa05, 0x5b58, 0x7d80, 0x6100, 0x3019, 0x5b64, 0x7d80,
+       0x6080, 0xa6f8, 0xdcdb, 0x0015, 0xb915, 0xb511, 0xd16b, 0x000f,
+       0xb40f, 0xd06b, 0x000d, 0xb206, 0x7c01, 0x5800, 0x7c04, 0x5c00,
+       0x3011, 0x7c01, 0x5801, 0x7c04, 0x5c04, 0x3019, 0x30a5, 0x3127,
+       0x31d5, 0x7fe0, 0x4c60, 0x7c07, 0x6803, 0x7d00, 0x6900, 0x65a0,
+       0x0000, 0x0000, 0xaf03, 0x6015, 0x303e, 0x6017, 0x57e0, 0x580c,
+       0x588c, 0x7fdd, 0x5fa2, 0x4827, 0x7c1f, 0x4c00, 0x7c1f, 0x4c10,
+       0x8400, 0x7c30, 0x6020, 0x48bf, 0x7c1f, 0x4c00, 0x7c1f, 0x4c01,
+       0x7c07, 0x6803, 0xb806, 0x7c08, 0x6800, 0x0000, 0x0000, 0x305c,
+       0x7c08, 0x6808, 0x0000, 0x0000, 0xae06, 0x7c02, 0x5c02, 0x0000,
+       0x0000, 0x3067, 0x8e05, 0x7c02, 0x5c00, 0x0000, 0x0000, 0xad06,
+       0x7c20, 0x5c20, 0x0000, 0x0000, 0x3072, 0x8d05, 0x7c20, 0x5c00,
+       0x0000, 0x0000, 0xa008, 0x7c07, 0x6800, 0xb8db, 0x7c07, 0x6803,
+       0xd9b3, 0x00d7, 0x7fe0, 0x4c80, 0x7c08, 0x6800, 0x0000, 0x0000,
+       0x7c23, 0x5c23, 0x481d, 0x7c1f, 0x4c00, 0x7c1f, 0x4c02, 0x5310,
+       0x81ff, 0x30f5, 0x7fe0, 0x4d00, 0x4832, 0x7c1f, 0x4c00, 0x7c1f,
+       0x4c10, 0x7c08, 0x6000, 0xa49e, 0x7c07, 0x6800, 0xb89b, 0x7c07,
+       0x6803, 0xd9b3, 0x00f9, 0x7fe0, 0x4d20, 0x7e00, 0x6200, 0x3001,
+       0x7fe0, 0x4dc0, 0xd09d, 0x0002, 0xb4fe, 0x7fe0, 0x4d80, 0x7c04,
+       0x6004, 0x7c07, 0x6802, 0x6728, 0x0000, 0x0000, 0x7c08, 0x6000,
+       0x486c, 0x7c1f, 0x4c00, 0x7c1f, 0x4c01, 0x9503, 0x7e00, 0x6200,
+       0x571f, 0x5fbb, 0xaa05, 0x5b58, 0x7d80, 0x6100, 0x30c2, 0x5b64,
+       0x7d80, 0x6080, 0xcdab, 0x0063, 0xcd8d, 0x0061, 0xd96b, 0x005f,
+       0xd0a0, 0x00d7, 0xcba0, 0x0003, 0x80ec, 0x30cf, 0x30dc, 0x7fe0,
+       0x4ce0, 0x4832, 0x7c1f, 0x4c00, 0x7c1f, 0x4c08, 0x7c08, 0x6008,
+       0x8300, 0xb902, 0x30a5, 0x308a, 0x7fe0, 0x4da0, 0x65a8, 0x0000,
+       0x0000, 0x56a0, 0x590c, 0x7ffd, 0x5fa2, 0xae06, 0x7c02, 0x5c02,
+       0x0000, 0x0000, 0x30f0, 0x8e05, 0x7c02, 0x5c00, 0x0000, 0x0000,
+       0xcba4, 0x0004, 0xcd8d, 0x0002, 0x80f1, 0x7fe0, 0x4ca0, 0x7c08,
+       0x6408, 0x0000, 0x0000, 0x7d00, 0x6800, 0xb603, 0x7c10, 0x6010,
+       0x7d1f, 0x551f, 0x5fb3, 0xaa07, 0x7c80, 0x5800, 0x5b58, 0x7d80,
+       0x6100, 0x310f, 0x7c80, 0x5800, 0x5b64, 0x7d80, 0x6080, 0x4827,
+       0x7c1f, 0x4c00, 0x7c1f, 0x4c10, 0x8400, 0x7c10, 0x6000, 0x7fe0,
+       0x4cc0, 0x5fbb, 0x4824, 0x7c1f, 0x4c00, 0x7c1f, 0x4c04, 0x8200,
+       0x7ce0, 0x5400, 0x6728, 0x0000, 0x0000, 0x30cf, 0x3001, 0x7fe0,
+       0x4e00, 0x4007, 0x4400, 0x5310, 0x7c07, 0x6800, 0x673e, 0x0000,
+       0x0000, 0x570f, 0x5fff, 0xaa05, 0x585b, 0x7d80, 0x6100, 0x313b,
+       0x5867, 0x7d80, 0x6080, 0x9403, 0x7e00, 0x6200, 0xcda3, 0x00e7,
+       0xcd85, 0x00e5, 0xd96b, 0x00e3, 0x96e3, 0x7c07, 0x6800, 0x673e,
+       0x0000, 0x0000, 0x7fe0, 0x4e20, 0x96db, 0x8b04, 0x7c08, 0x5008,
+       0xab03, 0x7c08, 0x5000, 0x7c07, 0x6801, 0x677e, 0x0000, 0x0000,
+       0xdb7c, 0x00ec, 0x0000, 0x7fe1, 0x4f40, 0x4837, 0x4418, 0x41c7,
+       0x7fe0, 0x4e40, 0x7c40, 0x5400, 0x7c1f, 0x4c01, 0x7c1f, 0x4c01,
+       0x8fbf, 0xd2a0, 0x004b, 0x9204, 0xa042, 0x3168, 0x3127, 0x7fe1,
+       0x4f60, 0x489c, 0x4628, 0x7fe0, 0x4e60, 0x7e28, 0x4628, 0x7c40,
+       0x5400, 0x7c01, 0x5800, 0x7c04, 0x5c00, 0x41e8, 0x7c1f, 0x4c01,
+       0x7c1f, 0x4c01, 0x8fa5, 0xb241, 0xa02a, 0x3182, 0x7fe0, 0x4ea0,
+       0x7c02, 0x4402, 0x4448, 0x4894, 0x7c1f, 0x4c01, 0x7c1f, 0x4c03,
+       0x4824, 0x7c1f, 0x4c07, 0x41ef, 0x41ff, 0x4891, 0x7c1f, 0x4c07,
+       0x7c1f, 0x4c17, 0x8400, 0x8ef8, 0x41c7, 0x8f8a, 0x92d5, 0xa10f,
+       0xd480, 0x0008, 0xd580, 0x00b8, 0xa202, 0x319d, 0x7c04, 0x4404,
+       0x319d, 0xd484, 0x00f3, 0xd484, 0x00f1, 0x3127, 0x7fe0, 0x4ee0,
+       0x7c40, 0x5400, 0x4488, 0x41cf, 0x3127, 0x7fe0, 0x4ec0, 0x48f3,
+       0x7c1f, 0x4c01, 0x7c1f, 0x4c09, 0x4508, 0x41c7, 0x8fb0, 0xd218,
+       0x00ae, 0xd2a4, 0x009e, 0x31be, 0x7fe0, 0x4e80, 0x4832, 0x7c1f,
+       0x4c01, 0x7c1f, 0x4c11, 0x4428, 0x7c40, 0x5440, 0x7c01, 0x5801,
+       0x7c04, 0x5c04, 0x41e8, 0xa4b3, 0x31d3, 0x7fe0, 0x4f20, 0x7c07,
+       0x6800, 0x673e, 0x0000, 0x0000, 0x570f, 0x5fff, 0xaa04, 0x585b,
+       0x6100, 0x31e4, 0x5867, 0x6080, 0xbcf1, 0x3001 };
+
+static u16 r8152b_pla_patch_a_bp[] = {
+       0xfc26, 0x8000, 0xfc28, 0x170b, 0xfc2a, 0x01e1, 0xfc2c, 0x0989,
+       0xfc2e, 0x1349, 0xfc30, 0x01b7, 0xfc32, 0x061d, 0xe422, 0x0020,
+       0xe420, 0x0018, 0xfc34, 0x1785, 0xfc36, 0x047b };
+
+static u8 r8152b_pla_patch_a2[] = {
+       0x08, 0xe0, 0x1a, 0xe0, 0xf2, 0xe0, 0xfa, 0xe0,
+       0x32, 0xe1, 0x34, 0xe1, 0x36, 0xe1, 0x38, 0xe1,
+       0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
+       0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
+       0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
+       0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
+       0x00, 0xbb, 0xd2, 0x17, 0xbc, 0x17, 0x14, 0xc2,
+       0x40, 0x73, 0xba, 0x48, 0x40, 0x9b, 0x11, 0xc2,
+       0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0, 0xbf, 0x49,
+       0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd, 0xb1, 0x49,
+       0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b, 0x02, 0xc2,
+       0x00, 0xba, 0x4e, 0x19, 0x00, 0xa0, 0x1e, 0xfc,
+       0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8, 0x00, 0x80,
+       0x00, 0x60, 0x2c, 0x75, 0xd4, 0x49, 0x12, 0xf1,
+       0x29, 0xe0, 0xf8, 0xc2, 0x46, 0x71, 0xf7, 0xc2,
+       0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1, 0xf5, 0xc7,
+       0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30, 0x26, 0x62,
+       0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72, 0xa0, 0x49,
+       0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f, 0x97, 0x30,
+       0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75, 0x32, 0xc3,
+       0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1, 0xdc, 0x21,
+       0xbc, 0x25, 0x27, 0xc6, 0xc0, 0x77, 0x04, 0x13,
+       0x18, 0xf0, 0x03, 0x13, 0x19, 0xf0, 0x02, 0x13,
+       0x1a, 0xf0, 0x01, 0x13, 0x1b, 0xf0, 0xd4, 0x49,
+       0x03, 0xf1, 0x1c, 0xc5, 0x00, 0xbd, 0xcd, 0xc6,
+       0xc6, 0x67, 0x2e, 0x75, 0xd7, 0x22, 0xdd, 0x26,
+       0x05, 0x15, 0x1a, 0xf0, 0x14, 0xc6, 0x00, 0xbe,
+       0x13, 0xc5, 0x00, 0xbd, 0x12, 0xc5, 0x00, 0xbd,
+       0xf1, 0x49, 0xfb, 0xf1, 0xef, 0xe7, 0xf4, 0x49,
+       0xfa, 0xf1, 0xec, 0xe7, 0xf3, 0x49, 0xf7, 0xf1,
+       0xe9, 0xe7, 0xf2, 0x49, 0xf4, 0xf1, 0xe6, 0xe7,
+       0xb6, 0xc0, 0xf6, 0x14, 0x36, 0x14, 0x62, 0x14,
+       0x86, 0x15, 0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75,
+       0xd0, 0x49, 0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49,
+       0x43, 0xf0, 0x22, 0x72, 0x25, 0x25, 0x20, 0x1f,
+       0x97, 0x30, 0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4,
+       0x1c, 0x40, 0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1,
+       0x37, 0xe0, 0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02,
+       0x40, 0x66, 0x64, 0x27, 0x06, 0x16, 0x30, 0xf1,
+       0x46, 0x63, 0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b,
+       0x18, 0x1b, 0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c,
+       0x2b, 0xe8, 0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d,
+       0x26, 0x1a, 0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25,
+       0x0e, 0x0b, 0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7,
+       0x27, 0x40, 0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f,
+       0x8f, 0x30, 0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72,
+       0x46, 0x77, 0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3,
+       0x1f, 0x40, 0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f,
+       0x44, 0x77, 0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8,
+       0x0a, 0xc7, 0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3,
+       0x00, 0xbb, 0x1c, 0x1b, 0xd2, 0x1a, 0xff, 0xc7,
+       0x00, 0xbf, 0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c,
+       0x54, 0xa5, 0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1,
+       0x00, 0x14, 0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0,
+       0x00, 0x1c, 0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0,
+       0x01, 0x0b, 0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b,
+       0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37, 0x02, 0x0b,
+       0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37, 0x00, 0x13,
+       0xfb, 0xf1, 0x80, 0xff, 0x22, 0x73, 0xb5, 0x25,
+       0x18, 0x1e, 0xde, 0x30, 0xd9, 0x30, 0x64, 0x72,
+       0x11, 0x1e, 0x68, 0x23, 0x16, 0x31, 0x80, 0xff,
+       0x08, 0xc2, 0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b,
+       0x06, 0xff, 0x02, 0xc6, 0x00, 0xbe, 0x4e, 0x18,
+       0x1e, 0xfc, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
+       0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
+       0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
+       0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
+       0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
+       0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
+       0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
+       0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
+       0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
+       0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
+       0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
+       0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
+       0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
+       0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
+       0x22, 0x02, 0xf0, 0xc0, 0x02, 0xc6, 0x00, 0xbe,
+       0x00, 0x00, 0x02, 0xc6, 0x00, 0xbe, 0x00, 0x00,
+       0x02, 0xc6, 0x00, 0xbe, 0x00, 0x00, 0x02, 0xc6,
+       0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static u16 r8152b_pla_patch_a2_bp[] = {
+       0xfc28, 0x8000, 0xfc28, 0x17a5, 0xfc2a, 0x13ad,
+       0xfc2c, 0x184d, 0xfc2e, 0x01e1 };
+
+static u16 r8153_ram_code_a[] = {
+       0xE86C, 0xA000, 0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012,
+       0xB438, 0x0000, 0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c18,
+       0xB438, 0x2c45, 0xB438, 0x2c45, 0xB438, 0xd502, 0xB438, 0x8301,
+       0xB438, 0x8306, 0xB438, 0xd500, 0xB438, 0x8208, 0xB438, 0xd501,
+       0xB438, 0xe018, 0xB438, 0x0308, 0xB438, 0x60f2, 0xB438, 0x8404,
+       0xB438, 0x607d, 0xB438, 0xc117, 0xB438, 0x2c16, 0xB438, 0xc116,
+       0xB438, 0x2c16, 0xB438, 0x607d, 0xB438, 0xc117, 0xB438, 0xa404,
+       0xB438, 0xd500, 0xB438, 0x0800, 0xB438, 0xd501, 0xB438, 0x62d2,
+       0xB438, 0x615d, 0xB438, 0xc115, 0xB438, 0xa404, 0xB438, 0xc307,
+       0xB438, 0xd502, 0xB438, 0x8301, 0xB438, 0x8306, 0xB438, 0xd500,
+       0xB438, 0x8208, 0xB438, 0x2c42, 0xB438, 0xc114, 0xB438, 0x8404,
+       0xB438, 0xc317, 0xB438, 0xd701, 0xB438, 0x435d, 0xB438, 0xd500,
+       0xB438, 0xa208, 0xB438, 0xd502, 0xB438, 0xa306, 0xB438, 0xa301,
+       0xB438, 0x2c42, 0xB438, 0x8404, 0xB438, 0x613d, 0xB438, 0xc115,
+       0xB438, 0xc307, 0xB438, 0xd502, 0xB438, 0x8301, 0xB438, 0x8306,
+       0xB438, 0xd500, 0xB438, 0x8208, 0xB438, 0x2c42, 0xB438, 0xc114,
+       0xB438, 0xc317, 0xB438, 0xd701, 0xB438, 0x40dd, 0xB438, 0xd500,
+       0xB438, 0xa208, 0xB438, 0xd502, 0xB438, 0xa306, 0xB438, 0xa301,
+       0xB438, 0xd500, 0xB438, 0xd702, 0xB438, 0x0800, 0xB436, 0xA01A,
+       0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0fff, 0xB436, 0xA004,
+       0xB438, 0x0fff, 0xB436, 0xA002, 0xB438, 0x05a3, 0xB436, 0xA000,
+       0xB438, 0x3591, 0xB436, 0xB820, 0xB438, 0x0210 };
+
+static u8 r8153_usb_patch_c[] = {
+       0x08, 0xe0, 0x0a, 0xe0, 0x14, 0xe0, 0x2e, 0xe0,
+       0x37, 0xe0, 0x3e, 0xe0, 0x6d, 0xe0, 0x78, 0xe0,
+       0x02, 0xc5, 0x00, 0xbd, 0x38, 0x3b, 0xdb, 0x49,
+       0x04, 0xf1, 0x06, 0xc3, 0x00, 0xbb, 0x5a, 0x02,
+       0x05, 0xc4, 0x03, 0xc3, 0x00, 0xbb, 0xa4, 0x04,
+       0x7e, 0x02, 0x30, 0xd4, 0x30, 0x18, 0x18, 0xc1,
+       0x0c, 0xe8, 0x17, 0xc6, 0xc7, 0x65, 0xd0, 0x49,
+       0x05, 0xf0, 0x32, 0x48, 0x02, 0xc2, 0x00, 0xba,
+       0x3e, 0x16, 0x02, 0xc2, 0x00, 0xba, 0x48, 0x16,
+       0x02, 0xb4, 0x09, 0xc2, 0x40, 0x99, 0x0e, 0x48,
+       0x42, 0x98, 0x42, 0x70, 0x8e, 0x49, 0xfe, 0xf1,
+       0x02, 0xb0, 0x80, 0xff, 0xc0, 0xd4, 0xe4, 0x40,
+       0x20, 0xd4, 0xb0, 0x49, 0x04, 0xf0, 0x30, 0x18,
+       0x06, 0xc1, 0xef, 0xef, 0xfa, 0xc7, 0x02, 0xc0,
+       0x00, 0xb8, 0xd0, 0x10, 0xe4, 0x4b, 0x07, 0xc3,
+       0x70, 0x61, 0x12, 0x48, 0x70, 0x89, 0x02, 0xc3,
+       0x00, 0xbb, 0x9c, 0x15, 0x20, 0xd4, 0x2b, 0xc5,
+       0xa0, 0x77, 0x00, 0x1c, 0xa0, 0x9c, 0x28, 0xc5,
+       0xa0, 0x64, 0xc0, 0x48, 0xc1, 0x48, 0xc2, 0x48,
+       0xa0, 0x8c, 0xb1, 0x64, 0xc0, 0x48, 0xb1, 0x8c,
+       0x20, 0xc5, 0xa0, 0x64, 0x40, 0x48, 0x41, 0x48,
+       0xc2, 0x48, 0xa0, 0x8c, 0x19, 0xc5, 0xa4, 0x64,
+       0x44, 0x48, 0xa4, 0x8c, 0xb1, 0x64, 0x40, 0x48,
+       0xb1, 0x8c, 0x14, 0xc4, 0x80, 0x73, 0x13, 0xc4,
+       0x82, 0x9b, 0x11, 0x1b, 0x80, 0x9b, 0x0c, 0xc5,
+       0xa0, 0x64, 0x40, 0x48, 0x41, 0x48, 0x42, 0x48,
+       0xa0, 0x8c, 0x05, 0xc5, 0xa0, 0x9f, 0x02, 0xc5,
+       0x00, 0xbd, 0x6c, 0x3a, 0x1e, 0xfc, 0x10, 0xd8,
+       0x86, 0xd4, 0xf8, 0xcb, 0x20, 0xe4, 0x0a, 0xc0,
+       0x16, 0x61, 0x91, 0x48, 0x16, 0x89, 0x07, 0xc0,
+       0x11, 0x19, 0x0c, 0x89, 0x02, 0xc1, 0x00, 0xb9,
+       0x02, 0x06, 0x00, 0xd4, 0x40, 0xb4, 0xfe, 0xc0,
+       0x16, 0x61, 0x91, 0x48, 0x16, 0x89, 0xfb, 0xc0,
+       0x11, 0x19, 0x0c, 0x89, 0x02, 0xc1, 0x00, 0xb9,
+       0xd2, 0x05, 0x00, 0x00 };
+
+static u16 r8153_usb_patch_c_bp[] = {
+       0xfc26, 0xa000, 0xfc28, 0x3b34, 0xfc2a, 0x027c, 0xfc2c, 0x162c,
+       0xfc2e, 0x10ce, 0xfc30, 0x0000, 0xfc32, 0x3a28, 0xfc34, 0x05f8,
+       0xfc36, 0x05c8 };
+
+static u8 r8153_pla_patch_c[] = {
+       0x08, 0xe0, 0xea, 0xe0, 0xf2, 0xe0, 0x04, 0xe1,
+       0x06, 0xe1, 0x08, 0xe1, 0x40, 0xe1, 0xf1, 0xe1,
+       0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
+       0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
+       0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
+       0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
+       0x02, 0xc2, 0x00, 0xba, 0xde, 0x18, 0x00, 0xe0,
+       0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
+       0x00, 0x80, 0x00, 0x20, 0x2c, 0x75, 0xd4, 0x49,
+       0x12, 0xf1, 0x32, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
+       0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
+       0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
+       0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
+       0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
+       0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
+       0x3c, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
+       0xdc, 0x21, 0xbc, 0x25, 0x30, 0xc6, 0xc0, 0x77,
+       0x04, 0x13, 0x21, 0xf0, 0x03, 0x13, 0x22, 0xf0,
+       0x02, 0x13, 0x23, 0xf0, 0x01, 0x13, 0x24, 0xf0,
+       0x08, 0x13, 0x08, 0xf1, 0x2e, 0x73, 0xba, 0x21,
+       0xbd, 0x25, 0x05, 0x13, 0x03, 0xf1, 0x24, 0xc5,
+       0x00, 0xbd, 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5,
+       0x00, 0xbd, 0xc4, 0xc6, 0xc6, 0x67, 0x2e, 0x75,
+       0xd7, 0x22, 0xdd, 0x26, 0x05, 0x15, 0x1b, 0xf0,
+       0x14, 0xc6, 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd,
+       0x12, 0xc5, 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1,
+       0xef, 0xe7, 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7,
+       0xf3, 0x49, 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49,
+       0xf4, 0xf1, 0xe6, 0xe7, 0xb6, 0xc0, 0x50, 0x14,
+       0x90, 0x13, 0xbc, 0x13, 0xf2, 0x14, 0x00, 0xa0,
+       0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75, 0xd0, 0x49,
+       0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49, 0x43, 0xf0,
+       0x22, 0x72, 0x25, 0x25, 0x20, 0x1f, 0x97, 0x30,
+       0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4, 0x1c, 0x40,
+       0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1, 0x37, 0xe0,
+       0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02, 0x40, 0x66,
+       0x64, 0x27, 0x06, 0x16, 0x30, 0xf1, 0x46, 0x63,
+       0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b, 0x18, 0x1b,
+       0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c, 0x2b, 0xe8,
+       0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d, 0x26, 0x1a,
+       0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25, 0x0e, 0x0b,
+       0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7, 0x27, 0x40,
+       0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f, 0x8f, 0x30,
+       0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72, 0x46, 0x77,
+       0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3, 0x1f, 0x40,
+       0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f, 0x44, 0x77,
+       0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8, 0x0a, 0xc7,
+       0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3, 0x00, 0xbb,
+       0xbe, 0x1a, 0x74, 0x14, 0xff, 0xc7, 0x00, 0xbf,
+       0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c, 0x54, 0xa5,
+       0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1, 0x00, 0x14,
+       0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0, 0x00, 0x1c,
+       0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0, 0x01, 0x0b,
+       0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b, 0xd3, 0xa5,
+       0x27, 0x31, 0x20, 0x37, 0x02, 0x0b, 0xd3, 0xa5,
+       0x27, 0x31, 0x20, 0x37, 0x00, 0x13, 0xfb, 0xf1,
+       0x80, 0xff, 0x22, 0x73, 0xb5, 0x25, 0x18, 0x1e,
+       0xde, 0x30, 0xd9, 0x30, 0x64, 0x72, 0x11, 0x1e,
+       0x68, 0x23, 0x16, 0x31, 0x80, 0xff, 0x08, 0xc2,
+       0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b, 0x06, 0xff,
+       0x02, 0xc6, 0x00, 0xbe, 0xcc, 0x17, 0x1e, 0xfc,
+       0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
+       0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
+       0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
+       0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
+       0x00, 0xbb, 0x50, 0x17, 0x3a, 0x17, 0x02, 0xc6,
+       0x00, 0xbe, 0x00, 0x00, 0x02, 0xc6, 0x00, 0xbe,
+       0x00, 0x00, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
+       0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
+       0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
+       0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
+       0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
+       0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
+       0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
+       0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
+       0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
+       0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
+       0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
+       0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
+       0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
+       0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
+       0xfa, 0x01, 0xf0, 0xc0, 0x18, 0x89, 0x00, 0x1d,
+       0x43, 0xc3, 0x62, 0x62, 0xa0, 0x49, 0x06, 0xf0,
+       0x41, 0xc0, 0x02, 0x71, 0x60, 0x99, 0x3f, 0xc1,
+       0x03, 0xe0, 0x3c, 0xc0, 0x3d, 0xc1, 0x02, 0x99,
+       0x00, 0x61, 0x67, 0x11, 0x3d, 0xf1, 0x69, 0x33,
+       0x34, 0xc0, 0x28, 0x40, 0xf7, 0xf1, 0x35, 0xc0,
+       0x00, 0x19, 0x81, 0x1b, 0x89, 0xe8, 0x32, 0xc0,
+       0x04, 0x1a, 0x84, 0x1b, 0x85, 0xe8, 0x7a, 0xe8,
+       0xa3, 0x49, 0xfe, 0xf0, 0x2c, 0xc0, 0x76, 0xe8,
+       0xa1, 0x48, 0x29, 0xc0, 0x84, 0x1b, 0x7c, 0xe8,
+       0x00, 0x1d, 0x69, 0x33, 0x00, 0x1e, 0x01, 0x06,
+       0xff, 0x18, 0x30, 0x40, 0xfd, 0xf1, 0x7f, 0xc0,
+       0x00, 0x76, 0x2e, 0x40, 0xf7, 0xf1, 0x21, 0x48,
+       0x1a, 0xc0, 0x84, 0x1b, 0x6d, 0xe8, 0x76, 0xc0,
+       0x61, 0xe8, 0xa1, 0x49, 0xfd, 0xf0, 0x12, 0xc0,
+       0x00, 0x1a, 0x84, 0x1b, 0x65, 0xe8, 0x5a, 0xe8,
+       0xa5, 0x49, 0xfe, 0xf0, 0x0a, 0xc0, 0x01, 0x19,
+       0x81, 0x1b, 0x5e, 0xe8, 0x48, 0xe0, 0x8c, 0xd3,
+       0xb8, 0x0b, 0x50, 0xe8, 0x83, 0x00, 0x82, 0x00,
+       0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4, 0xfa, 0xc0,
+       0x00, 0x61, 0x9c, 0x20, 0x9c, 0x24, 0x06, 0x11,
+       0x06, 0xf1, 0x5d, 0xc0, 0x00, 0x61, 0x11, 0x48,
+       0x00, 0x89, 0x35, 0xe0, 0x00, 0x11, 0x02, 0xf1,
+       0x03, 0xe0, 0x04, 0x11, 0x06, 0xf1, 0x53, 0xc0,
+       0x00, 0x61, 0x92, 0x48, 0x00, 0x89, 0x2b, 0xe0,
+       0x05, 0x11, 0x08, 0xf1, 0x4c, 0xc0, 0x00, 0x61,
+       0x91, 0x49, 0x04, 0xf0, 0x91, 0x48, 0x00, 0x89,
+       0x11, 0xe0, 0xdc, 0xc0, 0x00, 0x61, 0x98, 0x20,
+       0x98, 0x24, 0x25, 0x11, 0x1c, 0xf1, 0x40, 0xc0,
+       0x25, 0xe8, 0x95, 0x49, 0x18, 0xf0, 0xd2, 0xc0,
+       0x00, 0x61, 0x98, 0x20, 0x98, 0x24, 0x25, 0x11,
+       0x12, 0xf1, 0x35, 0xc0, 0x00, 0x61, 0x92, 0x49,
+       0x0e, 0xf1, 0x12, 0x48, 0x00, 0x89, 0x2d, 0xc0,
+       0x00, 0x19, 0x00, 0x89, 0x2b, 0xc0, 0x01, 0x89,
+       0x27, 0xc0, 0x10, 0xe8, 0x25, 0xc0, 0x12, 0x48,
+       0x81, 0x1b, 0x16, 0xe8, 0xb9, 0xc3, 0x62, 0x62,
+       0xa0, 0x49, 0x05, 0xf0, 0xb5, 0xc3, 0x60, 0x71,
+       0xb5, 0xc0, 0x02, 0x99, 0x02, 0xc0, 0x00, 0xb8,
+       0xd6, 0x07, 0x13, 0xc4, 0x84, 0x98, 0x00, 0x1b,
+       0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1,
+       0x80, 0x71, 0x82, 0x72, 0x80, 0xff, 0x09, 0xc4,
+       0x84, 0x98, 0x80, 0x99, 0x82, 0x9a, 0x86, 0x8b,
+       0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1, 0x80, 0xff,
+       0x08, 0xea, 0x10, 0xd4, 0x88, 0xd3, 0x30, 0xd4,
+       0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3, 0x00, 0xd8,
+       0x02, 0xc0, 0x00, 0xb8, 0xe0, 0x08, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static u16 r8153_pla_patch_c_bp[] = {
+       0xfc26, 0x8000, 0xfc28, 0x1306, 0xfc2a, 0x17ca, 0xfc2c, 0x171e,
+       0xfc2e, 0x0000, 0xfc30, 0x0000, 0xfc32, 0x01b4, 0xfc34, 0x07d4,
+       0xfc36, 0x0894, 0xfc38, 0x00e7 };
+
+static u16 r8153_ram_code_bc[] = {
+       0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012, 0xB438, 0x0000,
+       0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c07, 0xB438, 0x2c0a,
+       0xB438, 0x2c0d, 0xB438, 0xa240, 0xB438, 0xa104, 0xB438, 0x292d,
+       0xB438, 0x8620, 0xB438, 0xa480, 0xB438, 0x2a2c, 0xB438, 0x8480,
+       0xB438, 0xa101, 0xB438, 0x2a36, 0xB438, 0xd056, 0xB438, 0x2223,
+       0xB436, 0xA01A, 0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0222,
+       0xB436, 0xA004, 0xB438, 0x0a35, 0xB436, 0xA002, 0xB438, 0x0a2b,
+       0xB436, 0xA000, 0xB438, 0xf92c, 0xB436, 0xB820, 0xB438, 0x0210 };
+
+static u8 r8153_usb_patch_b[] = {
+       0x08, 0xe0, 0x0f, 0xe0, 0x18, 0xe0, 0x24, 0xe0,
+       0x26, 0xe0, 0x3a, 0xe0, 0x84, 0xe0, 0x9c, 0xe0,
+       0xc2, 0x49, 0x04, 0xf0, 0x02, 0xc0, 0x00, 0xb8,
+       0x14, 0x18, 0x02, 0xc0, 0x00, 0xb8, 0x2e, 0x18,
+       0x06, 0x89, 0x08, 0xc0, 0x0c, 0x61, 0x92, 0x48,
+       0x93, 0x48, 0x0c, 0x89, 0x02, 0xc0, 0x00, 0xb8,
+       0x08, 0x05, 0x40, 0xb4, 0x16, 0x89, 0x6d, 0xc0,
+       0x00, 0x61, 0x95, 0x49, 0x06, 0xf0, 0xfa, 0xc0,
+       0x0c, 0x61, 0x92, 0x48, 0x93, 0x48, 0x0c, 0x89,
+       0x02, 0xc0, 0x00, 0xb8, 0xe2, 0x04, 0x02, 0xc2,
+       0x00, 0xba, 0xec, 0x11, 0x60, 0x60, 0x85, 0x49,
+       0x0d, 0xf1, 0x11, 0xc6, 0xd2, 0x61, 0x91, 0x49,
+       0xfd, 0xf0, 0x74, 0x60, 0x04, 0x48, 0x74, 0x88,
+       0x08, 0xc6, 0x08, 0xc0, 0xc4, 0x98, 0x01, 0x18,
+       0xc0, 0x88, 0x02, 0xc0, 0x00, 0xb8, 0x6e, 0x12,
+       0x04, 0xe4, 0x0d, 0x00, 0x00, 0xd4, 0xd1, 0x49,
+       0x3c, 0xf1, 0xd2, 0x49, 0x16, 0xf1, 0xd3, 0x49,
+       0x18, 0xf1, 0xd4, 0x49, 0x19, 0xf1, 0xd5, 0x49,
+       0x1a, 0xf1, 0xd6, 0x49, 0x1b, 0xf1, 0xd7, 0x49,
+       0x1c, 0xf1, 0xd8, 0x49, 0x1d, 0xf1, 0xd9, 0x49,
+       0x20, 0xf1, 0xda, 0x49, 0x23, 0xf1, 0xdb, 0x49,
+       0x24, 0xf1, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
+       0xe5, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x14, 0x02,
+       0x02, 0xc4, 0x00, 0xbc, 0x16, 0x02, 0x02, 0xc4,
+       0x00, 0xbc, 0x18, 0x02, 0x02, 0xc4, 0x00, 0xbc,
+       0x1a, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x1c, 0x02,
+       0x02, 0xc4, 0x00, 0xbc, 0x94, 0x02, 0x10, 0xc7,
+       0xe0, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x8a, 0x02,
+       0x0b, 0xc7, 0xe4, 0x8e, 0x02, 0xc4, 0x00, 0xbc,
+       0x88, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x6e, 0x02,
+       0x02, 0xc4, 0x00, 0xbc, 0x5a, 0x02, 0x30, 0xe4,
+       0x0c, 0xc3, 0x60, 0x64, 0xc5, 0x49, 0x04, 0xf1,
+       0x74, 0x64, 0xc4, 0x48, 0x74, 0x8c, 0x06, 0xc3,
+       0x64, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
+       0x00, 0xd8, 0x00, 0xe4, 0xb2, 0xc0, 0x00, 0x61,
+       0x90, 0x49, 0x09, 0xf1, 0x8b, 0xc6, 0xca, 0x61,
+       0x94, 0x49, 0x0e, 0xf1, 0xf6, 0xc6, 0xda, 0x60,
+       0x81, 0x49, 0x0a, 0xf0, 0x65, 0x60, 0x03, 0x48,
+       0x65, 0x88, 0xef, 0xc6, 0xdc, 0x60, 0x80, 0x48,
+       0xdc, 0x88, 0x05, 0xc6, 0x00, 0xbe, 0x02, 0xc6,
+       0x00, 0xbe, 0x36, 0x13, 0x4c, 0x17, 0x99, 0xc4,
+       0x80, 0x65, 0xd0, 0x49, 0x04, 0xf1, 0xfa, 0x75,
+       0x04, 0xc4, 0x00, 0xbc, 0x03, 0xc4, 0x00, 0xbc,
+       0x9a, 0x00, 0xee, 0x01 };
+
+static u16 r8153_usb_patch_b_bp[] = {
+       0xfc26, 0xa000, 0xfc28, 0x180c, 0xfc2a, 0x0506, 0xfc2c, 0x04E0,
+       0xfc2e, 0x11E4, 0xfc30, 0x125C, 0xfc32, 0x0232, 0xfc34, 0x131E,
+       0xfc36, 0x0098, 0xfc38, 0x00FF };
+
+static u8 r8153_pla_patch_b[] = {
+       0x08, 0xe0, 0xea, 0xe0, 0xf2, 0xe0, 0x04, 0xe1,
+       0x09, 0xe1, 0x0e, 0xe1, 0x46, 0xe1, 0xf3, 0xe1,
+       0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
+       0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
+       0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
+       0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
+       0x02, 0xc2, 0x00, 0xba, 0x1a, 0x17, 0x00, 0xe0,
+       0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
+       0x00, 0x80, 0x00, 0x20, 0x2c, 0x75, 0xd4, 0x49,
+       0x12, 0xf1, 0x32, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
+       0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
+       0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
+       0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
+       0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
+       0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
+       0x3c, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
+       0xdc, 0x21, 0xbc, 0x25, 0x30, 0xc6, 0xc0, 0x77,
+       0x04, 0x13, 0x21, 0xf0, 0x03, 0x13, 0x22, 0xf0,
+       0x02, 0x13, 0x23, 0xf0, 0x01, 0x13, 0x24, 0xf0,
+       0x08, 0x13, 0x08, 0xf1, 0x2e, 0x73, 0xba, 0x21,
+       0xbd, 0x25, 0x05, 0x13, 0x03, 0xf1, 0x24, 0xc5,
+       0x00, 0xbd, 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5,
+       0x00, 0xbd, 0xc4, 0xc6, 0xc6, 0x67, 0x2e, 0x75,
+       0xd7, 0x22, 0xdd, 0x26, 0x05, 0x15, 0x1b, 0xf0,
+       0x14, 0xc6, 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd,
+       0x12, 0xc5, 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1,
+       0xef, 0xe7, 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7,
+       0xf3, 0x49, 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49,
+       0xf4, 0xf1, 0xe6, 0xe7, 0xb6, 0xc0, 0x9e, 0x12,
+       0xde, 0x11, 0x0a, 0x12, 0x3c, 0x13, 0x00, 0xa0,
+       0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75, 0xd0, 0x49,
+       0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49, 0x43, 0xf0,
+       0x22, 0x72, 0x25, 0x25, 0x20, 0x1f, 0x97, 0x30,
+       0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4, 0x1c, 0x40,
+       0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1, 0x37, 0xe0,
+       0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02, 0x40, 0x66,
+       0x64, 0x27, 0x06, 0x16, 0x30, 0xf1, 0x46, 0x63,
+       0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b, 0x18, 0x1b,
+       0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c, 0x2b, 0xe8,
+       0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d, 0x26, 0x1a,
+       0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25, 0x0e, 0x0b,
+       0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7, 0x27, 0x40,
+       0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f, 0x8f, 0x30,
+       0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72, 0x46, 0x77,
+       0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3, 0x1f, 0x40,
+       0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f, 0x44, 0x77,
+       0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8, 0x0a, 0xc7,
+       0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3, 0x00, 0xbb,
+       0xfa, 0x18, 0xb0, 0x18, 0xff, 0xc7, 0x00, 0xbf,
+       0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c, 0x54, 0xa5,
+       0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1, 0x00, 0x14,
+       0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0, 0x00, 0x1c,
+       0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0, 0x01, 0x0b,
+       0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b, 0xd3, 0xa5,
+       0x27, 0x31, 0x20, 0x37, 0x02, 0x0b, 0xd3, 0xa5,
+       0x27, 0x31, 0x20, 0x37, 0x00, 0x13, 0xfb, 0xf1,
+       0x80, 0xff, 0x22, 0x73, 0xb5, 0x25, 0x18, 0x1e,
+       0xde, 0x30, 0xd9, 0x30, 0x64, 0x72, 0x11, 0x1e,
+       0x68, 0x23, 0x16, 0x31, 0x80, 0xff, 0x08, 0xc2,
+       0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b, 0x06, 0xff,
+       0x02, 0xc6, 0x00, 0xbe, 0x08, 0x16, 0x1e, 0xfc,
+       0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
+       0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
+       0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
+       0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
+       0x00, 0xbb, 0x8c, 0x15, 0x76, 0x15, 0xa0, 0x64,
+       0x40, 0x48, 0xa0, 0x8c, 0x02, 0xc4, 0x00, 0xbc,
+       0x82, 0x00, 0xa0, 0x62, 0x21, 0x48, 0xa0, 0x8a,
+       0x02, 0xc2, 0x00, 0xba, 0x40, 0x03, 0x33, 0xc5,
+       0xa0, 0x74, 0xc0, 0x49, 0x1f, 0xf0, 0x30, 0xc5,
+       0xa0, 0x73, 0x00, 0x13, 0x04, 0xf1, 0xa2, 0x73,
+       0x00, 0x13, 0x14, 0xf0, 0x28, 0xc5, 0xa0, 0x74,
+       0xc8, 0x49, 0x1b, 0xf1, 0x26, 0xc5, 0xa0, 0x76,
+       0xa2, 0x74, 0x01, 0x06, 0x20, 0x37, 0xa0, 0x9e,
+       0xa2, 0x9c, 0x1e, 0xc5, 0xa2, 0x73, 0x23, 0x40,
+       0x10, 0xf8, 0x04, 0xf3, 0xa0, 0x73, 0x33, 0x40,
+       0x0c, 0xf8, 0x15, 0xc5, 0xa0, 0x74, 0x41, 0x48,
+       0xa0, 0x9c, 0x14, 0xc5, 0xa0, 0x76, 0x62, 0x48,
+       0xe0, 0x48, 0xa0, 0x9e, 0x10, 0xc6, 0x00, 0xbe,
+       0x0a, 0xc5, 0xa0, 0x74, 0x48, 0x48, 0xa0, 0x9c,
+       0x0b, 0xc5, 0x20, 0x1e, 0xa0, 0x9e, 0xe5, 0x48,
+       0xa0, 0x9e, 0xf0, 0xe7, 0xbc, 0xc0, 0xc8, 0xd2,
+       0xcc, 0xd2, 0x28, 0xe4, 0xe6, 0x01, 0xf0, 0xc0,
+       0x18, 0x89, 0x00, 0x1d, 0x3c, 0xc3, 0x60, 0x71,
+       0x3c, 0xc0, 0x02, 0x99, 0x00, 0x61, 0x67, 0x11,
+       0x3c, 0xf1, 0x69, 0x33, 0x35, 0xc0, 0x28, 0x40,
+       0xf6, 0xf1, 0x34, 0xc0, 0x00, 0x19, 0x81, 0x1b,
+       0x8c, 0xe8, 0x31, 0xc0, 0x04, 0x1a, 0x84, 0x1b,
+       0x88, 0xe8, 0x7d, 0xe8, 0xa3, 0x49, 0xfe, 0xf0,
+       0x2b, 0xc0, 0x79, 0xe8, 0xa1, 0x48, 0x28, 0xc0,
+       0x84, 0x1b, 0x7f, 0xe8, 0x00, 0x1d, 0x69, 0x33,
+       0x00, 0x1e, 0x01, 0x06, 0xff, 0x18, 0x30, 0x40,
+       0xfd, 0xf1, 0x18, 0xc0, 0x00, 0x76, 0x2e, 0x40,
+       0xf7, 0xf1, 0x21, 0x48, 0x19, 0xc0, 0x84, 0x1b,
+       0x70, 0xe8, 0x79, 0xc0, 0x64, 0xe8, 0xa1, 0x49,
+       0xfd, 0xf0, 0x11, 0xc0, 0x00, 0x1a, 0x84, 0x1b,
+       0x68, 0xe8, 0x5d, 0xe8, 0xa5, 0x49, 0xfe, 0xf0,
+       0x09, 0xc0, 0x01, 0x19, 0x81, 0x1b, 0x61, 0xe8,
+       0x4f, 0xe0, 0x88, 0xd3, 0x8c, 0xd3, 0xb8, 0x0b,
+       0x50, 0xe8, 0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4,
+       0xfc, 0xc0, 0x00, 0x61, 0x9c, 0x20, 0x9c, 0x24,
+       0x06, 0x11, 0x06, 0xf1, 0x60, 0xc0, 0x00, 0x61,
+       0x11, 0x48, 0x00, 0x89, 0x3d, 0xe0, 0x00, 0x11,
+       0x02, 0xf1, 0x03, 0xe0, 0x04, 0x11, 0x06, 0xf1,
+       0x56, 0xc0, 0x00, 0x61, 0x92, 0x48, 0x00, 0x89,
+       0x33, 0xe0, 0x05, 0x11, 0x08, 0xf1, 0x4f, 0xc0,
+       0x00, 0x61, 0x91, 0x49, 0x04, 0xf0, 0x91, 0x48,
+       0x00, 0x89, 0x11, 0xe0, 0xde, 0xc0, 0x00, 0x61,
+       0x98, 0x20, 0x98, 0x24, 0x25, 0x11, 0x24, 0xf1,
+       0x45, 0xc0, 0x29, 0xe8, 0x95, 0x49, 0x20, 0xf0,
+       0xd4, 0xc0, 0x00, 0x61, 0x98, 0x20, 0x98, 0x24,
+       0x25, 0x11, 0x1a, 0xf1, 0x38, 0xc0, 0x00, 0x61,
+       0x92, 0x49, 0x16, 0xf1, 0x12, 0x48, 0x00, 0x89,
+       0x30, 0xc0, 0x00, 0x19, 0x00, 0x89, 0x2e, 0xc0,
+       0x01, 0x89, 0x2e, 0xc0, 0x04, 0x19, 0x81, 0x1b,
+       0x1c, 0xe8, 0x2b, 0xc0, 0x14, 0x19, 0x81, 0x1b,
+       0x18, 0xe8, 0x22, 0xc0, 0x0c, 0xe8, 0x20, 0xc0,
+       0x12, 0x48, 0x81, 0x1b, 0x12, 0xe8, 0xb3, 0xc3,
+       0x62, 0x71, 0xb3, 0xc0, 0x02, 0x99, 0x02, 0xc0,
+       0x00, 0xb8, 0x96, 0x07, 0x13, 0xc4, 0x84, 0x98,
+       0x00, 0x1b, 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49,
+       0xfe, 0xf1, 0x80, 0x71, 0x82, 0x72, 0x80, 0xff,
+       0x09, 0xc4, 0x84, 0x98, 0x80, 0x99, 0x82, 0x9a,
+       0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1,
+       0x80, 0xff, 0x08, 0xea, 0x10, 0xd4, 0x30, 0xd4,
+       0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3, 0x28, 0xe4,
+       0x2c, 0xe4, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+static u16 r8153_pla_patch_b_bp[] = {
+       0xfc26, 0x8000, 0xfc28, 0x1154, 0xfc2a, 0x1606, 0xfc2c, 0x155a,
+       0xfc2e, 0x0080, 0xfc30, 0x033c, 0xfc32, 0x01a0, 0xfc34, 0x0794,
+       0xfc36, 0x0000, 0xfc38, 0x007f };
+
+static u16 r8153_ram_code_d[] = {
+       0xa436, 0xb820, 0xa438, 0x0290, 0xa436, 0xa012, 0xa438, 0x0000,
+       0xa436, 0xa014, 0xa438, 0x2c04, 0xb438, 0x2c07, 0xb438, 0x2c07,
+       0xb438, 0x2c07, 0xb438, 0xa240, 0xb438, 0xa104, 0xb438, 0x2944,
+       0xa436, 0xa01a, 0xa438, 0x0000, 0xa436, 0xa006, 0xa438, 0x0fff,
+       0xa436, 0xa004, 0xa438, 0x0fff, 0xa436, 0xa002, 0xa438, 0x0fff,
+       0xa436, 0xa000, 0xa438, 0x1943, 0xa436, 0xb820, 0xa438, 0x0210 };
+
+static u8 usb_patch_d[] = {
+       0x08, 0xe0, 0x0a, 0xe0, 0x0c, 0xe0, 0x1f, 0xe0,
+       0x28, 0xe0, 0x2a, 0xe0, 0x2c, 0xe0, 0x2e, 0xe0,
+       0x02, 0xc5, 0x00, 0xbd, 0x00, 0x00, 0x02, 0xc3,
+       0x00, 0xbb, 0x00, 0x00, 0x30, 0x18, 0x11, 0xc1,
+       0x05, 0xe8, 0x10, 0xc6, 0x02, 0xc2, 0x00, 0xba,
+       0x94, 0x17, 0x02, 0xb4, 0x09, 0xc2, 0x40, 0x99,
+       0x0e, 0x48, 0x42, 0x98, 0x42, 0x70, 0x8e, 0x49,
+       0xfe, 0xf1, 0x02, 0xb0, 0x80, 0xff, 0xc0, 0xd4,
+       0xe4, 0x40, 0x20, 0xd4, 0xb0, 0x49, 0x04, 0xf0,
+       0x30, 0x18, 0x06, 0xc1, 0xef, 0xef, 0xfa, 0xc7,
+       0x02, 0xc0, 0x00, 0xb8, 0x38, 0x12, 0xe4, 0x4b,
+       0x02, 0xc3, 0x00, 0xbb, 0x00, 0x00, 0x02, 0xc5,
+       0x00, 0xbd, 0x00, 0x00, 0x02, 0xc1, 0x00, 0xb9,
+       0x00, 0x00, 0x02, 0xc1, 0x00, 0xb9, 0x00, 0x00 };
+
+static u16 r8153_usb_patch_d_bp[] = {
+       0xfc26, 0xa000, 0xfc28, 0x0000, 0xfc2a, 0x0000, 0xfc2c, 0x1792,
+       0xfc2e, 0x1236, 0xfc30, 0x0000, 0xfc32, 0x0000, 0xfc34, 0x0000,
+       0xfc36, 0x0000, 0xfc38, 0x000c };
+
+static void rtl_clear_bp(struct r8152 *tp)
+{
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_0, 0);
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_2, 0);
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_4, 0);
+       ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_6, 0);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_0, 0);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_2, 0);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_4, 0);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_6, 0);
+
+       mdelay(6);
+
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_BA, 0);
+       ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0);
+}
+
+static void r8153_clear_bp(struct r8152 *tp)
+{
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
+       ocp_write_byte(tp, MCU_TYPE_USB, USB_BP_EN, 0);
+       rtl_clear_bp(tp);
+}
+
+static void r8152b_set_dq_desc(struct r8152 *tp)
+{
+       u8 data;
+
+       data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
+       data |= 0x80;
+       ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
+       ocp_write_word(tp, MCU_TYPE_USB, 0xc0ce, 0x0210);
+       data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
+       data &= ~0x80;
+       ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
+}
+
+static int r8153_pre_ram_code(struct r8152 *tp, u16 patch_key)
+{
+       u16 data;
+       int i;
+
+       data = ocp_reg_read(tp, 0xb820);
+       data |= 0x0010;
+       ocp_reg_write(tp, 0xb820, data);
+
+       for (i = 0, data = 0; !data && i < 5000; i++) {
+               mdelay(2);
+               data = ocp_reg_read(tp, 0xb800) & 0x0040;
+       }
+
+       sram_write(tp, 0x8146, patch_key);
+       sram_write(tp, 0xb82e, 0x0001);
+
+       return -EBUSY;
+}
+
+static int r8153_post_ram_code(struct r8152 *tp)
+{
+       u16 data;
+
+       sram_write(tp, 0x0000, 0x0000);
+
+       data = ocp_reg_read(tp, 0xb82e);
+       data &= ~0x0001;
+       ocp_reg_write(tp, 0xb82e, data);
+
+       sram_write(tp, 0x8146, 0x0000);
+
+       data = ocp_reg_read(tp, 0xb820);
+       data &= ~0x0010;
+       ocp_reg_write(tp, 0xb820, data);
+
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
+
+       return 0;
+}
+
+static void r8153_wdt1_end(struct r8152 *tp)
+{
+       int i;
+
+       for (i = 0; i < 104; i++) {
+               if (!(ocp_read_byte(tp, MCU_TYPE_USB, 0xe404) & 1))
+                       break;
+               mdelay(2);
+       }
+}
+
+void r8152b_firmware(struct r8152 *tp)
+{
+       int i;
+
+       if (tp->version == RTL_VER_01) {
+               int i;
+
+               r8152b_set_dq_desc(tp);
+               rtl_clear_bp(tp);
+
+               generic_ocp_write(tp, 0xf800, 0x3f,
+                                 sizeof(r8152b_pla_patch_a),
+                                 r8152b_pla_patch_a, MCU_TYPE_PLA);
+
+               for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8152b_pla_patch_a_bp[i],
+                                      r8152b_pla_patch_a_bp[i+1]);
+
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, 0x2000);
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7070);
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0600);
+               for (i = 0; i < ARRAY_SIZE(r8152b_ram_code1); i++)
+                       ocp_write_word(tp, MCU_TYPE_PLA, 0xb09a,
+                                      r8152b_ram_code1[i]);
+
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0200);
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7030);
+       } else if (tp->version == RTL_VER_02) {
+               rtl_clear_bp(tp);
+
+               generic_ocp_write(tp, 0xf800, 0xff,
+                                 sizeof(r8152b_pla_patch_a2),
+                                 r8152b_pla_patch_a2, MCU_TYPE_PLA);
+
+               for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a2_bp);
+                    i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8152b_pla_patch_a2_bp[i],
+                                      r8152b_pla_patch_a2_bp[i+1]);
+       }
+}
+
+void r8153_firmware(struct r8152 *tp)
+{
+       int i;
+
+       if (tp->version == RTL_VER_03) {
+               r8153_clear_bp(tp);
+
+               r8153_pre_ram_code(tp, 0x7000);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_ram_code_a); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8153_ram_code_a[i],
+                                      r8153_ram_code_a[i+1]);
+
+               r8153_post_ram_code(tp);
+       } else if (tp->version == RTL_VER_04) {
+               r8153_pre_ram_code(tp, 0x7001);
+
+       for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
+               ocp_write_word(tp, MCU_TYPE_PLA,
+                              r8153_ram_code_bc[i],
+                              r8153_ram_code_bc[i+1]);
+
+               r8153_post_ram_code(tp);
+
+               r8153_wdt1_end(tp);
+               r8153_clear_bp(tp);
+
+               ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
+               generic_ocp_write(tp, 0xf800, 0xff,
+                                 sizeof(r8153_usb_patch_b),
+                                 r8153_usb_patch_b, MCU_TYPE_USB);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_b_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_USB,
+                                      r8153_usb_patch_b_bp[i],
+                                      r8153_usb_patch_b_bp[i+1]);
+
+               if (!(ocp_read_word(tp, MCU_TYPE_PLA, 0xd38e) & BIT(0))) {
+                       ocp_write_word(tp, MCU_TYPE_PLA, 0xd38c, 0x0082);
+                       ocp_write_word(tp, MCU_TYPE_PLA, 0xd38e, 0x0082);
+               }
+
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
+               generic_ocp_write(tp, 0xf800, 0xff,
+                                 sizeof(r8153_pla_patch_b),
+                                 r8153_pla_patch_b, MCU_TYPE_PLA);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_b_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8153_pla_patch_b_bp[i],
+                                      r8153_pla_patch_b_bp[i+1]);
+
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
+       } else if (tp->version == RTL_VER_05) {
+               u32 ocp_data;
+
+               ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
+               ocp_data &= ~0x4000;
+               ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
+
+               r8153_pre_ram_code(tp, 0x7001);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8153_ram_code_bc[i],
+                                      r8153_ram_code_bc[i+1]);
+
+               r8153_post_ram_code(tp);
+
+               r8153_wdt1_end(tp);
+               r8153_clear_bp(tp);
+
+               ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
+               generic_ocp_write(tp, 0xf800, 0xff,
+                                 sizeof(r8153_usb_patch_c),
+                                 r8153_usb_patch_c, MCU_TYPE_USB);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_c_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_USB,
+                                      r8153_usb_patch_c_bp[i],
+                                      r8153_usb_patch_c_bp[i+1]);
+
+               if (ocp_read_byte(tp, MCU_TYPE_USB, 0xcfef) & 1) {
+                       ocp_write_word(tp, MCU_TYPE_USB, 0xfc30, 0x1578);
+                       ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ff);
+               } else {
+                       ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ef);
+               }
+
+               ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
+               generic_ocp_write(tp, 0xf800, 0xff,
+                                 sizeof(r8153_pla_patch_c),
+                                 r8153_pla_patch_c, MCU_TYPE_PLA);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_c_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8153_pla_patch_c_bp[i],
+                                      r8153_pla_patch_c_bp[i+1]);
+
+               ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
+
+               ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
+               ocp_data |= 0x4000;
+               ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
+       } else if (tp->version == RTL_VER_06) {
+               r8153_pre_ram_code(tp, 0x7002);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_ram_code_d); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_PLA,
+                                      r8153_ram_code_d[i],
+                                      r8153_ram_code_d[i+1]);
+
+               r8153_post_ram_code(tp);
+
+               r8153_clear_bp(tp);
+
+               ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
+               generic_ocp_write(tp, 0xf800, 0xff, sizeof(usb_patch_d),
+                                 usb_patch_d, MCU_TYPE_USB);
+
+               for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_d_bp); i += 2)
+                       ocp_write_word(tp, MCU_TYPE_USB,
+                                      r8153_usb_patch_d_bp[i],
+                                      r8153_usb_patch_d_bp[i+1]);
+       }
+}
index 62d20f0db989664f69643765701642ea9edcbce5..b9c9a8402e3986bce3506f2fd9937f70c28e7fcf 100644 (file)
@@ -179,6 +179,13 @@ static const struct usb_eth_prob_dev prob_dev[] = {
                .probe = smsc95xx_eth_probe,
                .get_info = smsc95xx_eth_get_info,
        },
+#endif
+#ifdef CONFIG_USB_ETHER_RTL8152
+       {
+               .before_probe = r8152_eth_before_probe,
+               .probe = r8152_eth_probe,
+               .get_info = r8152_eth_get_info,
+       },
 #endif
        { },            /* END */
 };
index 5ef6debd9afd0026705cb3b9ca9972ce162f74e7..c6727c381cbc4798632c75c13cf650e621b53f4d 100644 (file)
@@ -13,6 +13,7 @@
 #include <memalign.h>
 #include <phys2bus.h>
 #include <usbroothubdes.h>
+#include <wait_bit.h>
 #include <asm/io.h>
 
 #include "dwc2.h"
@@ -34,7 +35,8 @@ struct dwc2_priv {
        uint8_t *aligned_buffer;
        uint8_t *status_buffer;
 #endif
-       int bulk_data_toggle[MAX_DEVICE][MAX_ENDPOINT];
+       u8 in_data_toggle[MAX_DEVICE][MAX_ENDPOINT];
+       u8 out_data_toggle[MAX_DEVICE][MAX_ENDPOINT];
        struct dwc2_core_regs *regs;
        int root_hub_devnum;
 };
@@ -52,27 +54,6 @@ static struct dwc2_priv local;
 /*
  * DWC2 IP interface
  */
-static int wait_for_bit(void *reg, const uint32_t mask, bool set)
-{
-       unsigned int timeout = 1000000;
-       uint32_t val;
-
-       while (--timeout) {
-               val = readl(reg);
-               if (!set)
-                       val = ~val;
-
-               if ((val & mask) == mask)
-                       return 0;
-
-               udelay(1);
-       }
-
-       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n",
-             __func__, reg, mask, set);
-
-       return -ETIMEDOUT;
-}
 
 /*
  * Initializes the FSLSPClkSel field of the HCFG register
@@ -117,7 +98,8 @@ static void dwc_otg_flush_tx_fifo(struct dwc2_core_regs *regs, const int num)
 
        writel(DWC2_GRSTCTL_TXFFLSH | (num << DWC2_GRSTCTL_TXFNUM_OFFSET),
               &regs->grstctl);
-       ret = wait_for_bit(&regs->grstctl, DWC2_GRSTCTL_TXFFLSH, 0);
+       ret = wait_for_bit(__func__, &regs->grstctl, DWC2_GRSTCTL_TXFFLSH,
+                          false, 1000, false);
        if (ret)
                printf("%s: Timeout!\n", __func__);
 
@@ -135,7 +117,8 @@ static void dwc_otg_flush_rx_fifo(struct dwc2_core_regs *regs)
        int ret;
 
        writel(DWC2_GRSTCTL_RXFFLSH, &regs->grstctl);
-       ret = wait_for_bit(&regs->grstctl, DWC2_GRSTCTL_RXFFLSH, 0);
+       ret = wait_for_bit(__func__, &regs->grstctl, DWC2_GRSTCTL_RXFFLSH,
+                          false, 1000, false);
        if (ret)
                printf("%s: Timeout!\n", __func__);
 
@@ -152,13 +135,15 @@ static void dwc_otg_core_reset(struct dwc2_core_regs *regs)
        int ret;
 
        /* Wait for AHB master IDLE state. */
-       ret = wait_for_bit(&regs->grstctl, DWC2_GRSTCTL_AHBIDLE, 1);
+       ret = wait_for_bit(__func__, &regs->grstctl, DWC2_GRSTCTL_AHBIDLE,
+                          true, 1000, false);
        if (ret)
                printf("%s: Timeout!\n", __func__);
 
        /* Core Soft Reset */
        writel(DWC2_GRSTCTL_CSFTRST, &regs->grstctl);
-       ret = wait_for_bit(&regs->grstctl, DWC2_GRSTCTL_CSFTRST, 0);
+       ret = wait_for_bit(__func__, &regs->grstctl, DWC2_GRSTCTL_CSFTRST,
+                          false, 1000, false);
        if (ret)
                printf("%s: Timeout!\n", __func__);
 
@@ -243,8 +228,8 @@ static void dwc_otg_core_host_init(struct dwc2_core_regs *regs)
                clrsetbits_le32(&regs->hc_regs[i].hcchar,
                                DWC2_HCCHAR_EPDIR,
                                DWC2_HCCHAR_CHEN | DWC2_HCCHAR_CHDIS);
-               ret = wait_for_bit(&regs->hc_regs[i].hcchar,
-                                  DWC2_HCCHAR_CHEN, 0);
+               ret = wait_for_bit(__func__, &regs->hc_regs[i].hcchar,
+                                  DWC2_HCCHAR_CHEN, false, 1000, false);
                if (ret)
                        printf("%s: Timeout!\n", __func__);
        }
@@ -426,19 +411,29 @@ static void dwc_otg_hc_init(struct dwc2_core_regs *regs, uint8_t hc_num,
        if (dev->speed == USB_SPEED_LOW)
                hcchar |= DWC2_HCCHAR_LSPDDEV;
 
-       /* Clear old interrupt conditions for this host channel. */
-       writel(0x3fff, &hc_regs->hcint);
-
        /*
         * Program the HCCHARn register with the endpoint characteristics
         * for the current transfer.
         */
        writel(hcchar, &hc_regs->hcchar);
 
-       /* Program the HCSPLIT register for SPLITs */
+       /* Program the HCSPLIT register, default to no SPLIT */
        writel(0, &hc_regs->hcsplt);
 }
 
+static void dwc_otg_hc_init_split(struct dwc2_hc_regs *hc_regs,
+                                 uint8_t hub_devnum, uint8_t hub_port)
+{
+       uint32_t hcsplt = 0;
+
+       hcsplt = DWC2_HCSPLT_SPLTENA;
+       hcsplt |= hub_devnum << DWC2_HCSPLT_HUBADDR_OFFSET;
+       hcsplt |= hub_port << DWC2_HCSPLT_PRTADDR_OFFSET;
+
+       /* Program the HCSPLIT register for SPLITs */
+       writel(hcsplt, &hc_regs->hcsplt);
+}
+
 /*
  * DWC2 to USB API interface
  */
@@ -729,38 +724,33 @@ static int dwc_otg_submit_rh_msg(struct dwc2_priv *priv, struct usb_device *dev,
        return stat;
 }
 
-int wait_for_chhltd(struct dwc2_core_regs *regs, uint32_t *sub, int *toggle,
-                   bool ignore_ack)
+int wait_for_chhltd(struct dwc2_hc_regs *hc_regs, uint32_t *sub, u8 *toggle)
 {
-       uint32_t hcint_comp_hlt_ack = DWC2_HCINT_XFERCOMP | DWC2_HCINT_CHHLTD;
-       struct dwc2_hc_regs *hc_regs = &regs->hc_regs[DWC2_HC_CHANNEL];
        int ret;
        uint32_t hcint, hctsiz;
 
-       ret = wait_for_bit(&hc_regs->hcint, DWC2_HCINT_CHHLTD, true);
+       ret = wait_for_bit(__func__, &hc_regs->hcint, DWC2_HCINT_CHHLTD, true,
+                          1000, false);
        if (ret)
                return ret;
 
        hcint = readl(&hc_regs->hcint);
-       if (hcint & (DWC2_HCINT_NAK | DWC2_HCINT_FRMOVRUN))
-               return -EAGAIN;
-       if (ignore_ack)
-               hcint &= ~DWC2_HCINT_ACK;
-       else
-               hcint_comp_hlt_ack |= DWC2_HCINT_ACK;
-       if (hcint != hcint_comp_hlt_ack) {
-               debug("%s: Error (HCINT=%08x)\n", __func__, hcint);
-               return -EINVAL;
-       }
-
        hctsiz = readl(&hc_regs->hctsiz);
        *sub = (hctsiz & DWC2_HCTSIZ_XFERSIZE_MASK) >>
                DWC2_HCTSIZ_XFERSIZE_OFFSET;
        *toggle = (hctsiz & DWC2_HCTSIZ_PID_MASK) >> DWC2_HCTSIZ_PID_OFFSET;
 
-       debug("%s: sub=%u toggle=%d\n", __func__, *sub, *toggle);
+       debug("%s: HCINT=%08x sub=%u toggle=%d\n", __func__, hcint, *sub,
+             *toggle);
 
-       return 0;
+       if (hcint & DWC2_HCINT_XFERCOMP)
+               return 0;
+
+       if (hcint & (DWC2_HCINT_NAK | DWC2_HCINT_FRMOVRUN))
+               return -EAGAIN;
+
+       debug("%s: Error (HCINT=%08x)\n", __func__, hcint);
+       return -EINVAL;
 }
 
 static int dwc2_eptype[] = {
@@ -770,96 +760,176 @@ static int dwc2_eptype[] = {
        DWC2_HCCHAR_EPTYPE_BULK,
 };
 
+static int transfer_chunk(struct dwc2_hc_regs *hc_regs, void *aligned_buffer,
+                         u8 *pid, int in, void *buffer, int num_packets,
+                         int xfer_len, int *actual_len, int odd_frame)
+{
+       int ret = 0;
+       uint32_t sub;
+
+       debug("%s: chunk: pid %d xfer_len %u pkts %u\n", __func__,
+             *pid, xfer_len, num_packets);
+
+       writel((xfer_len << DWC2_HCTSIZ_XFERSIZE_OFFSET) |
+              (num_packets << DWC2_HCTSIZ_PKTCNT_OFFSET) |
+              (*pid << DWC2_HCTSIZ_PID_OFFSET),
+              &hc_regs->hctsiz);
+
+       if (!in && xfer_len) {
+               memcpy(aligned_buffer, buffer, xfer_len);
+
+               flush_dcache_range((unsigned long)aligned_buffer,
+                                  (unsigned long)aligned_buffer +
+                                  roundup(xfer_len, ARCH_DMA_MINALIGN));
+       }
+
+       writel(phys_to_bus((unsigned long)aligned_buffer), &hc_regs->hcdma);
+
+       /* Clear old interrupt conditions for this host channel. */
+       writel(0x3fff, &hc_regs->hcint);
+
+       /* Set host channel enable after all other setup is complete. */
+       clrsetbits_le32(&hc_regs->hcchar, DWC2_HCCHAR_MULTICNT_MASK |
+                       DWC2_HCCHAR_CHEN | DWC2_HCCHAR_CHDIS |
+                       DWC2_HCCHAR_ODDFRM,
+                       (1 << DWC2_HCCHAR_MULTICNT_OFFSET) |
+                       (odd_frame << DWC2_HCCHAR_ODDFRM_OFFSET) |
+                       DWC2_HCCHAR_CHEN);
+
+       ret = wait_for_chhltd(hc_regs, &sub, pid);
+       if (ret < 0)
+               return ret;
+
+       if (in) {
+               xfer_len -= sub;
+
+               invalidate_dcache_range((unsigned long)aligned_buffer,
+                                       (unsigned long)aligned_buffer +
+                                       roundup(xfer_len, ARCH_DMA_MINALIGN));
+
+               memcpy(buffer, aligned_buffer, xfer_len);
+       }
+       *actual_len = xfer_len;
+
+       return ret;
+}
+
 int chunk_msg(struct dwc2_priv *priv, struct usb_device *dev,
-             unsigned long pipe, int *pid, int in, void *buffer, int len,
-             bool ignore_ack)
+             unsigned long pipe, u8 *pid, int in, void *buffer, int len)
 {
        struct dwc2_core_regs *regs = priv->regs;
        struct dwc2_hc_regs *hc_regs = &regs->hc_regs[DWC2_HC_CHANNEL];
+       struct dwc2_host_regs *host_regs = &regs->host_regs;
        int devnum = usb_pipedevice(pipe);
        int ep = usb_pipeendpoint(pipe);
        int max = usb_maxpacket(dev, pipe);
        int eptype = dwc2_eptype[usb_pipetype(pipe)];
        int done = 0;
        int ret = 0;
-       uint32_t sub;
+       int do_split = 0;
+       int complete_split = 0;
        uint32_t xfer_len;
        uint32_t num_packets;
        int stop_transfer = 0;
+       uint32_t max_xfer_len;
+       int ssplit_frame_num = 0;
 
        debug("%s: msg: pipe %lx pid %d in %d len %d\n", __func__, pipe, *pid,
              in, len);
 
-       do {
-               /* Initialize channel */
-               dwc_otg_hc_init(regs, DWC2_HC_CHANNEL, dev, devnum, ep, in,
-                               eptype, max);
+       max_xfer_len = CONFIG_DWC2_MAX_PACKET_COUNT * max;
+       if (max_xfer_len > CONFIG_DWC2_MAX_TRANSFER_SIZE)
+               max_xfer_len = CONFIG_DWC2_MAX_TRANSFER_SIZE;
+       if (max_xfer_len > DWC2_DATA_BUF_SIZE)
+               max_xfer_len = DWC2_DATA_BUF_SIZE;
+
+       /* Make sure that max_xfer_len is a multiple of max packet size. */
+       num_packets = max_xfer_len / max;
+       max_xfer_len = num_packets * max;
+
+       /* Initialize channel */
+       dwc_otg_hc_init(regs, DWC2_HC_CHANNEL, dev, devnum, ep, in,
+                       eptype, max);
+
+       /* Check if the target is a FS/LS device behind a HS hub */
+       if (dev->speed != USB_SPEED_HIGH) {
+               uint8_t hub_addr;
+               uint8_t hub_port;
+               uint32_t hprt0 = readl(&regs->hprt0);
+               if ((hprt0 & DWC2_HPRT0_PRTSPD_MASK) ==
+                    DWC2_HPRT0_PRTSPD_HIGH) {
+                       usb_find_usb2_hub_address_port(dev, &hub_addr,
+                                                      &hub_port);
+                       dwc_otg_hc_init_split(hc_regs, hub_addr, hub_port);
+
+                       do_split = 1;
+                       num_packets = 1;
+                       max_xfer_len = max;
+               }
+       }
 
+       do {
+               int actual_len = 0;
+               uint32_t hcint;
+               int odd_frame = 0;
                xfer_len = len - done;
-               if (xfer_len > CONFIG_DWC2_MAX_TRANSFER_SIZE)
-                       xfer_len = CONFIG_DWC2_MAX_TRANSFER_SIZE - max + 1;
-               if (xfer_len > DWC2_DATA_BUF_SIZE)
-                       xfer_len = DWC2_DATA_BUF_SIZE - max + 1;
 
-               /* Make sure that xfer_len is a multiple of max packet size. */
-               if (xfer_len > 0) {
+               if (xfer_len > max_xfer_len)
+                       xfer_len = max_xfer_len;
+               else if (xfer_len > max)
                        num_packets = (xfer_len + max - 1) / max;
-                       if (num_packets > CONFIG_DWC2_MAX_PACKET_COUNT) {
-                               num_packets = CONFIG_DWC2_MAX_PACKET_COUNT;
-                               xfer_len = num_packets * max;
-                       }
-               } else {
+               else
                        num_packets = 1;
-               }
-
-               if (in)
-                       xfer_len = num_packets * max;
 
-               debug("%s: chunk: pid %d xfer_len %u pkts %u\n", __func__,
-                     *pid, xfer_len, num_packets);
+               if (complete_split)
+                       setbits_le32(&hc_regs->hcsplt, DWC2_HCSPLT_COMPSPLT);
+               else if (do_split)
+                       clrbits_le32(&hc_regs->hcsplt, DWC2_HCSPLT_COMPSPLT);
 
-               writel((xfer_len << DWC2_HCTSIZ_XFERSIZE_OFFSET) |
-                      (num_packets << DWC2_HCTSIZ_PKTCNT_OFFSET) |
-                      (*pid << DWC2_HCTSIZ_PID_OFFSET),
-                      &hc_regs->hctsiz);
-
-               if (!in && xfer_len) {
-                       memcpy(priv->aligned_buffer, (char *)buffer + done,
-                              xfer_len);
-
-                       flush_dcache_range((unsigned long)priv->aligned_buffer,
-                               (unsigned long)((void *)priv->aligned_buffer +
-                               roundup(xfer_len, ARCH_DMA_MINALIGN)));
+               if (eptype == DWC2_HCCHAR_EPTYPE_INTR) {
+                       int uframe_num = readl(&host_regs->hfnum);
+                       if (!(uframe_num & 0x1))
+                               odd_frame = 1;
                }
 
-               writel(phys_to_bus((unsigned long)priv->aligned_buffer),
-                      &hc_regs->hcdma);
-
-               /* Set host channel enable after all other setup is complete. */
-               clrsetbits_le32(&hc_regs->hcchar, DWC2_HCCHAR_MULTICNT_MASK |
-                               DWC2_HCCHAR_CHEN | DWC2_HCCHAR_CHDIS,
-                               (1 << DWC2_HCCHAR_MULTICNT_OFFSET) |
-                               DWC2_HCCHAR_CHEN);
+               ret = transfer_chunk(hc_regs, priv->aligned_buffer, pid,
+                                    in, (char *)buffer + done, num_packets,
+                                    xfer_len, &actual_len, odd_frame);
+
+               hcint = readl(&hc_regs->hcint);
+               if (complete_split) {
+                       stop_transfer = 0;
+                       if (hcint & DWC2_HCINT_NYET) {
+                               ret = 0;
+                               int frame_num = DWC2_HFNUM_MAX_FRNUM &
+                                               readl(&host_regs->hfnum);
+                               if (((frame_num - ssplit_frame_num) &
+                                   DWC2_HFNUM_MAX_FRNUM) > 4)
+                                       ret = -EAGAIN;
+                       } else
+                               complete_split = 0;
+               } else if (do_split) {
+                       if (hcint & DWC2_HCINT_ACK) {
+                               ssplit_frame_num = DWC2_HFNUM_MAX_FRNUM &
+                                                  readl(&host_regs->hfnum);
+                               ret = 0;
+                               complete_split = 1;
+                       }
+               }
 
-               ret = wait_for_chhltd(regs, &sub, pid, ignore_ack);
                if (ret)
                        break;
 
-               if (in) {
-                       xfer_len -= sub;
+               if (actual_len < xfer_len)
+                       stop_transfer = 1;
 
-                       invalidate_dcache_range((unsigned long)priv->aligned_buffer,
-                               (unsigned long)((void *)priv->aligned_buffer +
-                               roundup(xfer_len, ARCH_DMA_MINALIGN)));
+               done += actual_len;
 
-                       memcpy(buffer + done, priv->aligned_buffer, xfer_len);
-                       if (sub)
-                               stop_transfer = 1;
-               }
-
-               done += xfer_len;
-
-       } while ((done < len) && !stop_transfer);
+       /* Transactions are done when when either all data is transferred or
+        * there is a short transfer. In case of a SPLIT make sure the CSPLIT
+        * is executed.
+        */
+       } while (((done < len) && !stop_transfer) || complete_split);
 
        writel(0, &hc_regs->hcintmsk);
        writel(0xFFFFFFFF, &hc_regs->hcint);
@@ -876,14 +946,19 @@ int _submit_bulk_msg(struct dwc2_priv *priv, struct usb_device *dev,
 {
        int devnum = usb_pipedevice(pipe);
        int ep = usb_pipeendpoint(pipe);
+       u8* pid;
 
-       if (devnum == priv->root_hub_devnum) {
+       if ((devnum >= MAX_DEVICE) || (devnum == priv->root_hub_devnum)) {
                dev->status = 0;
                return -EINVAL;
        }
 
-       return chunk_msg(priv, dev, pipe, &priv->bulk_data_toggle[devnum][ep],
-                        usb_pipein(pipe), buffer, len, true);
+       if (usb_pipein(pipe))
+               pid = &priv->in_data_toggle[devnum][ep];
+       else
+               pid = &priv->out_data_toggle[devnum][ep];
+
+       return chunk_msg(priv, dev, pipe, pid, usb_pipein(pipe), buffer, len);
 }
 
 static int _submit_control_msg(struct dwc2_priv *priv, struct usb_device *dev,
@@ -891,7 +966,8 @@ static int _submit_control_msg(struct dwc2_priv *priv, struct usb_device *dev,
                               struct devrequest *setup)
 {
        int devnum = usb_pipedevice(pipe);
-       int pid, ret, act_len;
+       int ret, act_len;
+       u8 pid;
        /* For CONTROL endpoint pid should start with DATA1 */
        int status_direction;
 
@@ -902,31 +978,39 @@ static int _submit_control_msg(struct dwc2_priv *priv, struct usb_device *dev,
                                             setup);
        }
 
+       /* SETUP stage */
        pid = DWC2_HC_PID_SETUP;
-       ret = chunk_msg(priv, dev, pipe, &pid, 0, setup, 8, true);
+       do {
+               ret = chunk_msg(priv, dev, pipe, &pid, 0, setup, 8);
+       } while (ret == -EAGAIN);
        if (ret)
                return ret;
 
+       /* DATA stage */
+       act_len = 0;
        if (buffer) {
                pid = DWC2_HC_PID_DATA1;
-               ret = chunk_msg(priv, dev, pipe, &pid, usb_pipein(pipe), buffer,
-                               len, false);
+               do {
+                       ret = chunk_msg(priv, dev, pipe, &pid, usb_pipein(pipe),
+                                       buffer, len);
+                       act_len += dev->act_len;
+                       buffer += dev->act_len;
+                       len -= dev->act_len;
+               } while (ret == -EAGAIN);
                if (ret)
                        return ret;
-               act_len = dev->act_len;
-       } /* End of DATA stage */
-       else
-               act_len = 0;
-
-       /* STATUS stage */
-       if ((len == 0) || usb_pipeout(pipe))
+               status_direction = usb_pipeout(pipe);
+       } else {
+               /* No-data CONTROL always ends with an IN transaction */
                status_direction = 1;
-       else
-               status_direction = 0;
+       }
 
+       /* STATUS stage */
        pid = DWC2_HC_PID_DATA1;
-       ret = chunk_msg(priv, dev, pipe, &pid, status_direction,
-                       priv->status_buffer, 0, false);
+       do {
+               ret = chunk_msg(priv, dev, pipe, &pid, status_direction,
+                               priv->status_buffer, 0);
+       } while (ret == -EAGAIN);
        if (ret)
                return ret;
 
@@ -983,8 +1067,10 @@ static int dwc2_init_common(struct dwc2_priv *priv)
                     DWC2_HPRT0_PRTRST);
 
        for (i = 0; i < MAX_DEVICE; i++) {
-               for (j = 0; j < MAX_ENDPOINT; j++)
-                       priv->bulk_data_toggle[i][j] = DWC2_HC_PID_DATA0;
+               for (j = 0; j < MAX_ENDPOINT; j++) {
+                       priv->in_data_toggle[i][j] = DWC2_HC_PID_DATA0;
+                       priv->out_data_toggle[i][j] = DWC2_HC_PID_DATA0;
+               }
        }
 
        return 0;
index f69372e6b418fca6825dfba48560b9dad1c2e0db..594757b609a9e2138c70646cfffb9e52ba85c97a 100644 (file)
@@ -500,6 +500,7 @@ struct dwc2_core_regs {
 #define DWC2_HFNUM_FRNUM_OFFSET                                0
 #define DWC2_HFNUM_FRREM_MASK                          (0xFFFF << 16)
 #define DWC2_HFNUM_FRREM_OFFSET                                16
+#define DWC2_HFNUM_MAX_FRNUM                           0x3FFF
 #define DWC2_HPTXSTS_PTXFSPCAVAIL_MASK                 (0xFFFF << 0)
 #define DWC2_HPTXSTS_PTXFSPCAVAIL_OFFSET               0
 #define DWC2_HPTXSTS_PTXQSPCAVAIL_MASK                 (0xFF << 16)
index 1292caae4d722dc7cb15f738a02e81fe36c5a1bb..84114c5df9847e4ad0fbadc98c3d04d57f0ac08f 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <dm.h>
 #include "ehci.h"
 
@@ -21,6 +22,19 @@ static int ehci_usb_probe(struct udevice *dev)
 {
        struct ehci_hccr *hccr = (struct ehci_hccr *)dev_get_addr(dev);
        struct ehci_hcor *hcor;
+       int i;
+
+       for (i = 0; ; i++) {
+               struct udevice *clk_dev;
+               int clk_id;
+
+               clk_id = clk_get_by_index(dev, i, &clk_dev);
+               if (clk_id < 0)
+                       break;
+               if (clk_enable(clk_dev, clk_id))
+                       printf("failed to enable clock (dev=%s, id=%d)\n",
+                              clk_dev->name, clk_id);
+       }
 
        hcor = (struct ehci_hcor *)((uintptr_t)hccr +
                                    HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
index 2666351391431e091a761fb92f7879777bde2625..e1c67f77d72d2cd96319e13992f647dfaee73435 100644 (file)
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <usb.h>
 #include <errno.h>
+#include <wait_bit.h>
 #include <linux/compiler.h>
 #include <usb/ehci-fsl.h>
 #include <asm/io.h>
@@ -117,32 +118,6 @@ static void usb_power_config(int index)
                     pll_480_ctrl_set);
 }
 
-static int wait_for_bit(u32 *reg, const u32 mask, bool set)
-{
-       u32 val;
-       const unsigned int timeout = 10000;
-       unsigned long start = get_timer(0);
-
-       while(1) {
-               val = readl(reg);
-               if (!set)
-                       val = ~val;
-
-               if ((val & mask) == mask)
-                       return 0;
-
-               if (get_timer(start) > timeout)
-                       break;
-
-               udelay(1);
-       }
-
-       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n",
-                       __func__, reg, mask, set);
-
-       return -ETIMEDOUT;
-}
-
 /* Return 0 : host node, <>0 : device mode */
 static int usb_phy_enable(int index, struct usb_ehci *ehci)
 {
@@ -160,12 +135,13 @@ static int usb_phy_enable(int index, struct usb_ehci *ehci)
 
        /* Stop then Reset */
        clrbits_le32(usb_cmd, UCMD_RUN_STOP);
-       ret = wait_for_bit(usb_cmd, UCMD_RUN_STOP, 0);
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RUN_STOP, false, 10000,
+                          false);
        if (ret)
                return ret;
 
        setbits_le32(usb_cmd, UCMD_RESET);
-       ret = wait_for_bit(usb_cmd, UCMD_RESET, 0);
+       ret = wait_for_bit(__func__, usb_cmd, UCMD_RESET, false, 10000, false);
        if (ret)
                return ret;
 
index cda1c6d5f78ce6126ccb695a9eedd86bc6361553..f21a1fa773b3ac01934a216b709dc107041d6f6f 100644 (file)
@@ -137,11 +137,17 @@ static int ehci_pci_remove(struct udevice *dev)
        return 0;
 }
 
+static const struct udevice_id ehci_pci_ids[] = {
+       { .compatible = "ehci-pci" },
+       { }
+};
+
 U_BOOT_DRIVER(ehci_pci) = {
        .name   = "ehci_pci",
        .id     = UCLASS_USB,
        .probe = ehci_pci_probe,
        .remove = ehci_pci_remove,
+       .of_match = ehci_pci_ids,
        .ops    = &ehci_usb_ops,
        .platdata_auto_alloc_size = sizeof(struct usb_platdata),
        .priv_auto_alloc_size = sizeof(struct ehci_pci_priv),
index 48d338e9fa0f7201b0aaa0229c50171b6608855f..9245126ed6922392750564903d540344fe69606a 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <common.h>
 #include <errno.h>
+#include <wait_bit.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/clk.h>
@@ -80,30 +81,6 @@ struct otg_regs {
 static struct otg_regs *otg = (struct otg_regs *)USB_BASE;
 static struct clk_pm_regs *clk_pwr = (struct clk_pm_regs *)CLK_PM_BASE;
 
-static int wait_for_bit(void *reg, const u32 mask, bool set)
-{
-       u32 val;
-       unsigned long start = get_timer(0);
-
-       while (1) {
-               val = readl(reg);
-               if (!set)
-                       val = ~val;
-
-               if ((val & mask) == mask)
-                       return 0;
-
-               if (get_timer(start) > CONFIG_SYS_HZ)
-                       break;
-
-               udelay(1);
-       }
-
-       error("Timeout (reg=%p mask=%08x wait_set=%i)\n", reg, mask, set);
-
-       return -ETIMEDOUT;
-}
-
 static int isp1301_set_value(int reg, u8 value)
 {
        return i2c_write(ISP1301_I2C_ADDR, reg, 1, &value, 1);
@@ -158,7 +135,8 @@ static int usbpll_setup(void)
        setbits_le32(&clk_pwr->usb_ctrl, CLK_USBCTRL_POSTDIV_2POW(0x01));
        setbits_le32(&clk_pwr->usb_ctrl, CLK_USBCTRL_PLL_PWRUP);
 
-       ret = wait_for_bit(&clk_pwr->usb_ctrl, CLK_USBCTRL_PLL_STS, 1);
+       ret = wait_for_bit(__func__, &clk_pwr->usb_ctrl, CLK_USBCTRL_PLL_STS,
+                          true, CONFIG_SYS_HZ, false);
        if (ret)
                return ret;
 
@@ -183,7 +161,8 @@ int usb_cpu_init(void)
 
        /* enable I2C clock */
        writel(OTG_CLK_I2C_EN, &otg->otg_clk_ctrl);
-       ret = wait_for_bit(&otg->otg_clk_sts, OTG_CLK_I2C_EN, 1);
+       ret = wait_for_bit(__func__, &otg->otg_clk_sts, OTG_CLK_I2C_EN, true,
+                          CONFIG_SYS_HZ, false);
        if (ret)
                return ret;
 
@@ -203,7 +182,8 @@ int usb_cpu_init(void)
                         OTG_CLK_I2C_EN | OTG_CLK_HOST_EN;
        writel(mask, &otg->otg_clk_ctrl);
 
-       ret = wait_for_bit(&otg->otg_clk_sts, mask, 1);
+       ret = wait_for_bit(__func__, &otg->otg_clk_sts, mask, true,
+                          CONFIG_SYS_HZ, false);
        if (ret)
                return ret;
 
index 912e397881080d100766dcc9a317223c8eb3c316..f54631cc17288e790a65e11610c344d7edbc7031 100644 (file)
@@ -293,10 +293,25 @@ config VIDEO_LCD_SPI_MISO
        option takes a string in the format understood by 'name_to_gpio'
        function, e.g. PH1 for pin 1 of port H.
 
+config VIDEO_MVEBU
+       bool "Armada XP LCD controller"
+       default n
+       ---help---
+       Support for the LCD controller integrated in the Marvell
+       Armada XP SoC.
+
+config I2C_EDID
+       bool "Enable EDID library"
+       depends on DM_I2C
+       default n
+       help
+          This enables library for accessing EDID data from an LCD panel.
+
 config DISPLAY
        bool "Enable Display support"
        depends on DM
-       default y
+       default n
+       select I2C_EDID
        help
           This supports drivers that provide a display, such as eDP (Embedded
           DisplayPort) and HDMI (High Definition Multimedia Interface).
index 0910510c748fa5f62d962535e28d1f8d15a9432e..be908f6ed8f788324d865b68261a1fe29c04da97 100644 (file)
@@ -47,6 +47,7 @@ obj-$(CONFIG_VIDEO_LCD_SSD2828) += ssd2828.o
 obj-$(CONFIG_VIDEO_MB862xx) += mb862xx.o videomodes.o
 obj-$(CONFIG_VIDEO_MX3) += mx3fb.o videomodes.o
 obj-$(CONFIG_VIDEO_IPUV3) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o
+obj-$(CONFIG_VIDEO_MVEBU) += mvebu_lcd.o
 obj-$(CONFIG_VIDEO_MXS) += mxsfb.o videomodes.o
 obj-$(CONFIG_VIDEO_OMAP3) += omap3_dss.o
 obj-$(CONFIG_VIDEO_SANDBOX_SDL) += sandbox_sdl.o
diff --git a/drivers/video/mvebu_lcd.c b/drivers/video/mvebu_lcd.c
new file mode 100644 (file)
index 0000000..86dae52
--- /dev/null
@@ -0,0 +1,532 @@
+/*
+ * Video driver for Marvell Armada XP SoC
+ *
+ * Initialization of LCD interface and setup of SPLASH screen image
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <video_fb.h>
+#include <linux/mbus.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/soc.h>
+
+#define MVEBU_LCD_WIN_CONTROL(w)        (MVEBU_LCD_BASE + 0xf000 + ((w) << 4))
+#define MVEBU_LCD_WIN_BASE(w)           (MVEBU_LCD_BASE + 0xf004 + ((w) << 4))
+#define MVEBU_LCD_WIN_REMAP(w)          (MVEBU_LCD_BASE + 0xf00c + ((w) << 4))
+
+#define MVEBU_LCD_CFG_DMA_START_ADDR_0 (MVEBU_LCD_BASE + 0x00cc)
+#define MVEBU_LCD_CFG_DMA_START_ADDR_1 (MVEBU_LCD_BASE + 0x00dc)
+
+#define MVEBU_LCD_CFG_GRA_START_ADDR0  (MVEBU_LCD_BASE + 0x00f4)
+#define MVEBU_LCD_CFG_GRA_START_ADDR1  (MVEBU_LCD_BASE + 0x00f8)
+#define MVEBU_LCD_CFG_GRA_PITCH                (MVEBU_LCD_BASE + 0x00fc)
+#define MVEBU_LCD_SPU_GRA_OVSA_HPXL_VLN        (MVEBU_LCD_BASE + 0x0100)
+#define MVEBU_LCD_SPU_GRA_HPXL_VLN     (MVEBU_LCD_BASE + 0x0104)
+#define MVEBU_LCD_SPU_GZM_HPXL_VLN     (MVEBU_LCD_BASE + 0x0108)
+#define MVEBU_LCD_SPU_HWC_OVSA_HPXL_VLN        (MVEBU_LCD_BASE + 0x010c)
+#define MVEBU_LCD_SPU_HWC_HPXL_VLN     (MVEBU_LCD_BASE + 0x0110)
+#define MVEBU_LCD_SPUT_V_H_TOTAL       (MVEBU_LCD_BASE + 0x0114)
+#define MVEBU_LCD_SPU_V_H_ACTIVE       (MVEBU_LCD_BASE + 0x0118)
+#define MVEBU_LCD_SPU_H_PORCH          (MVEBU_LCD_BASE + 0x011c)
+#define MVEBU_LCD_SPU_V_PORCH          (MVEBU_LCD_BASE + 0x0120)
+#define MVEBU_LCD_SPU_BLANKCOLOR       (MVEBU_LCD_BASE + 0x0124)
+#define MVEBU_LCD_SPU_ALPHA_COLOR1     (MVEBU_LCD_BASE + 0x0128)
+#define MVEBU_LCD_SPU_ALPHA_COLOR2     (MVEBU_LCD_BASE + 0x012c)
+#define MVEBU_LCD_SPU_COLORKEY_Y       (MVEBU_LCD_BASE + 0x0130)
+#define MVEBU_LCD_SPU_COLORKEY_U       (MVEBU_LCD_BASE + 0x0134)
+#define MVEBU_LCD_SPU_COLORKEY_V       (MVEBU_LCD_BASE + 0x0138)
+#define MVEBU_LCD_CFG_RDREG4F          (MVEBU_LCD_BASE + 0x013c)
+#define MVEBU_LCD_SPU_SPI_RXDATA       (MVEBU_LCD_BASE + 0x0140)
+#define MVEBU_LCD_SPU_ISA_RXDATA       (MVEBU_LCD_BASE + 0x0144)
+#define MVEBU_LCD_SPU_DBG_ISA          (MVEBU_LCD_BASE + 0x0148)
+
+#define MVEBU_LCD_SPU_HWC_RDDAT                (MVEBU_LCD_BASE + 0x0158)
+#define MVEBU_LCD_SPU_GAMMA_RDDAT      (MVEBU_LCD_BASE + 0x015c)
+#define MVEBU_LCD_SPU_PALETTE_RDDAT    (MVEBU_LCD_BASE + 0x0160)
+#define MVEBU_LCD_SPU_IOPAD_IN         (MVEBU_LCD_BASE + 0x0178)
+#define MVEBU_LCD_FRAME_COUNT          (MVEBU_LCD_BASE + 0x017c)
+#define MVEBU_LCD_SPU_DMA_CTRL0                (MVEBU_LCD_BASE + 0x0190)
+#define MVEBU_LCD_SPU_DMA_CTRL1                (MVEBU_LCD_BASE + 0x0194)
+#define MVEBU_LCD_SPU_SRAM_CTRL                (MVEBU_LCD_BASE + 0x0198)
+#define MVEBU_LCD_SPU_SRAM_WRDAT       (MVEBU_LCD_BASE + 0x019c)
+#define MVEBU_LCD_SPU_SRAM_PARA0       (MVEBU_LCD_BASE + 0x01a0)
+#define MVEBU_LCD_SPU_SRAM_PARA1       (MVEBU_LCD_BASE + 0x01a4)
+#define MVEBU_LCD_CFG_SCLK_DIV         (MVEBU_LCD_BASE + 0x01a8)
+#define MVEBU_LCD_SPU_CONTRAST         (MVEBU_LCD_BASE + 0x01ac)
+#define MVEBU_LCD_SPU_SATURATION       (MVEBU_LCD_BASE + 0x01b0)
+#define MVEBU_LCD_SPU_CBSH_HUE         (MVEBU_LCD_BASE + 0x01b4)
+#define MVEBU_LCD_SPU_DUMB_CTRL                (MVEBU_LCD_BASE + 0x01b8)
+#define MVEBU_LCD_SPU_IOPAD_CONTROL    (MVEBU_LCD_BASE + 0x01bc)
+#define MVEBU_LCD_SPU_IRQ_ENA_2                (MVEBU_LCD_BASE + 0x01d8)
+#define MVEBU_LCD_SPU_IRQ_ISR_2                (MVEBU_LCD_BASE + 0x01dc)
+#define MVEBU_LCD_SPU_IRQ_ENA          (MVEBU_LCD_BASE + 0x01c0)
+#define MVEBU_LCD_SPU_IRQ_ISR          (MVEBU_LCD_BASE + 0x01c4)
+#define MVEBU_LCD_ADLL_CTRL            (MVEBU_LCD_BASE + 0x01c8)
+#define MVEBU_LCD_CLK_DIS              (MVEBU_LCD_BASE + 0x01cc)
+#define MVEBU_LCD_VGA_HVSYNC_DELAY     (MVEBU_LCD_BASE + 0x01d4)
+#define MVEBU_LCD_CLK_CFG_0            (MVEBU_LCD_BASE + 0xf0a0)
+#define MVEBU_LCD_CLK_CFG_1            (MVEBU_LCD_BASE + 0xf0a4)
+#define MVEBU_LCD_LVDS_CLK_CFG         (MVEBU_LCD_BASE + 0xf0ac)
+
+#define MVEBU_LVDS_PADS_REG            (MVEBU_SYSTEM_REG_BASE + 0xf0)
+
+/* Setup Mbus Bridge Windows for LCD */
+static void mvebu_lcd_conf_mbus_registers(void)
+{
+       const struct mbus_dram_target_info *dram;
+       int i;
+
+       dram = mvebu_mbus_dram_info();
+
+       /* Disable windows, set size/base/remap to 0  */
+       for (i = 0; i < 6; i++) {
+               writel(0, MVEBU_LCD_WIN_CONTROL(i));
+               writel(0, MVEBU_LCD_WIN_BASE(i));
+               writel(0, MVEBU_LCD_WIN_REMAP(i));
+       }
+
+       /* Write LCD bridge window registers */
+       for (i = 0; i < dram->num_cs; i++) {
+               const struct mbus_dram_window *cs = dram->cs + i;
+               writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) |
+                      (dram->mbus_dram_target_id << 4) | 1,
+                      MVEBU_LCD_WIN_CONTROL(i));
+
+               writel(cs->base & 0xffff0000, MVEBU_LCD_WIN_BASE(i));
+       }
+}
+
+/* Initialize LCD registers */
+int mvebu_lcd_register_init(struct mvebu_lcd_info *lcd_info)
+{
+       /* Local variable for easier handling */
+       int x = lcd_info->x_res;
+       int y = lcd_info->y_res;
+       u32 val;
+
+       /* Setup Mbus Bridge Windows */
+       mvebu_lcd_conf_mbus_registers();
+
+       /*
+        * Set LVDS Pads Control Register
+        * wr 0 182F0 FFE00000
+        */
+       clrbits_le32(MVEBU_LVDS_PADS_REG, 0x1f << 16);
+
+       /*
+        * Set the LCD_CFG_GRA_START_ADDR0/1 Registers
+        * This is supposed to point to the "physical" memory at memory
+        * end (currently 1GB-64MB but also may be 2GB-64MB).
+        * See also the Window 0 settings!
+        */
+       writel(lcd_info->fb_base, MVEBU_LCD_CFG_GRA_START_ADDR0);
+       writel(lcd_info->fb_base, MVEBU_LCD_CFG_GRA_START_ADDR1);
+
+       /*
+        * Set the LCD_CFG_GRA_PITCH Register
+        * Bits 31-28: Duty Cycle of Backlight. value/16=High (0x8=Mid Setting)
+        * Bits 25-16: Backlight divider from 32kHz Clock
+        *             (here 16=0x10 for 1kHz)
+        * Bits 15-00: Line Length in Bytes
+        *             240*2 (for RGB1555)=480=0x1E0
+        */
+       writel(0x80100000 + 2 * x, MVEBU_LCD_CFG_GRA_PITCH);
+
+       /*
+        * Set the LCD_SPU_GRA_OVSA_HPXL_VLN Register
+        * Bits 31-16: Vertical start of graphical overlay on screen
+        * Bits 15-00: Horizontal start of graphical overlay on screen
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_GRA_OVSA_HPXL_VLN);
+
+       /*
+        * Set the LCD_SPU_GRA_HPXL_VLN Register
+        * Bits 31-16: Vertical size of graphical overlay 320=0x140
+        * Bits 15-00: Horizontal size of graphical overlay 240=0xF0
+        * Values before zooming
+        */
+       writel((y << 16) | x, MVEBU_LCD_SPU_GRA_HPXL_VLN);
+
+       /*
+        * Set the LCD_SPU_GZM_HPXL_VLN Register
+        * Bits 31-16: Vertical size of graphical overlay 320=0x140
+        * Bits 15-00: Horizontal size of graphical overlay 240=0xF0
+        * Values after zooming
+        */
+       writel((y << 16) | x, MVEBU_LCD_SPU_GZM_HPXL_VLN);
+
+       /*
+        * Set the LCD_SPU_HWC_OVSA_HPXL_VLN Register
+        * Bits 31-16: Vertical position of HW Cursor 320=0x140
+        * Bits 15-00: Horizontal position of HW Cursor 240=0xF0
+        */
+       writel((y << 16) | x, MVEBU_LCD_SPU_HWC_OVSA_HPXL_VLN);
+
+       /*
+        * Set the LCD_SPU_HWC_OVSA_HPXL_VLN Register
+        * Bits 31-16: Vertical size of HW Cursor
+        * Bits 15-00: Horizontal size of HW Cursor
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_HWC_HPXL_VLN);
+
+       /*
+        * Set the LCD_SPU_HWC_OVSA_HPXL_VLN Register
+        * Bits 31-16: Screen total vertical lines:
+        *             VSYNC                = 1
+        *             Vertical Front Porch = 2
+        *             Vertical Lines       = 320
+        *             Vertical Back Porch  = 2
+        *             SUM                  = 325 = 0x0145
+        * Bits 15-00: Screen total horizontal pixels:
+        *             HSYNC                  = 1
+        *             Horizontal Front Porch = 44
+        *             Horizontal Lines       = 240
+        *             Horizontal Back Porch  = 2
+        *             SUM                    = 287 = 0x011F
+        * Note: For the display the backporch is between SYNC and
+        *       the start of the pixels.
+        *       This is not certain for the Marvell (!?)
+        */
+       val = ((y + lcd_info->y_fp + lcd_info->y_bp + 1) << 16) |
+               (x + lcd_info->x_fp + lcd_info->x_bp + 1);
+       writel(val, MVEBU_LCD_SPUT_V_H_TOTAL);
+
+       /*
+        * Set the LCD_SPU_V_H_ACTIVE Register
+        * Bits 31-16: Screen active vertical lines 320=0x140
+        * Bits 15-00: Screen active horizontakl pixels 240=0x00F0
+        */
+       writel((y << 16) | x, MVEBU_LCD_SPU_V_H_ACTIVE);
+
+       /*
+        * Set the LCD_SPU_H_PORCH Register
+        * Bits 31-16: Screen horizontal backporch 44=0x2c
+        * Bits 15-00: Screen horizontal frontporch 2=0x02
+        * Note: The terms "front" and "back" for the Marvell seem to be
+        *       exactly opposite to the display.
+        */
+       writel((lcd_info->x_fp << 16) | lcd_info->x_bp, MVEBU_LCD_SPU_H_PORCH);
+
+       /*
+        * Set the LCD_SPU_V_PORCH Register
+        * Bits 31-16: Screen vertical backporch  2=0x02
+        * Bits 15-00: Screen vertical frontporch 2=0x02
+        * Note: The terms "front" and "back" for the Marvell seem to be exactly
+        *       opposite to the display.
+        */
+       writel((lcd_info->y_fp << 16) | lcd_info->y_bp, MVEBU_LCD_SPU_V_PORCH);
+
+       /*
+        * Set the LCD_SPU_BLANKCOLOR Register
+        * This should be black = 0
+        * For tests this is magenta=00FF00FF
+        */
+       writel(0x00FF00FF, MVEBU_LCD_SPU_BLANKCOLOR);
+
+       /*
+        * Registers in the range of 0x0128 to 0x012C are colors for the cursor
+        * Registers in the range of 0x0130 to 0x0138 are colors for video
+        * color keying
+        */
+
+       /*
+        * Set the LCD_SPU_RDREG4F Register
+        * Bits 31-12: Reservd
+        * Bit     11: SRAM Wait
+        * Bit     10: Smart display fast TX (must be 1)
+        * Bit      9: DMA Arbitration Video/Graphics overlay: 0=interleaved
+        * Bit      8: FIFO watermark for DMA: 0=disable
+        * Bits 07-00: Empty 8B FIFO entries to trigger DMA, default=0x80
+        */
+       writel(0x00000780, MVEBU_LCD_CFG_RDREG4F);
+
+       /*
+        * Set the LCD_SPU_DMACTRL 0 Register
+        * Bit     31: Disable overlay blending 1=disable
+        * Bit     30: Gamma correction enable, 0=disable
+        * Bit     29: Video Contrast/Saturation/Hue Adjust enable, 0=disable
+        * Bit     28: Color palette enable, 0=disable
+        * Bit     27: DMA AXI Arbiter, 1=default
+        * Bit     26: HW Cursor 1-bit mode
+        * Bit     25: HW Cursor or 1- or 2-bit mode
+        * Bit     24: HW Cursor enabled, 0=disable
+        * Bits 23-20: Graphics Memory Color Format: 0x1=RGB1555
+        * Bits 19-16: Video Memory Color Format:    0x1=RGB1555
+        * Bit     15: Memory Toggle between frame 0 and 1: 0=disable
+        * Bit     14: Graphics horizontal scaling enable: 0=disable
+        * Bit     13: Graphics test mode: 0=disable
+        * Bit     12: Graphics SWAP R and B: 0=disable
+        * Bit     11: Graphics SWAP U and V: 0=disable
+        * Bit     10: Graphics SWAP Y and U/V: 0=disable
+        * Bit     09: Graphic YUV to RGB Conversion: 0=disable
+        * Bit     08: Graphic Transfer: 1=enable
+        * Bit     07: Memory Toggle: 0=disable
+        * Bit     06: Video horizontal scaling enable: 0=disable
+        * Bit     05: Video test mode: 0=disable
+        * Bit     04: Video SWAP R and B: 0=disable
+        * Bit     03: Video SWAP U and V: 0=disable
+        * Bit     02: Video SWAP Y and U/V: 0=disable
+        * Bit     01: Video YUV to RGB Conversion: 0=disable
+        * Bit     00: Video  Transfer: 0=disable
+        */
+       writel(0x88111100, MVEBU_LCD_SPU_DMA_CTRL0);
+
+       /*
+        * Set the LCD_SPU_DMA_CTRL1 Register
+        * Bit     31: Manual DMA Trigger = 0
+        * Bits 30-28: DMA Trigger Source: 0x2 VSYNC
+        * Bit     28: VSYNC_INV: 0=Rising Edge, 1=Falling Edge
+        * Bits 26-24: Color Key Mode: 0=disable
+        * Bit     23: Fill low bits: 0=fill with zeroes
+        * Bit     22: Reserved
+        * Bit     21: Gated Clock: 0=disable
+        * Bit     20: Power Save enable: 0=disable
+        * Bits 19-18: Reserved
+        * Bits 17-16: Configure Video/Graphic Path: 0x1: Graphic path alpha.
+        * Bits 15-08: Configure Alpha: 0x00.
+        * Bits 07-00: Reserved.
+        */
+       writel(0x20010000, MVEBU_LCD_SPU_DMA_CTRL1);
+
+       /*
+        * Set the LCD_SPU_SRAM_CTRL Register
+        * Reset to default = 0000C000
+        * Bits 15-14: SRAM control: init=0x3, Read=0, Write=2
+        * Bits 11-08: SRAM address ID: 0=gamma_yr, 1=gammy_ug, 2=gamma_vb,
+        *             3=palette, 15=cursor
+        */
+       writel(0x0000C000, MVEBU_LCD_SPU_SRAM_CTRL);
+
+       /*
+        * LCD_SPU_SRAM_WRDAT register: 019C
+        * LCD_SPU_SRAM_PARA0 register: 01A0
+        * LCD_SPU_SRAM_PARA1 register: 01A4 - Cursor control/Power settings
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_SRAM_PARA1);
+
+
+       /* Clock settings in the at 01A8 and in the range F0A0 see below */
+
+       /*
+        * Set LCD_SPU_CONTRAST
+        * Bits 31-16: Brightness sign ext. 8-bit value +255 to -255: default=0
+        * Bits 15-00: Contrast sign ext. 8-bit value +255 to -255: default=0
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_CONTRAST);
+
+       /*
+        * Set LCD_SPU_SATURATION
+        * Bits 31-16: Multiplier signed 4.12 fixed point value
+        * Bits 15-00: Saturation signed 4.12 fixed point value
+        */
+       writel(0x10001000, MVEBU_LCD_SPU_SATURATION);
+
+       /*
+        * Set LCD_SPU_HUE
+        * Bits 31-16: Sine signed 2.14 fixed point value
+        * Bits 15-00: Cosine signed 2.14 fixed point value
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_CBSH_HUE);
+
+       /*
+        * Set LCD_SPU_DUMB_CTRL
+        * Bits 31-28: LCD Type: 3=18 bit RGB | 6=24 bit RGB888
+        * Bits 27-12: Reserved
+        * Bit     11: LCD DMA Pipeline Enable: 1=Enable
+        * Bits 10-09: Reserved
+        * Bit      8: LCD GPIO pin (??)
+        * Bit      7: Reverse RGB
+        * Bit      6: Invert composite blank signal DE/EN (??)
+        * Bit      5: Invert composite sync signal
+        * Bit      4: Invert Pixel Valid Enable DE/EN (??)
+        * Bit      3: Invert VSYNC
+        * Bit      2: Invert HSYNC
+        * Bit      1: Invert Pixel Clock
+        * Bit      0: Enable LCD Panel: 1=Enable
+        * Question: Do we have to disable Smart and Dumb LCD
+        * and separately enable LVDS?
+        */
+       writel(0x6000080F, MVEBU_LCD_SPU_DUMB_CTRL);
+
+       /*
+        * Set LCD_SPU_IOPAD_CTRL
+        * Bits 31-20: Reserved
+        * Bits 19-18: Vertical Interpolation: 0=Disable
+        * Bits 17-16: Reserved
+        * Bit     15: Graphics Vertical Mirror enable: 0=disable
+        * Bit     14: Reserved
+        * Bit     13: Video Vertical Mirror enable: 0=disable
+        * Bit     12: Reserved
+        * Bit     11: Command Vertical Mirror enable: 0=disable
+        * Bit     10: Reserved
+        * Bits 09-08: YUV to RGB Color space conversion: 0 (Not used)
+        * Bits 07-04: AXI Bus Master: 0x4: no crossing of 4k boundary,
+        *             128 Bytes burst
+        * Bits 03-00: LCD pins: ??? 0=24-bit Dump panel ??
+        */
+       writel(0x000000C0, MVEBU_LCD_SPU_IOPAD_CONTROL);
+
+       /*
+        * Set SUP_IRQ_ENA_2: Disable all interrupts
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_IRQ_ENA_2);
+
+       /*
+        * Set SUP_IRQ_ENA: Disable all interrupts.
+        */
+       writel(0x00000000, MVEBU_LCD_SPU_IRQ_ENA);
+
+       /*
+        * Set up ADDL Control Register
+        * Bits 31-29: 0x0 = Fastest Delay Line (default)
+        *             0x3 = Slowest Delay Line (default)
+        * Bit     28: Calibration done status.
+        * Bit     27: Reserved
+        * Bit     26: Set Pixel Clock to ADDL output
+        * Bit     25: Reduce CAL Enable
+        * Bits 24-22: Manual calibration value.
+        * Bit     21: Manual calibration enable.
+        * Bit     20: Restart Auto Cal
+        * Bits 19-16: Calibration Threshold voltage, default= 0x2
+        * Bite 15-14: Reserved
+        * Bits 13-11: Divisor for ADDL Clock: 0x1=/2, 0x3=/8, 0x5=/16
+        * Bit     10: Power Down ADDL module, default = 1!
+        * Bits 09-08: Test point configuration: 0x2=Bias, 0x3=High-z
+        * Bit     07: Reset ADDL
+        * Bit     06: Invert ADLL Clock
+        * Bits 05-00: Delay taps, 0x3F=Half Cycle, 0x00=No delay
+        * Note: ADLL is used for a VGA interface with DAC - not used here
+        */
+       writel(0x00000000, MVEBU_LCD_ADLL_CTRL);
+
+       /*
+        * Set the LCD_CLK_DIS Register:
+        * Bits 3 and 4 must be 1
+        */
+       writel(0x00000018, MVEBU_LCD_CLK_DIS);
+
+       /*
+        * Set the LCD_VGA_HSYNC/VSYNC Delay Register:
+        * Bits 03-00: Sets the delay for the HSYNC and VSYNC signals
+        */
+       writel(0x00000000, MVEBU_LCD_VGA_HVSYNC_DELAY);
+
+       /*
+        * Clock registers
+        * See page 475 in the functional spec.
+        */
+
+       /* Step 1 and 2: Disable the PLL */
+
+       /*
+        * Disable PLL, see "LCD Clock Configuration 1 Register" below
+        */
+       writel(0x8FF40007, MVEBU_LCD_CLK_CFG_1);
+
+       /*
+        * Powerdown, see "LCD Clock Configuration 0 Register" below
+        */
+       writel(0x94000174, MVEBU_LCD_CLK_CFG_0);
+
+       /*
+        * Set the LCD_CFG_SCLK_DIV Register
+        * This is set fix to 0x40000001 for the LVDS output:
+        * Bits 31-30: SCLCK Source: 0=AXIBus, 1=AHBus, 2=PLLDivider0
+        * Bits 15-01: Clock Divider: Bypass for LVDS=0x0001
+        * See page 475 in section 28.5.
+        */
+       writel(0x80000001, MVEBU_LCD_CFG_SCLK_DIV);
+
+       /*
+        * Set the LCD Clock Configuration 0 Register:
+        * Bit     31: Powerdown: 0=Power up
+        * Bits 30-29: Reserved
+        * Bits 28-26: PLL_KDIV: This encodes K
+        *             K=16 => 0x5
+        * Bits 25-17: PLL_MDIV: This is M-1:
+        *             M=1 => 0x0
+        * Bits 16-13: VCO band: 0x1 for 700-920MHz
+        * Bits 12-04: PLL_NDIV: This is N-1 and corresponds to R1_CTRL!
+        *             N=28=0x1C => 0x1B
+        * Bits 03-00: R1_CTRL (for N=28 => 0x4)
+        */
+       writel(0x940021B4, MVEBU_LCD_CLK_CFG_0);
+
+       /*
+        * Set the LCD Clock Configuration 1 Register:
+        * Bits 31-19: Reserved
+        * Bit     18: Select PLL: Core PLL, 1=Dedicated PPL
+        * Bit     17: Clock Output Enable: 0=disable, 1=enable
+        * Bit     16: Select RefClk: 0=RefClk (25MHz), 1=External
+        * Bit     15: Half-Div, Device Clock by DIV+0.5*Half-Dev
+        * Bits 14-13: Reserved
+        * Bits 12-00: PLL Full Divider [Note: Assumed to be the Post-Divider
+        *             M' for LVDS=7!]
+        */
+       writel(0x8FF40007, MVEBU_LCD_CLK_CFG_1);
+
+       /*
+        * Set the LVDS Clock Configuration Register:
+        * Bit     31: Clock Gating for the input clock to the LVDS
+        * Bit     30: LVDS Serializer enable: 1=Enabled
+        * Bits 29-11: Reserved
+        * Bit  11-08: LVDS Clock delay: 0x02 (default): by 2 pixel clock/7
+        * Bits 07-02: Reserved
+        * Bit     01: 24bbp Option: 0=Option_1,1=Option2
+        * Bit     00: 1=24bbp Panel: 0=18bpp Panel
+        * Note: Bits 0 and must be verified with the help of the
+        *       Interface/display
+        */
+       writel(0xC0000201, MVEBU_LCD_LVDS_CLK_CFG);
+
+       /*
+        * Power up PLL (Clock Config 0)
+        */
+       writel(0x140021B4, MVEBU_LCD_CLK_CFG_0);
+
+       /* wait 10 ms */
+       mdelay(10);
+
+       /*
+        * Enable PLL (Clock Config 1)
+        */
+       writel(0x8FF60007, MVEBU_LCD_CLK_CFG_1);
+
+       return 0;
+}
+
+int __weak board_video_init(void)
+{
+       return -1;
+}
+
+void *video_hw_init(void)
+{
+       static GraphicDevice mvebufb;
+       GraphicDevice *pGD = &mvebufb;
+       u32 val;
+
+       /*
+        * The board code needs to call mvebu_lcd_register_init()
+        * in its board_video_init() implementation, with the board
+        * specific parameters for its LCD.
+        */
+       if (board_video_init() || !readl(MVEBU_LCD_CFG_GRA_START_ADDR0))
+               return NULL;
+
+       /* Provide the necessary values for the U-Boot video IF */
+       val = readl(MVEBU_LCD_SPU_V_H_ACTIVE);
+       pGD->winSizeY = val >> 16;
+       pGD->winSizeX = val & 0x0000ffff;
+       pGD->gdfBytesPP = 2;
+       pGD->gdfIndex = GDF_15BIT_555RGB;
+       pGD->frameAdrs = readl(MVEBU_LCD_CFG_GRA_START_ADDR0);
+
+       debug("LCD: buffer at 0x%08x resolution %dx%d\n", pGD->frameAdrs,
+             pGD->winSizeX, pGD->winSizeY);
+
+       return pGD;
+}
index dbde7035aa556d5f3060dfe81eac13a6e8b445b8..c4ac153ef3602bf6f2a66128d3bb63a3ffbcb416 100644 (file)
@@ -45,4 +45,4 @@ dtbs: $(obj)/dt.dtb
 clean-files := dt.dtb.S
 
 # Let clean descend into dts directories
-subdir- += ../arch/*/dts
+subdir- += ../arch/arm/dts ../arch/microblaze/dts ../arch/mips/dts ../arch/sandbox/dts ../arch/x86/dts
index d0fcd83058fa600228dc5db9111e0872eb8aa2a9..176125e38090e8791d19c60cb9eee3a0811a516d 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/err.h>
 #endif
 #include "ubifs.h"
+#include <linux/bug.h>
 #include <linux/list_sort.h>
 
 /**
index abe861a976a81aba4921a5c46771135f0733982c..dcf3a479479d6e786462ff9af60b807a5288117d 100644 (file)
@@ -31,6 +31,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <memalign.h>
+#include <linux/bug.h>
 #include <linux/log2.h>
 #include <linux/stat.h>
 #include <linux/err.h>
index 0ee21b62806bf51f7e7b227daa9f6d43a9a8b5d1..04cd8c2be48b2e516cc3c27fb755626e091d2a4b 100644 (file)
@@ -45,6 +45,8 @@
 #define AXP221_ALDO3_CTRL      0x2a
 #define AXP221_VBUS_IPSOUT     0x30
 #define AXP221_VBUS_IPSOUT_DRIVEBUS    (1 << 2)
+#define AXP221_SHUTDOWN                0x32
+#define AXP221_SHUTDOWN_POWEROFF       (1 << 7)
 #define AXP221_MISC_CTRL       0x8f
 #define AXP221_MISC_CTRL_N_VBUSEN_FUNC (1 << 4)
 #define AXP221_PAGE            0xff
index 1dc6456950b616d49443fd1436fff60b4558c8dc..46d05ad04b8ac6fe2c73b86fe71d30231961c238 100644 (file)
 #define AXP818_OUTPUT_CTRL3_ALDO2_EN   (1 << 6)
 #define AXP818_OUTPUT_CTRL3_ALDO3_EN   (1 << 7)
 
-#define AXP818_DCDC1_CTRL      0x20
-#define AXP818_DCDC2_CTRL      0x21
-#define AXP818_DCDC3_CTRL      0x22
-#define AXP818_DCDC4_CTRL      0x23
-#define AXP818_DCDC5_CTRL      0x24
-#define AXP818_DCDC6_CTRL      0x25
-
 #define AXP818_DLDO1_CTRL      0x15
 #define AXP818_DLDO2_CTRL      0x16
 #define AXP818_DLDO3_CTRL      0x17
@@ -46,7 +39,6 @@
 #define AXP818_ELDO1_CTRL      0x19
 #define AXP818_ELDO2_CTRL      0x1a
 #define AXP818_ELDO3_CTRL      0x1b
-#define AXP818_ELDO3_CTRL      0x1b
 #define AXP818_FLDO1_CTRL      0x1c
 #define AXP818_FLDO2_3_CTRL    0x1d
 #define AXP818_DCDC1_CTRL      0x20
index 3b01c49cc935def3eb6a5d4a1585acbe396b5855..0f146835091b2784949c6f404c97b6a644528597 100644 (file)
@@ -29,10 +29,7 @@ int axp_set_aldo1(unsigned int mvolt);
 int axp_set_aldo2(unsigned int mvolt);
 int axp_set_aldo3(unsigned int mvolt);
 int axp_set_aldo4(unsigned int mvolt);
-int axp_set_dldo1(unsigned int mvolt);
-int axp_set_dldo2(unsigned int mvolt);
-int axp_set_dldo3(unsigned int mvolt);
-int axp_set_dldo4(unsigned int mvolt);
+int axp_set_dldo(int dldo_num, unsigned int mvolt);
 int axp_set_eldo(int eldo_num, unsigned int mvolt);
 int axp_init(void);
 int axp_get_sid(unsigned int *sid);
index 80979edd04532ee4b89407b623cfcc11b8289c2e..75712636884eb37acc5b635d49ce3b69613c4ac3 100644 (file)
@@ -31,7 +31,11 @@ typedef struct {
        int bus;
        u32 VendorID;
        u32 DeviceID;
+#ifdef CONFIG_DM_PCI
+       struct udevice *pcidev;
+#else
        pci_dev_t pcidev;
+#endif
        void *BIOSImage;
        u32 BIOSImageLen;
        u8 LowMem[1536];
@@ -39,7 +43,12 @@ typedef struct {
 
 struct vbe_mode_info;
 
-int BootVideoCardBIOS(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo, int cleanUp);
+#ifdef CONFIG_DM_PCI
+int BootVideoCardBIOS(struct udevice *pcidev, BE_VGAInfo **pVGAInfo,
+                     int clean_up);
+#else
+int BootVideoCardBIOS(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo, int clean_up);
+#endif
 
 /* Run a BIOS ROM natively (only supported on x86 machines) */
 void bios_run_on_x86(struct udevice *dev, unsigned long addr, int vesa_mode,
@@ -57,10 +66,18 @@ void bios_set_interrupt_handler(int intnum, int (*int_handler_func)(void));
 
 void biosemu_set_interrupt_handler(int intnum, int (*int_func)(void));
 
+#ifdef CONFIG_DM_PCI
+int biosemu_setup(struct udevice *pcidev, BE_VGAInfo **pVGAInfo);
+
+int biosemu_run(struct udevice *dev, uchar *bios_rom, int bios_len,
+               BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
+               struct vbe_mode_info *mode_info);
+#else
 int biosemu_setup(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo);
 
 int biosemu_run(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
                BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
                struct vbe_mode_info *mode_info);
+#endif
 
 #endif
index 7bed0cc0d120e5f31a51cc5af41d9195cc818621..1563d649f01cd869c35fef7f2c2a160f42ee969c 100644 (file)
@@ -146,9 +146,6 @@ void __assert_fail(const char *assertion, const char *file, unsigned line,
 #define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
 #endif /* BUG */
 
-/* Force a compilation error if condition is true */
-#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
-
 typedef void (interrupt_handler_t)(void *);
 
 #include <asm/u-boot.h> /* boot information for Linux kernel */
index eb4d52c6f5e21750d0716990e002f4c64cf24308..c1a0a6ced91b9376db764dcbd7519e7d975a72e4 100644 (file)
@@ -606,6 +606,16 @@ unsigned long get_board_ddr_clk(void);
 #define I2C_VOL_MONITOR_BUS_V_OVF      0x1
 #define I2C_VOL_MONITOR_BUS_V_SHIFT    3
 
+#define CONFIG_VID_FLS_ENV             "t4240rdb_vdd_mv"
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_VID
+#endif
+#define CONFIG_VOL_MONITOR_IR36021_SET
+#define CONFIG_VOL_MONITOR_IR36021_READ
+/* The lowest and highest voltage allowed for T4240RDB */
+#define VDD_MV_MIN                     819
+#define VDD_MV_MAX                     1212
+
 /*
  * eSPI - Enhanced SPI
  */
index 150e8765d642cb6664ea558c148f4a139aae8eca..67f45c0f908c36ac5f3687c08be007e7c836bed6 100644 (file)
@@ -30,7 +30,6 @@
 #define CONFIG_SPL_POWER_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
 
-#define CONFIG_I2C_EDID
 #define CONFIG_SYS_WHITE_ON_BLACK
 #define CONFIG_CONSOLE_SCROLL_LINES            10
 
index d6423e7e554d21bd989fb71d91613735741e8ce0..a29f55709dd815dd187b54eea724e0023ae473c5 100644 (file)
@@ -24,7 +24,6 @@
  */
 #define CONFIG_ENV_OFFSET (96 * 1024)
 
-#define CONFIG_I2C_EDID
 #define CONFIG_SYS_WHITE_ON_BLACK
 #define CONFIG_CONSOLE_SCROLL_LINES            10
 
diff --git a/include/configs/fx12mm.h b/include/configs/fx12mm.h
deleted file mode 100644 (file)
index fa32a2e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * (C) Copyright 2008
- *
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology  http://qtec.com
- *
- * Georg Schardt <schardt@team-ctech.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-/*
- * Configuration file for the Virtex4FX12 Minimodul by Avnet/Memec,
- * see http://www.em.avnet.com
- */
-
-#ifndef __CONFIG_FX12_H
-#define __CONFIG_FX12_H
-
-#include "../board/avnet/fx12mm/xparameters.h"
-
-/* cmd config */
-#define CONFIG_CMD_JFFS2
-#define CONFIG_CMD_MTDPARTS
-#define CONFIG_MTD_DEVICE              /* needed for mtdparts commands */
-#define CONFIG_FLASH_CFI_MTD
-
-/* sdram */
-#define CONFIG_SYS_SDRAM_SIZE_MB       64
-
-/* environment */
-#define CONFIG_ENV_IS_IN_FLASH  1
-#define CONFIG_ENV_SIZE         0x10000
-#define CONFIG_ENV_SECT_SIZE    0x10000
-#define CONFIG_SYS_ENV_OFFSET   0xA0000
-#define CONFIG_ENV_ADDR         (CONFIG_SYS_FLASH_BASE+CONFIG_SYS_ENV_OFFSET)
-#define CONFIG_ENV_OVERWRITE   1
-
-/*Misc*/
-#define CONFIG_PREBOOT         "echo U-Boot is up and running;"
-
-/*Flash*/
-#define CONFIG_SYS_FLASH_SIZE          (4*1024*1024)
-#define CONFIG_SYS_MAX_FLASH_SECT      71
-#define MTDIDS_DEFAULT         "nor0=fx12mm-flash"
-#define MTDPARTS_DEFAULT       "mtdparts=fx12mm-flash:-(user)"
-
-#include "configs/xilinx-ppc405.h"
-
-#endif /* __CONFIG_H */
index 43ce7fe25f18482a79e798e66e9e11237ded3699..68d3fd7384498b6cffdc953c6c5743c953fe49b9 100644 (file)
@@ -34,6 +34,7 @@
 #define CONFIG_SPL_SERIAL_SUPPORT
 #define CONFIG_SPL_I2C_SUPPORT
 #define CONFIG_SPL_GPIO_SUPPORT
+#define CONFIG_SPL_WATCHDOG_SUPPORT
 
 /* NAND support */
 #if defined(CONFIG_SPL_NAND_SUPPORT)
index f93861d770ee3effe181ae050cea09ec0775c686..97a0d86b912bdd9e663cbd1c5330070f92363669 100644 (file)
 #endif
 
 /* uart */
-#ifdef XILINX_UARTLITE_BASEADDR
-# define CONFIG_XILINX_UARTLITE
-# define CONFIG_SERIAL_BASE    XILINX_UARTLITE_BASEADDR
-# define CONFIG_BAUDRATE       XILINX_UARTLITE_BAUDRATE
-# define CONFIG_SYS_BAUDRATE_TABLE     { CONFIG_BAUDRATE }
-# define CONSOLE_ARG   "console=console=ttyUL0,115200\0"
-#elif XILINX_UART16550_BASEADDR
-# define CONFIG_SYS_NS16550_SERIAL
-# if defined(__MICROBLAZEEL__)
-#  define CONFIG_SYS_NS16550_REG_SIZE  -4
-# else
-#  define CONFIG_SYS_NS16550_REG_SIZE  4
-# endif
-# define CONFIG_CONS_INDEX             1
-# define CONFIG_SYS_NS16550_COM1 \
-               ((XILINX_UART16550_BASEADDR & ~0xF) + 0x1000)
-# define CONFIG_SYS_NS16550_CLK        XILINX_UART16550_CLOCK_HZ
 # define CONFIG_BAUDRATE       115200
-
 /* The following table includes the supported baudrates */
 # define CONFIG_SYS_BAUDRATE_TABLE \
        {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}
-# define CONSOLE_ARG   "console=console=ttyS0,115200\0"
-#else
-# error Undefined uart
-#endif
 
 /* setting reset address */
 /*#define      CONFIG_SYS_RESET_ADDRESS        CONFIG_SYS_TEXT_BASE*/
 
-/* ethernet */
-#undef CONFIG_SYS_ENET
-#if defined(XILINX_EMACLITE_BASEADDR) || defined(CONFIG_OF_CONTROL)
-# define CONFIG_XILINX_EMACLITE        1
-# define CONFIG_SYS_ENET
-#endif
-#if defined(XILINX_AXIEMAC_BASEADDR)
-# define CONFIG_XILINX_AXIEMAC 1
-# define CONFIG_SYS_ENET
-#endif
-
-#undef ET_DEBUG
-
 /* gpio */
 #ifdef XILINX_GPIO_BASEADDR
 # define CONFIG_XILINX_GPIO
 # define CONFIG_SYS_GPIO_0_ADDR                XILINX_GPIO_BASEADDR
 #endif
+#define CONFIG_BOARD_LATE_INIT
 
 /* interrupt controller */
 #ifdef XILINX_INTC_BASEADDR
 # endif
 #endif
 
-#if !defined(CONFIG_OF_CONTROL) || \
-       (defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_OF_CONTROL))
-/* ddr sdram - main memory */
-# define CONFIG_SYS_SDRAM_BASE XILINX_RAM_START
-# define CONFIG_SYS_SDRAM_SIZE XILINX_RAM_SIZE
-#endif
-
 #define CONFIG_SYS_MALLOC_LEN  0xC0000
 
 /* Stack location before relocation */
 #endif /* !SPIFLASH */
 #endif /* !FLASH */
 
-/* system ace */
-#ifdef XILINX_SYSACE_BASEADDR
-# define CONFIG_SYSTEMACE
-/* #define DEBUG_SYSTEMACE */
-# define SYSTEMACE_CONFIG_FPGA
-# define CONFIG_SYS_SYSTEMACE_BASE     XILINX_SYSACE_BASEADDR
-# define CONFIG_SYS_SYSTEMACE_WIDTH    XILINX_SYSACE_MEM_WIDTH
-# define CONFIG_DOS_PARTITION
-#endif
-
 #if defined(XILINX_USE_ICACHE)
 # define CONFIG_ICACHE
 #else
 # undef CONFIG_CMD_CACHE
 #endif
 
-#ifdef CONFIG_SYS_ENET
-# define CONFIG_CMD_PING
-# define CONFIG_CMD_DHCP
-# define CONFIG_CMD_TFTPPUT
-#endif
-
-#if defined(CONFIG_SYSTEMACE)
-# define CONFIG_CMD_EXT2
-# define CONFIG_CMD_FAT
-#endif
-
 #if defined(FLASH)
 # define CONFIG_CMD_JFFS2
 # define CONFIG_CMD_UBI
 #define        CONFIG_SYS_MAXARGS      15
 #define        CONFIG_SYS_LONGHELP
 /* default load address */
-#define        CONFIG_SYS_LOAD_ADDR    XILINX_RAM_START
+#define        CONFIG_SYS_LOAD_ADDR    0
 
 #define        CONFIG_BOOTDELAY        -1      /* -1 disables auto-boot */
 #define        CONFIG_BOOTARGS         "root=romfs"
 
 #define CONFIG_CMDLINE_EDITING
 
-#define CONFIG_NETCONSOLE
 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
 
-/* Use the HUSH parser */
-#define CONFIG_SYS_HUSH_PARSER
-
 /* Enable flat device tree support */
 #define CONFIG_LMB             1
-#define CONFIG_FIT             1
 #define CONFIG_OF_LIBFDT       1
 
 #if defined(CONFIG_XILINX_AXIEMAC)
 # define CONFIG_CMD_MII                1
 # define CONFIG_PHY_GIGE       1
 # define CONFIG_SYS_FAULT_ECHO_LINK_DOWN       1
-# define CONFIG_PHYLIB         1
 # define CONFIG_PHY_ATHEROS    1
 # define CONFIG_PHY_BROADCOM   1
 # define CONFIG_PHY_DAVICOM    1
 # define CONFIG_PHY_LXT                1
 # define CONFIG_PHY_MARVELL    1
 # define CONFIG_PHY_MICREL     1
+# define CONFIG_PHY_MICREL_KSZ9021
 # define CONFIG_PHY_NATSEMI    1
 # define CONFIG_PHY_REALTEK    1
 # define CONFIG_PHY_VITESSE    1
 #else
 # undef CONFIG_MII
 # undef CONFIG_CMD_MII
-# undef CONFIG_PHYLIB
 #endif
 
 /* SPL part */
diff --git a/include/configs/ml507.h b/include/configs/ml507.h
deleted file mode 100644 (file)
index 89a7290..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- *  This work has been supported by: QTechnology  http://qtec.com/
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-/*CPU*/
-#define CONFIG_440             1
-#define CONFIG_XILINX_ML507    1
-#include "../board/xilinx/ml507/xparameters.h"
-
-/*Mem Map*/
-#define CONFIG_SYS_SDRAM_SIZE_MB       256
-
-/*Env*/
-#define        CONFIG_ENV_IS_IN_FLASH  1
-#define        CONFIG_ENV_SIZE         0x20000
-#define        CONFIG_ENV_SECT_SIZE    0x20000
-#define CONFIG_ENV_OFFSET      0x340000
-#define CONFIG_ENV_ADDR                (XPAR_FLASH_MEM0_BASEADDR+CONFIG_ENV_OFFSET)
-
-/*Misc*/
-#define CONFIG_PREBOOT         "echo U-Boot is up and runnining;"
-
-/*Flash*/
-#define        CONFIG_SYS_FLASH_SIZE   (32*1024*1024)
-#define        CONFIG_SYS_MAX_FLASH_SECT       259
-#define MTDIDS_DEFAULT         "nor0=ml507-flash"
-#define MTDPARTS_DEFAULT       "mtdparts=ml507-flash:-(user)"
-
-/*Generic Configs*/
-#include <configs/xilinx-ppc440.h>
-
-#endif                                         /* __CONFIG_H */
index 174ea088f3efea83415b30bf3a54057f39a682cf..179b4f9007d9bc2846ba14bd55f5e4149709111b 100644 (file)
@@ -25,6 +25,8 @@
 
 #define CONFIG_SYS_NO_FLASH
 
+#define CONFIG_SYS_BOOTM_LEN   0x1000000
+
 #include <linux/sizes.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/imx-common/gpio.h>
index c9461764165d1c31554fe47dabd98a0f690d035d..4374c3a41fe0ebebe19742a1f6547092bd5f88fb 100644 (file)
 /* Miscellaneous configurable options */
 #define CONFIG_CMD_MEMTEST
 #define CONFIG_SYS_MEMTEST_START       0x80000000
-#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + 0x10000000)
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + 0x8000000)
 
 #define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
 #define CONFIG_SYS_HZ                  1000
 #define CONFIG_SF_DEFAULT_CS           0
 #define CONFIG_SF_DEFAULT_SPEED        40000000
 #define CONFIG_SF_DEFAULT_MODE         SPI_MODE_0
+#define CONFIG_SPI_FLASH_STMICRO
 #define FSL_QSPI_FLASH_NUM             1
 #define FSL_QSPI_FLASH_SIZE            SZ_32M
 #endif
index d507fb48daeae382a9887b187c9ac9f9d406f1f4..fac7c3f2e22909079809e4ec7a25bac6961a9457 100644 (file)
@@ -23,6 +23,8 @@
 #define CONFIG_SC_TIMER_CLK 8000000 /* 8Mhz */
 #define CONFIG_SYS_FSL_CLK
 
+#define CONFIG_SYS_BOOTM_LEN   0x1000000
+
 /* Enable iomux-lpsr support */
 #define CONFIG_IOMUX_LPSR
 #define CONFIG_IMX_FIXED_IVT_OFFSET
index 22e515cccd4f4bff95f2cfb0718c4d1af1da059a..d23e4f3c407bdb576aa9ecc53fd31c1fd3943543 100644 (file)
 #define CONFIG_SYS_NO_FLASH
 #define CONFIG_ENV_SIZE                        SZ_8K
 #define CONFIG_ENV_IS_IN_MMC
+
+/*
+ * If want to use nand, define CONFIG_NAND_MXS and rework board
+ * to support nand, since emmc has pin conflicts with nand
+ */
+#ifdef CONFIG_NAND_MXS
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_NAND_TRIMFFS
+
+/* NAND stuff */
+#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
+#endif
+
 #define CONFIG_ENV_OFFSET              (8 * SZ_64K)
+#ifdef CONFIG_NAND_MXS
+#define CONFIG_SYS_FSL_USDHC_NUM       1
+#else
 #define CONFIG_SYS_FSL_USDHC_NUM       2
+#endif
 
 #define CONFIG_SYS_MMC_ENV_DEV         0   /* USDHC1 */
 #define CONFIG_SYS_MMC_ENV_PART                0       /* user area */
index 9464153f58460bf4332b2593ca0fe2f72409ceab..176f6e902b3b3f911eaa225da9bf7a509536eef3 100644 (file)
@@ -37,8 +37,6 @@
 #define CONFIG_SYS_MMC_ENV_PART                2
 #define CONFIG_ENV_OFFSET              (-CONFIG_ENV_SIZE)
 
-#define CONFIG_I2C_EDID
-
 /* LCD support */
 #define CONFIG_LCD
 #define CONFIG_PWM_TEGRA
index 5da6cfd6f59642bc04b70a07f0f1acee8e5fc52b..5e33845da0dca9f254950edee611de44dc01c52b 100644 (file)
@@ -19,8 +19,6 @@
 #include <configs/ti_omap3_common.h>
 #include <asm/mach-types.h>
 
-#undef CONFIG_BOOTDELAY
-
 /*
  * Display CPU and Board information
  */
index 7b60f29bd27c3ad923f391742eb2ea752c27d9d1..e9ce3f6d1c761a3bd7ce65152871cd4e2cf8c42a 100644 (file)
@@ -50,6 +50,9 @@
  * Hardware drivers
  */
 
+/* GPIO banks */
+#define CONFIG_OMAP3_GPIO_6            /* GPIO160..191 is in GPIO bank 6 */
+
 /*
  * select serial console configuration
  */
index 4258dcb7f6c109ef1b65658615d9871a3cc62a57..b0d2ffe5b4c842b9086072c2463abb00d35c2eb7 100644 (file)
@@ -14,7 +14,6 @@
 #include <configs/x86-common.h>
 
 #define CONFIG_SYS_MONITOR_LEN         (1 << 20)
-#define CONFIG_ARCH_MISC_INIT
 #define CONFIG_ARCH_EARLY_INIT_R
 
 #define CONFIG_PCI_PNP
index d6423e7e554d21bd989fb71d91613735741e8ce0..a29f55709dd815dd187b54eea724e0023ae473c5 100644 (file)
@@ -24,7 +24,6 @@
  */
 #define CONFIG_ENV_OFFSET (96 * 1024)
 
-#define CONFIG_I2C_EDID
 #define CONFIG_SYS_WHITE_ON_BLACK
 #define CONFIG_CONSOLE_SCROLL_LINES            10
 
index 1b83eb36a7286889c5cbcb6c26f014688c365c7d..927bae78eb5a42d70f93f6c8bcc0a7e22af43984 100644 (file)
@@ -88,6 +88,9 @@
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_SMSC95XX
 #define CONFIG_MISC_INIT_R
+#define CONFIG_USB_KEYBOARD
+#define CONFIG_SYS_USB_EVENT_POLL
+#define CONFIG_SYS_STDIO_DEREGISTER
 #endif
 
 /* Console UART */
 #define CONFIG_SYS_LOAD_ADDR           0x1000000
 #define CONFIG_CONSOLE_MUX
 #define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_PREBOOT                 "usb start"
 
 /* Shell */
 #define CONFIG_SYS_MAXARGS             8
 /* Environment */
 #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
 #define ENV_DEVICE_SETTINGS \
-       "stdin=serial,lcd\0" \
+       "stdin=serial,usbkbd\0" \
        "stdout=serial,lcd\0" \
        "stderr=serial,lcd\0"
 
diff --git a/include/configs/theadorable.h b/include/configs/theadorable.h
new file mode 100644 (file)
index 0000000..cd9d6b6
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2015-2016 Stefan Roese <sr@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _CONFIG_THEADORABLE_H
+#define _CONFIG_THEADORABLE_H
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+
+/*
+ * TEXT_BASE needs to be below 16MiB, since this area is scrubbed
+ * for DDR ECC byte filling in the SPL before loading the main
+ * U-Boot into it.
+ */
+#define        CONFIG_SYS_TEXT_BASE    0x00800000
+#define CONFIG_SYS_TCLK                250000000       /* 250MHz */
+
+/*
+ * Commands configuration
+ */
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_FS_GENERIC
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_SATA
+#define CONFIG_CMD_TIME
+
+/*
+ * The debugging version enables USB support via defconfig.
+ * This version should also enable all other non-production
+ * interfaces / features.
+ */
+#ifdef CONFIG_USB
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_PCI
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_SPI
+#define CONFIG_CMD_TFTPPUT
+#endif
+
+/* I2C */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MVTWSI
+#define CONFIG_I2C_MVTWSI_BASE0                MVEBU_TWSI_BASE
+#define CONFIG_SYS_I2C_SLAVE           0x0
+#define CONFIG_SYS_I2C_SPEED           100000
+
+/* USB/EHCI configuration */
+#define CONFIG_EHCI_IS_TDI
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 3
+
+#define CONFIG_SYS_NO_FLASH            /* Declare no flash (NOR/SPI) */
+
+/* SPI NOR flash default params, used by sf commands */
+#define CONFIG_SF_DEFAULT_SPEED                27777777 /* for fast SPL booting */
+#define CONFIG_SF_DEFAULT_MODE         SPI_MODE_3
+
+/* Environment in SPI NOR flash */
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_OFFSET              (1 << 20) /* 1MiB in */
+#define CONFIG_ENV_SIZE                        (64 << 10) /* 64KiB */
+#define CONFIG_ENV_SECT_SIZE           (256 << 10) /* 256KiB sectors */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_PHY_MARVELL             /* there is a marvell phy */
+#define PHY_ANEG_TIMEOUT       8000    /* PHY needs a longer aneg time */
+
+#define CONFIG_SYS_CONSOLE_INFO_QUIET  /* don't print console @ startup */
+#define CONFIG_SYS_ALT_MEMTEST
+#define CONFIG_PREBOOT
+#define CONFIG_FIT
+
+#define CONFIG_SYS_HUSH_PARSER                 /* Use the HUSH parser  */
+#define        CONFIG_SYS_PROMPT_HUSH_PS2      "> "
+
+/* Keep device tree and initrd in lower memory so the kernel can access them */
+#define CONFIG_EXTRA_ENV_SETTINGS      \
+       "fdt_high=0x10000000\0"         \
+       "initrd_high=0x10000000\0"
+
+/* SATA support */
+#define CONFIG_SYS_SATA_MAX_DEVICE     1
+#define CONFIG_SATA_MV
+#define CONFIG_LIBATA
+#define CONFIG_LBA48
+#define CONFIG_EFI_PARTITION
+#define CONFIG_DOS_PARTITION
+
+/* Additional FS support/configuration */
+#define CONFIG_SUPPORT_VFAT
+
+/* PCIe support */
+#ifdef CONFIG_CMD_PCI
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_PCI
+#define CONFIG_PCI_MVEBU
+#define CONFIG_PCI_PNP
+#endif
+#endif
+
+/* Enable LCD and reserve 512KB from top of memory*/
+#define CONFIG_SYS_MEM_TOP_HIDE                0x80000
+
+#define CONFIG_VIDEO
+#define CONFIG_CFB_CONSOLE
+#define CONFIG_VGA_AS_SINGLE_DEVICE
+#define CONFIG_CMD_BMP
+
+/*
+ * mv-common.h should be defined after CMD configs since it used them
+ * to enable certain macros
+ */
+#include "mv-common.h"
+
+/*
+ * Memory layout while starting into the bin_hdr via the
+ * BootROM:
+ *
+ * 0x4000.4000 - 0x4003.4000   headers space (192KiB)
+ * 0x4000.4030                 bin_hdr start address
+ * 0x4003.4000 - 0x4004.7c00   BootROM memory allocations (15KiB)
+ * 0x4007.fffc                 BootROM stack top
+ *
+ * The address space between 0x4007.fffc and 0x400f.fff is not locked in
+ * L2 cache thus cannot be used.
+ */
+
+/* SPL */
+/* Defines for SPL */
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TEXT_BASE           0x40004030
+#define CONFIG_SPL_MAX_SIZE            ((128 << 10) - 0x4030)
+
+#define CONFIG_SPL_BSS_START_ADDR      (0x40000000 + (128 << 10))
+#define CONFIG_SPL_BSS_MAX_SIZE                (16 << 10)
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_MALLOC_SIMPLE
+#endif
+
+#define CONFIG_SPL_STACK               (0x40000000 + ((192 - 16) << 10))
+#define CONFIG_SPL_BOOTROM_SAVE                (CONFIG_SPL_STACK + 4)
+
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_I2C_SUPPORT
+
+/* SPL related SPI defines */
+#define CONFIG_SPL_SPI_SUPPORT
+#define CONFIG_SPL_SPI_FLASH_SUPPORT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SPL_SPI_BUS             0
+#define CONFIG_SPL_SPI_CS              0
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x1a000
+#define CONFIG_SYS_U_BOOT_OFFS         CONFIG_SYS_SPI_U_BOOT_OFFS
+
+/* Enable DDR support in SPL (DDR3 training from Marvell bin_hdr) */
+#define CONFIG_DDR_FIXED_SIZE          (2 << 20)       /* 2GiB */
+
+#endif /* _CONFIG_THEADORABLE_H */
diff --git a/include/configs/v5fx30teval.h b/include/configs/v5fx30teval.h
deleted file mode 100644 (file)
index 298fa3e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- *  This work has been supported by: QTechnology  http://qtec.com/
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-/*CPU*/
-#define CONFIG_440             1
-#define CONFIG_XILINX_ML507    1
-#include "../board/avnet/v5fx30teval/xparameters.h"
-
-/*Mem Map*/
-#define CONFIG_SYS_SDRAM_SIZE_MB       64
-
-/*Env*/
-#define        CONFIG_ENV_IS_IN_FLASH  1
-#define        CONFIG_ENV_SIZE         0x20000
-#define        CONFIG_ENV_SECT_SIZE    0x20000
-#define CONFIG_ENV_OFFSET              0x1A0000
-#define CONFIG_ENV_ADDR                (XPAR_FLASH_MEM0_BASEADDR+CONFIG_ENV_OFFSET)
-
-/*Misc*/
-#define CONFIG_PREBOOT         "echo U-Boot is up and runnining;"
-
-/*Flash*/
-#define        CONFIG_SYS_FLASH_SIZE           (16*1024*1024)
-#define        CONFIG_SYS_MAX_FLASH_SECT       131
-#define MTDIDS_DEFAULT         "nor0=v5fx30t-flash"
-#define MTDPARTS_DEFAULT       "mtdparts=v5fx30t-flash:-(user)"
-
-/*Generic Configs*/
-#include <configs/xilinx-ppc440.h>
-
-#endif                                         /* __CONFIG_H */
index eb400d09607402d56edfd57a1fc455b1a1cccd19..d01d88b33f4d34afb65838f60d5a1e532084ec88 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  *  This work has been supported by: QTechnology  http://qtec.com/
  *
  *  (C) Copyright 2008
 #define CONFIG_SYS_NO_FLASH
 #endif
 
-/* serial communication */
-#ifdef XPAR_UARTLITE_0_BASEADDR
-#define CONFIG_XILINX_UARTLITE
-#define XILINX_UARTLITE_BASEADDR       XPAR_UARTLITE_0_BASEADDR
-#define CONFIG_BAUDRATE                        XPAR_UARTLITE_0_BAUDRATE
-#define CONFIG_SYS_BAUDRATE_TABLE      { CONFIG_BAUDRATE }
-#else
-#ifdef XPAR_UARTNS550_0_BASEADDR
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    4
-#define CONFIG_CONS_INDEX              1
-#define CONFIG_SYS_NS16550_COM1                XPAR_UARTNS550_0_BASEADDR
-#define CONFIG_SYS_NS16550_CLK         XPAR_UARTNS550_0_CLOCK_FREQ_HZ
+#define CONFIG_OF_LIBFDT       1
 #define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 115200 }
-#endif
-#endif
+/* The following table includes the supported baudrates */
+# define CONFIG_SYS_BAUDRATE_TABLE \
+       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400}
 
 #endif                                         /* __CONFIG_H */
index 40fa0878a43f73ddbd2ca631b523c709d0a7ecf5..6182b0e7cf05ae462d7a745f7cb43409369c8feb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *
  * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  * This work has been supported by: QTechnology http://qtec.com/
  *
  * (C) Copyright 2008
@@ -14,6 +14,9 @@
 
 #include "../board/xilinx/ppc405-generic/xparameters.h"
 
+#define CONFIG_405             1
+#define CONFIG_XILINX_405      1
+
 /* sdram */
 #define CONFIG_SYS_SDRAM_SIZE_MB       256
 
 #define CONFIG_ENV_OVERWRITE           1
 
 /*Misc*/
-#define CONFIG_PREBOOT         "echo U-Boot is up and runnining;"
+#define CONFIG_PREBOOT         "echo U-Boot is up and running;"
 
 /*Flash*/
-#define CONFIG_SYS_FLASH_BASE                  XPAR_FLASH_MEM0_BASEADDR
-#define CONFIG_SYS_FLASH_SIZE          (32*1024*1024)
-#define CONFIG_SYS_MAX_FLASH_SECT      71
+#define CONFIG_SYS_FLASH_BASE          XPAR_FLASH_MEM0_BASEADDR
+#define CONFIG_SYS_FLASH_SIZE          (128*1024*1024)
+#define CONFIG_SYS_MAX_FLASH_SECT      1024
 #define CONFIG_SYS_FLASH_CFI           1
 #define CONFIG_FLASH_CFI_DRIVER                1
-#define MTDIDS_DEFAULT                 "nor0=ppc405-flash"
-#define MTDPARTS_DEFAULT               "mtdpartsa=ppc405-flash:-(user)"
+#define MTDIDS_DEFAULT                 "nor0=flash"
+#define MTDPARTS_DEFAULT               "mtdparts=flash:-(user)"
 
-#include <configs/xilinx-ppc405.h>
+#include <configs/xilinx-ppc.h>
 #endif                 /* __CONFIG_H */
diff --git a/include/configs/xilinx-ppc405.h b/include/configs/xilinx-ppc405.h
deleted file mode 100644 (file)
index a0151fe..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *
- * (C) Copyright 2008
- * Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- * This work has been supported by: QTechnology http://qtec.com/
- *
- * (C) Copyright 2008
- * Georg Schardt <schardt@team-ctech.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-/* cpu parameter */
-#define CONFIG_405             1
-#define CONFIG_XILINX_405      1
-
-#include <configs/xilinx-ppc.h>
-
-#endif
index 95b883407839e1de85c5cb3a67c78f21fcce814d..f2505a6cd2b288801959c78a4d072c5f048a6a5b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
+ *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@gmail.com
  *  This work has been supported by: QTechnology  http://qtec.com/
  * SPDX-License-Identifier:    GPL-2.0+
 */
@@ -8,31 +8,42 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-/*CPU*/
+/* CPU */
 #define CONFIG_440                     1
+#define CONFIG_XILINX_440              1
 #define CONFIG_XILINX_PPC440_GENERIC   1
 #include "../board/xilinx/ppc440-generic/xparameters.h"
 
-/*Mem Map*/
+/* Mem Map */
 #define CONFIG_SYS_SDRAM_SIZE_MB       256
 
-/*Env*/
+/* Env */
 #define        CONFIG_ENV_IS_IN_FLASH  1
 #define        CONFIG_ENV_SIZE         0x20000
 #define        CONFIG_ENV_SECT_SIZE    0x20000
-#define CONFIG_ENV_OFFSET              0x340000
+#define CONFIG_ENV_OFFSET      0x340000
 #define CONFIG_ENV_ADDR                (XPAR_FLASH_MEM0_BASEADDR+CONFIG_ENV_OFFSET)
 
-/*Misc*/
-#define CONFIG_PREBOOT         "echo U-Boot is up and runnining;"
-
-/*Flash*/
-#define        CONFIG_SYS_FLASH_SIZE           (32*1024*1024)
-#define        CONFIG_SYS_MAX_FLASH_SECT       259
-#define MTDIDS_DEFAULT         "nor0=ml507-flash"
-#define MTDPARTS_DEFAULT       "mtdparts=ml507-flash:-(user)"
-
-/*Generic Configs*/
-#include <configs/xilinx-ppc440.h>
+/* Misc */
+#define CONFIG_PREBOOT         "echo U-Boot is up and running;"
+
+/* Flash */
+#define        CONFIG_SYS_FLASH_SIZE           (128*1024*1024)
+#define        CONFIG_SYS_MAX_FLASH_SECT       1024
+#define MTDIDS_DEFAULT                 "nor0=flash"
+#define MTDPARTS_DEFAULT               "mtdparts=flash:-(user)"
+
+/* Net */
+#ifdef XPAR_LLTEMAC_0_BASEADDR
+#define CONFIG_XILINX_LL_TEMAC
+#define CONFIG_MII
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MARVELL
+#define CONFIG_NET_RANDOM_ETHADDR
+#define CONFIG_LIB_RAND
+#endif
+
+/* Generic Configs */
+#include <configs/xilinx-ppc.h>
 
 #endif                                         /* __CONFIG_H */
diff --git a/include/configs/xilinx-ppc440.h b/include/configs/xilinx-ppc440.h
deleted file mode 100644 (file)
index f457008..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * (C) Copyright 2008
- *  Ricado Ribalda-Universidad Autonoma de Madrid-ricardo.ribalda@uam.es
- *  This work has been supported by: QTechnology  http://qtec.com/
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#ifndef __CONFIG_GEN_H
-#define __CONFIG_GEN_H
-
-/*CPU*/
-#define CONFIG_440             1
-#define CONFIG_XILINX_440      1
-
-#include <configs/xilinx-ppc.h>
-
-#endif                                         /* __CONFIG_H */
index 03f74508efeaf6539a7eb7e7dbe72a6c9d022a70..27ef74daf50f41187860b5f4db10ba743747bc1d 100644 (file)
 #define GICD_BASE      0xF9010000
 #define GICC_BASE      0xF9020000
 
-/* Physical Memory Map */
-#define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE          0
-#define CONFIG_SYS_SDRAM_SIZE          0x40000000
+#define CONFIG_SYS_ALT_MEMTEST
+#define CONFIG_SYS_MEMTEST_SCRATCH     0xfffc0000
 
 #define CONFIG_SYS_MEMTEST_START       CONFIG_SYS_SDRAM_BASE
 #define CONFIG_SYS_MEMTEST_END         CONFIG_SYS_SDRAM_SIZE
@@ -37,7 +35,9 @@
 /* Cache Definitions */
 #define CONFIG_SYS_CACHELINE_SIZE      64
 
-#define CONFIG_IDENT_STRING            " Xilinx ZynqMP"
+#if !defined(CONFIG_IDENT_STRING)
+# define CONFIG_IDENT_STRING           " Xilinx ZynqMP"
+#endif
 
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_SDRAM_BASE + 0x7fff0)
 
@@ -45,7 +45,9 @@
 #define CONFIG_OF_LIBFDT
 
 /* Generic Timer Definitions - setup in EL3. Setup by ATF for other cases */
-#define COUNTER_FREQUENCY              4000000
+#if !defined(COUNTER_FREQUENCY)
+# define COUNTER_FREQUENCY             100000000
+#endif
 
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 0x2000000)
 #define CONFIG_THOR_RESET_OFF
 #define DFU_ALT_INFO_RAM \
        "dfu_ram_info=" \
-       "set dfu_alt_info " \
-       "Image ram 0x200000 0x1800000\\\\;" \
-       "system.dtb ram 0x7000000 0x40000\0" \
+       "setenv dfu_alt_info " \
+       "Image ram $kernel_addr $kernel_size\\\\;" \
+       "system.dtb ram $fdt_addr $fdt_size\0" \
        "dfu_ram=run dfu_ram_info && dfu 0 ram 0\0" \
        "thor_ram=run dfu_ram_info && thordown 0 ram 0\0"
 
        "kernel_addr=0x80000\0" \
        "fdt_addr=0x7000000\0" \
        "fdt_high=0x10000000\0" \
-       "sdboot=mmcinfo && load mmc 0:0 $fdt_addr system.dtb && " \
-               "load mmc 0:0 $kernel_addr Image && booti $kernel_addr - $fdt_addr\0" \
+       "kernel_size=0x2000000\0" \
+       "fdt_size=0x80000\0" \
+       "sdbootdev=0\0"\
+       "sdboot=mmc dev $sdbootdev && mmcinfo && load mmc $sdbootdev:$partid $fdt_addr system.dtb && " \
+               "load mmc $sdbootdev:$partid $kernel_addr Image && " \
+               "booti $kernel_addr - $fdt_addr\0" \
        DFU_ALT_INFO
 
-#define CONFIG_BOOTARGS                "setenv bootargs console=ttyPS0,${baudrate} " \
-                               "earlycon=cdns,mmio,0xff000000,${baudrate}n8"
 #define CONFIG_PREBOOT         "run bootargs"
 #define CONFIG_BOOTCOMMAND     "run $modeboot"
 #define CONFIG_BOOTDELAY       5
 # define CONFIG_MII
 # define CONFIG_SYS_FAULT_ECHO_LINK_DOWN
 # define CONFIG_PHY_MARVELL
+# define CONFIG_PHY_NATSEMI
 # define CONFIG_PHY_TI
+# define CONFIG_PHY_GIGE
+# define PHY_ANEG_TIMEOUT       20000
 #endif
 
 /* I2C */
index ec39211af3db5a9c605e2ec6fe26b253a4f593da..9906c426f50f05d135f64a70f1dd1e17c2e4c9e0 100644 (file)
@@ -1,7 +1,5 @@
 /*
- * Configuration for Xilinx ZynqMP emulation
- * platforms. See zynqmp-common.h for ZynqMP
- * common configs
+ * Configuration for Xilinx ZynqMP emulation platforms
  *
  * (C) Copyright 2014 - 2015 Xilinx, Inc.
  * Michal Simek <michal.simek@xilinx.com>
@@ -17,6 +15,7 @@
 
 #define CONFIG_ZYNQ_SDHCI0
 #define CONFIG_ZYNQ_SDHCI_MAX_FREQ     52000000
+#define CONFIG_ZYNQ_SDHCI_MIN_FREQ     (CONFIG_ZYNQ_SDHCI_MAX_FREQ << 9)
 #define CONFIG_ZYNQ_I2C0
 #define CONFIG_SYS_I2C_ZYNQ
 #define CONFIG_ZYNQ_EEPROM
 #define CONFIG_ZYNQMP_XHCI_LIST {ZYNQMP_USB0_XHCI_BASEADDR, \
                                 ZYNQMP_USB1_XHCI_BASEADDR}
 
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_SDRAM_BASE          0
+#define CONFIG_SYS_SDRAM_SIZE          0x40000000
+
+#define COUNTER_FREQUENCY      4000000
+
 #include <configs/xilinx_zynqmp.h>
 
 #endif /* __CONFIG_ZYNQMP_EP_H */
index 0ab60839b6cff73b392534b9baff64d9574c2e99..e8c3ef0c387222ad0c507a90451bd09ae68d058c 100644 (file)
@@ -66,7 +66,6 @@
 #ifdef CONFIG_ZYNQ_QSPI
 # define CONFIG_SF_DEFAULT_SPEED       30000000
 # define CONFIG_SPI_FLASH_ISSI
-# define CONFIG_SPI_FLASH_BAR
 # define CONFIG_CMD_SF
 #endif
 
index 8391e381fa88863f7be44a400f3c6156e45de163..73cd3ac94c17b9eedcced305c7277d4eed6cac77 100644 (file)
@@ -29,6 +29,7 @@ enum uclass_id {
        UCLASS_CLK,             /* Clock source, e.g. used by peripherals */
        UCLASS_CPU,             /* CPU, typically part of an SoC */
        UCLASS_CROS_EC,         /* Chrome OS EC */
+       UCLASS_DISK,            /* Disk controller, e.g. SATA */
        UCLASS_DISPLAY,         /* Display (e.g. DisplayPort, HDMI) */
        UCLASS_RAM,             /* RAM controller */
        UCLASS_ETH,             /* Ethernet device */
@@ -37,6 +38,7 @@ enum uclass_id {
        UCLASS_I2C_EEPROM,      /* I2C EEPROM device */
        UCLASS_I2C_GENERIC,     /* Generic I2C device */
        UCLASS_I2C_MUX,         /* I2C multiplexer */
+       UCLASS_IRQ,             /* Interrupt controller */
        UCLASS_KEYBOARD,        /* Keyboard input device */
        UCLASS_LED,             /* Light-emitting diode (LED) */
        UCLASS_LPC,             /* x86 'low pin count' interface */
@@ -45,6 +47,7 @@ enum uclass_id {
        UCLASS_MMC,             /* SD / MMC card or chip */
        UCLASS_MOD_EXP,         /* RSA Mod Exp device */
        UCLASS_MTD,             /* Memory Technology Device (MTD) device */
+       UCLASS_NORTHBRIDGE,     /* Intel Northbridge / SDRAM controller */
        UCLASS_PANEL,           /* Display panel, such as an LCD */
        UCLASS_PANEL_BACKLIGHT, /* Backlight controller for panel */
        UCLASS_PCH,             /* x86 platform controller hub */
index 25e98c9c9e1ae2e3f0c73fd069c05374e8f54c3d..dd82916dc00ae711748f428acac754754102c698 100644 (file)
@@ -163,7 +163,6 @@ enum fdt_compat_id {
        COMPAT_INTEL_X86_PINCTRL,       /* Intel ICH7/9 pin control */
        COMPAT_SOCIONEXT_XHCI,          /* Socionext UniPhier xHCI */
        COMPAT_INTEL_PCH,               /* Intel PCH */
-       COMPAT_INTEL_IRQ_ROUTER,        /* Intel Interrupt Router */
        COMPAT_ALTERA_SOCFPGA_DWMAC,    /* SoCFPGA Ethernet controller */
        COMPAT_ALTERA_SOCFPGA_DWMMC,    /* SoCFPGA DWMMC controller */
        COMPAT_ALTERA_SOCFPGA_DWC2USB,  /* SoCFPGA DWC2 USB controller */
index e0d12981b283ea93f9e4ef9fcf66076e4cc5bbda..d768fb14171af5744b799e9e81f65e03ca95e6ab 100644 (file)
@@ -46,6 +46,7 @@ typedef struct {                /* typedef fpga_desc */
 typedef enum {
        BIT_FULL = 0,
        BIT_PARTIAL,
+       BIT_NONE = 0xFF,
 } bitstream_type;
 
 /* root function definitions */
index d7651a8f0801e4c14fe6c786e2c1815a2a5afb45..f76fca77f9f57f03fd2a79bd4e54c470f7d0ee96 100644 (file)
@@ -195,8 +195,15 @@ void lcd_sync(void);
 #define CONSOLE_COLOR_WHITE    0x00ffffff      /* Must remain last / highest */
 #define NBYTES(bit_code)       (NBITS(bit_code) >> 3)
 #else /* 16bpp color definitions */
-#define CONSOLE_COLOR_BLACK    0x0000
-#define CONSOLE_COLOR_WHITE    0xffff          /* Must remain last / highest */
+# define CONSOLE_COLOR_BLACK   0x0000
+# define CONSOLE_COLOR_RED     0xF800
+# define CONSOLE_COLOR_GREEN   0x07E0
+# define CONSOLE_COLOR_YELLOW  0xFFE0
+# define CONSOLE_COLOR_BLUE    0x001F
+# define CONSOLE_COLOR_MAGENTA 0xF81F
+# define CONSOLE_COLOR_CYAN    0x07FF
+# define CONSOLE_COLOR_GREY    0xC618
+# define CONSOLE_COLOR_WHITE   0xffff          /* Must remain last / highest */
 #endif /* color definitions */
 
 #if LCD_BPP == LCD_COLOR16
diff --git a/include/linux/bug.h b/include/linux/bug.h
new file mode 100644 (file)
index 0000000..920e379
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef _LINUX_BUG_H
+#define _LINUX_BUG_H
+
+#include <linux/compiler.h>
+
+#ifdef __CHECKER__
+#define BUILD_BUG_ON_NOT_POWER_OF_2(n) (0)
+#define BUILD_BUG_ON_ZERO(e) (0)
+#define BUILD_BUG_ON_NULL(e) ((void*)0)
+#define BUILD_BUG_ON_INVALID(e) (0)
+#define BUILD_BUG_ON(condition) (0)
+#define BUILD_BUG() (0)
+#else /* __CHECKER__ */
+
+/* Force a compilation error if a constant expression is not a power of 2 */
+#define BUILD_BUG_ON_NOT_POWER_OF_2(n)                 \
+       BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0))
+
+/* Force a compilation error if condition is true, but also produce a
+   result (of value 0 and type size_t), so the expression can be used
+   e.g. in a structure initializer (or where-ever else comma expressions
+   aren't permitted). */
+#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
+#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
+
+/*
+ * BUILD_BUG_ON_INVALID() permits the compiler to check the validity of the
+ * expression but avoids the generation of any code, even if that expression
+ * has side-effects.
+ */
+#define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))
+
+/**
+ * BUILD_BUG_ON - break compile if a condition is true.
+ * @condition: the condition which the compiler should know is false.
+ *
+ * If you have some code which relies on certain constants being equal, or
+ * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to
+ * detect if someone changes it.
+ *
+ * The implementation uses gcc's reluctance to create a negative array, but gcc
+ * (as of 4.4) only emits that error for obvious cases (e.g. not arguments to
+ * inline functions).  Luckily, in 4.3 they added the "error" function
+ * attribute just for this type of case.  Thus, we use a negative sized array
+ * (should always create an error on gcc versions older than 4.4) and then call
+ * an undefined function with the error attribute (should always create an
+ * error on gcc 4.3 and later).  If for some reason, neither creates a
+ * compile-time error, we'll still have a link-time error, which is harder to
+ * track down.
+ */
+#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
+
+#endif /* __CHECKER__ */
+
+#endif /* _LINUX_BUG_H */
index de74b9a534b10a91c53a57bb2aacf98b699c1d9e..244f23f93c366b5eb867a2d2364706c34cf871dd 100644 (file)
@@ -80,11 +80,6 @@ int tsi108_eth_initialize(bd_t *bis);
 int uec_standard_init(bd_t *bis);
 int uli526x_initialize(bd_t *bis);
 int armada100_fec_register(unsigned long base_addr);
-int xilinx_axiemac_initialize(bd_t *bis, unsigned long base_addr,
-                                                       unsigned long dma_addr);
-int xilinx_emaclite_of_init(const void *blob);
-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);
 /*
index 4d00e220e4c8867c6312044c05a497ec77aaf262..dc23949ae8c079ddf05f9e50b6ab51f5bcd7b52a 100644 (file)
@@ -10,8 +10,6 @@
 #include <ide.h>
 #include <common.h>
 
-typedef struct block_dev_desc block_dev_desc_t;
-
 struct block_dev_desc {
        int             if_type;        /* type of the interface */
        int             dev;            /* device number */
diff --git a/include/pch.h b/include/pch.h
new file mode 100644 (file)
index 0000000..79f49bd
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __pch_h
+#define __pch_h
+
+enum pch_version {
+       PCHV_UNKNOWN,
+       PCHV_7,
+       PCHV_9,
+};
+
+#define PCH_RCBA               0xf0
+
+#define BIOS_CTRL_BIOSWE       BIT(0)
+
+/* Operations for the Platform Controller Hub */
+struct pch_ops {
+       /**
+        * get_sbase() - get the address of SPI base
+        *
+        * @dev:        PCH device to check
+        * @sbasep:     Returns address of SPI base if available, else 0
+        * @return 0 if OK, -ve on error (e.g. there is no SPI base)
+        */
+       int (*get_sbase)(struct udevice *dev, ulong *sbasep);
+
+       /**
+        * get_version() - get the PCH version
+        *
+        * @return version, or -ENOSYS if unknown
+        */
+       enum pch_version (*get_version)(struct udevice *dev);
+
+       /**
+        * set_spi_protect() - set whether SPI flash is protected or not
+        *
+        * @dev:        PCH device to adjust
+        * @protect:    true to protect, false to unprotect
+        *
+        * @return 0 on success, -ENOSYS if not implemented
+        */
+       int (*set_spi_protect)(struct udevice *dev, bool protect);
+};
+
+#define pch_get_ops(dev)        ((struct pch_ops *)(dev)->driver->ops)
+
+/**
+ * pch_get_sbase() - get the address of SPI base
+ *
+ * @dev:       PCH device to check
+ * @sbasep:    Returns address of SPI base if available, else 0
+ * @return 0 if OK, -ve on error (e.g. there is no SPI base)
+ */
+int pch_get_sbase(struct udevice *dev, ulong *sbasep);
+
+/**
+ * pch_get_version() - get the PCH version
+ *
+ * @return version, or -ENOSYS if unknown
+ */
+enum pch_version pch_get_version(struct udevice *dev);
+
+/**
+ * set_spi_protect() - set whether SPI flash is protected or not
+ *
+ * @dev:       PCH device to adjust
+ * @protect:   true to protect, false to unprotect
+ *
+ * @return 0 on success, -ENOSYS if not implemented
+ */
+int pch_set_spi_protect(struct udevice *dev, bool protect);
+
+#endif
index cb2562f1098964e50fca3abdb09f1ef23d84873c..d0d152c00bf46c9ee9a1adbcdf06f0fa284b8f24 100644 (file)
@@ -757,7 +757,9 @@ extern void pci_mpc85xx_init (struct pci_controller *hose);
 /**
  * pci_write_bar32() - Write the address of a BAR including control bits
  *
- * This writes a raw address (with control bits) to a bar
+ * This writes a raw address (with control bits) to a bar. This can be used
+ * with devices which require hard-coded addresses, not part of the normal
+ * PCI enumeration process.
  *
  * @hose:      PCI hose to use
  * @dev:       PCI device to update
@@ -765,7 +767,7 @@ extern void pci_mpc85xx_init (struct pci_controller *hose);
  * @addr:      BAR address with control bits
  */
 void pci_write_bar32(struct pci_controller *hose, pci_dev_t dev, int barnum,
-                    u32 addr_and_ctrl);
+                    u32 addr);
 
 /**
  * pci_read_bar32() - read the address of a bar
@@ -1166,6 +1168,17 @@ struct udevice *pci_get_controller(struct udevice *dev);
 int pci_get_regions(struct udevice *dev, struct pci_region **iop,
                    struct pci_region **memp, struct pci_region **prefp);
 
+/**
+ * dm_pci_write_bar32() - Write the address of a BAR
+ *
+ * This writes a raw address to a bar
+ *
+ * @dev:       PCI device to update
+ * @barnum:    BAR number (0-5)
+ * @addr:      BAR address
+ */
+void dm_pci_write_bar32(struct udevice *dev, int barnum, u32 addr);
+
 /**
  * dm_pci_read_bar32() - read a base address register from a device
  *
index c62ccd61b329b66461395cccd4d315e58975a972..4593b6e3ebfdb96e7869cc9cc88045eaa42cb35d 100644 (file)
@@ -32,6 +32,20 @@ struct syscon_ops {
  */
 struct regmap *syscon_get_regmap(struct udevice *dev);
 
+/**
+ * syscon_get_regmap_by_driver_data() - Look up a controller by its ID
+ *
+ * Each system controller can be accessed by its driver data, which is
+ * assumed to be unique through the scope of all system controllers that
+ * are in use. This function looks up the controller given this driver data.
+ *
+ * @driver_data:       Driver data value to look up
+ * @devp:              Returns the controller correponding to @driver_data
+ * @return 0 on success, -ENODEV if the ID was not found, or other -ve error
+ *        code
+ */
+int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp);
+
 /**
  * syscon_get_regmap_by_driver_data() - Look up a controller by its ID
  *
index c6d1416048a113c37d529d503bb255f47dffa197..51fce4e95dc5c1caa410c7202cfa75bb08329011 100644 (file)
@@ -131,6 +131,12 @@ int smsc95xx_eth_probe(struct usb_device *dev, unsigned int ifnum,
                        struct ueth_data *ss);
 int smsc95xx_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
                        struct eth_device *eth);
+
+void r8152_eth_before_probe(void);
+int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
+                   struct ueth_data *ss);
+int r8152_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
+                      struct eth_device *eth);
 #endif
 
 #endif /* __USB_ETHER_H__ */
diff --git a/include/wait_bit.h b/include/wait_bit.h
new file mode 100644 (file)
index 0000000..061a2db
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Wait for bit with timeout and ctrlc
+ *
+ * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __WAIT_BIT_H
+#define __WAIT_BIT_H
+
+#include <common.h>
+#include <console.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+
+/**
+ * wait_for_bit()      waits for bit set/cleared in register
+ *
+ * Function polls register waiting for specific bit(s) change
+ * (either 0->1 or 1->0). It can fail under two conditions:
+ * - Timeout
+ * - User interaction (CTRL-C)
+ * Function succeeds only if all bits of masked register are set/cleared
+ * (depending on set option).
+ *
+ * @param prefix       Prefix added to timeout messagge (message visible only
+ *                     with debug enabled)
+ * @param reg          Register that will be read (using readl())
+ * @param mask         Bit(s) of register that must be active
+ * @param set          Selects wait condition (bit set or clear)
+ * @param timeout_ms   Timeout (in miliseconds)
+ * @param breakable    Enables CTRL-C interruption
+ * @return             0 on success, -ETIMEDOUT or -EINTR on failure
+ */
+static inline int wait_for_bit(const char *prefix, const u32 *reg,
+                              const u32 mask, const bool set,
+                              const unsigned int timeout_ms,
+                              const bool breakable)
+{
+       u32 val;
+       unsigned long start = get_timer(0);
+
+       while (1) {
+               val = readl(reg);
+
+               if (!set)
+                       val = ~val;
+
+               if ((val & mask) == mask)
+                       return 0;
+
+               if (get_timer(start) > timeout_ms)
+                       break;
+
+               if (breakable && ctrlc()) {
+                       puts("Abort\n");
+                       return -EINTR;
+               }
+
+               udelay(1);
+       }
+
+       debug("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n", prefix, reg, mask,
+             set);
+
+       return -ETIMEDOUT;
+}
+
+
+#endif
index d56e1b11f01d43d784be9120c7dbef14b8cd0361..0eb56af4d6d71ad99fa9f11f47fa564db7986134 100644 (file)
@@ -68,7 +68,6 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(INTEL_X86_PINCTRL, "intel,x86-pinctrl"),
        COMPAT(SOCIONEXT_XHCI, "socionext,uniphier-xhci"),
        COMPAT(COMPAT_INTEL_PCH, "intel,bd82x6x"),
-       COMPAT(COMPAT_INTEL_IRQ_ROUTER, "intel,irq-router"),
        COMPAT(ALTERA_SOCFPGA_DWMAC, "altr,socfpga-stmmac"),
        COMPAT(ALTERA_SOCFPGA_DWMMC, "altr,socfpga-dw-mshc"),
        COMPAT(ALTERA_SOCFPGA_DWC2USB, "snps,dwc2"),
index 98e09ce5fbf16f03fff204d2aa11aff0e36bd463..30e6e316ac1b2565f13436f2d81a2230e1fe5bfc 100644 (file)
@@ -130,6 +130,10 @@ cc-option-align = $(subst -functions=0,,\
 cc-disable-warning = $(call try-run,\
        $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
 
+# cc-name
+# Expands to either gcc or clang
+cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
+
 # cc-version
 cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
 
index 96f414a7afd81d2c2ac25ada5dc539c9ea771fe1..dff16b9d998fde3b692fb0588e0185a4881e8599 100644 (file)
@@ -53,7 +53,7 @@ libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
 
 libs-$(CONFIG_SPL_FRAMEWORK) += common/spl/
 libs-y += common/init/
-libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += common/
+libs-$(CONFIG_SPL_LIBCOMMON_SUPPORT) += common/ cmd/
 libs-$(CONFIG_SPL_LIBDISK_SUPPORT) += disk/
 libs-y += drivers/
 libs-y += dts/
index 36424816b894303faa52b22a0ec8129326af6765..c40f5fc09dd89b7bdc877fd50be9ad239dc0f7d7 100644 (file)
@@ -29,3 +29,20 @@ static int dm_test_syscon_base(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_syscon_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test system controller finding */
+static int dm_test_syscon_by_driver_data(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       ut_assertok(syscon_get_by_driver_data(SYSCON0, &dev));
+       ut_asserteq(SYSCON0, dev->driver_data);
+
+       ut_assertok(syscon_get_by_driver_data(SYSCON1, &dev));
+       ut_asserteq(SYSCON1, dev->driver_data);
+
+       ut_asserteq(-ENODEV, syscon_get_by_driver_data(2, &dev));
+
+       return 0;
+}
+DM_TEST(dm_test_syscon_by_driver_data, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);