From: Uladzimir Bely <u.bely@sam-solutions.net>
To: barebox@lists.infradead.org
Subject: [PATCH] ARM OMAP5: Basic support of Texas Instruments OMAP5 processors
Date: Tue, 23 Apr 2013 14:57:07 +0300 [thread overview]
Message-ID: <51767713.8070507@sam-solutions.net> (raw)
Since commit:
43f9a96a ubimkvol: Typo fix
Patch adds basic OMAP5 support to barebox.
Tested on SD card with 2 partitions: vfat (MLO, barebox.bin, zImage)
and ext3 (rootfs). Barebox successfully starts kernel
from commandline with "bootm /boot/zImage" command.
Building MLO: make omap5_sevm_xload_defconfig; make.
Building barebox.bin: make omap5_sevm_defconfig; make.
From 30cda1d8958262a9ba4e1398ae1c9fa04b7b804e Mon Sep 17 00:00:00 2001
From: Uladzimir Bely <u.bely@sam-solutions.net>
Date: Tue, 23 Apr 2013 14:52:18 +0300
Subject: [PATCH] ARM: OMAP5 processors support
Signed-off-by: Uladzimir Bely <u.bely@sam-solutions.net>
---
arch/arm/Makefile | 1 +
arch/arm/boards/omap5_sevm/Makefile | 2 +
arch/arm/boards/omap5_sevm/board.c | 73 ++++
arch/arm/boards/omap5_sevm/config.h | 1 +
arch/arm/boards/omap5_sevm/env/config | 11 +
arch/arm/boards/omap5_sevm/lowlevel.c | 137 +++++++
arch/arm/boards/omap5_sevm/mux.c | 284 +++++++++++++
arch/arm/configs/omap5_sevm_defconfig | 68 ++++
arch/arm/configs/omap5_sevm_xload_defconfig | 44 ++
arch/arm/mach-omap/Kconfig | 16 +
arch/arm/mach-omap/Makefile | 2 +
arch/arm/mach-omap/gpmc.c | 3 +
arch/arm/mach-omap/include/mach/debug_ll.h | 5 +
arch/arm/mach-omap/include/mach/generic.h | 7 +
arch/arm/mach-omap/include/mach/gpmc_nand.h | 1 +
arch/arm/mach-omap/include/mach/omap5-clock.h | 444
+++++++++++++++++++++
arch/arm/mach-omap/include/mach/omap5-mux.h | 321 +++++++++++++++
arch/arm/mach-omap/include/mach/omap5-silicon.h | 244 ++++++++++++
arch/arm/mach-omap/omap5_clock.c | 385 ++++++++++++++++++
arch/arm/mach-omap/omap5_generic.c | 510
++++++++++++++++++++++++
arch/arm/mach-omap/omap_generic.c | 2 +
arch/arm/mach-omap/s32k_clksource.c | 7 +
drivers/mci/Kconfig | 2 +-
23 files changed, 2569 insertions(+), 1 deletion(-)
create mode 100644 arch/arm/boards/omap5_sevm/Makefile
create mode 100644 arch/arm/boards/omap5_sevm/board.c
create mode 100644 arch/arm/boards/omap5_sevm/config.h
create mode 100644 arch/arm/boards/omap5_sevm/env/config
create mode 100644 arch/arm/boards/omap5_sevm/lowlevel.c
create mode 100644 arch/arm/boards/omap5_sevm/mux.c
create mode 100644 arch/arm/configs/omap5_sevm_defconfig
create mode 100644 arch/arm/configs/omap5_sevm_xload_defconfig
create mode 100644 arch/arm/mach-omap/include/mach/omap5-clock.h
create mode 100644 arch/arm/mach-omap/include/mach/omap5-mux.h
create mode 100644 arch/arm/mach-omap/include/mach/omap5-silicon.h
create mode 100644 arch/arm/mach-omap/omap5_clock.c
create mode 100644 arch/arm/mach-omap/omap5_generic.c
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index d506b12..fb459b5 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -162,6 +162,7 @@ board-$(CONFIG_MACH_SABRELITE) :=
freescale-mx6-sabrelite
board-$(CONFIG_MACH_TX53) := karo-tx53
board-$(CONFIG_MACH_GUF_VINCELL) := guf-vincell
board-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK) := efika-mx-smartbook
+board-$(CONFIG_MACH_OMAP5_SEVM) := omap5_sevm
board-$(CONFIG_MACH_SABRESD) := freescale-mx6-sabresd
board-$(CONFIG_MACH_REALQ7) := dmo-mx6-realq7
board-$(CONFIG_MACH_ZEDBOARD) := avnet-zedboard
diff --git a/arch/arm/boards/omap5_sevm/Makefile
b/arch/arm/boards/omap5_sevm/Makefile
new file mode 100644
index 0000000..df3764c
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/Makefile
@@ -0,0 +1,2 @@
+obj-y += board.o mux.o lowlevel.o
+pbl-y += lowlevel.o mux.o
diff --git a/arch/arm/boards/omap5_sevm/board.c
b/arch/arm/boards/omap5_sevm/board.c
new file mode 100644
index 0000000..c7b3c2d
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/board.c
@@ -0,0 +1,73 @@
+/*
+ * omap5_sevm - OMAP5-based board initalization code
+ *
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ */
+
+#include <common.h>
+#include <console.h>
+#include <init.h>
+#include <fs.h>
+#include <driver.h>
+#include <io.h>
+#include <ns16550.h>
+#include <asm/armlinux.h>
+#include <linux/stat.h>
+#include <generated/mach-types.h>
+#include <mach/omap5-silicon.h>
+#include <mach/sdrc.h>
+#include <mach/sys_info.h>
+#include <mach/syslib.h>
+#include <mach/control.h>
+
+#include <linux/err.h>
+#include <sizes.h>
+#include <partition.h>
+#include <nand.h>
+#include <asm/mmu.h>
+#include <mach/gpio.h>
+#include <mach/gpmc.h>
+#include <mach/gpmc_nand.h>
+#include <envfs.h>
+#include <i2c/i2c.h>
+
+static struct NS16550_plat serial_plat = {
+ .clock = 48000000, /* 48MHz (APLL96/2) */
+ .shift = 2,
+};
+
+static int omap5_sevm_console_init(void)
+{
+ /* Register the serial port */
+ add_ns16550_device(DEVICE_ID_DYNAMIC, OMAP54XX_UART3_BASE, 1024,
+ IORESOURCE_MEM_8BIT, &serial_plat);
+
+ return 0;
+}
+console_initcall(omap5_sevm_console_init);
+
+static int omap5_sevm_mem_init(void)
+{
+ arm_add_mem_device("ram0", 0x80000000, SZ_512M);
+ add_mem_device("sram0", 0x40300000, 48*SZ_1K, IORESOURCE_MEM_WRITEABLE);
+
+ return 0;
+}
+mem_initcall(omap5_sevm_mem_init);
+
+static int omap5_sevm_devices_init(void)
+{
+ add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, 0x4809C100,
SZ_4K,
+ IORESOURCE_MEM, NULL);
+
+ armlinux_set_bootparams((void *)0x80000100);
+ armlinux_set_architecture(MACH_TYPE_OMAP5_SEVM);
+
+ return 0;
+}
+device_initcall(omap5_sevm_devices_init);
diff --git a/arch/arm/boards/omap5_sevm/config.h
b/arch/arm/boards/omap5_sevm/config.h
new file mode 100644
index 0000000..da84fa5
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/config.h
@@ -0,0 +1 @@
+/* nothing */
diff --git a/arch/arm/boards/omap5_sevm/env/config
b/arch/arm/boards/omap5_sevm/env/config
new file mode 100644
index 0000000..9752957
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/env/config
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+machine=omap5
+
+autoboot_timeout=2
+
+bootargs="console=ttyO2,115200"
+
+kernel_loc=disk
+
+PS1="\e[1;32mbarebox@\e[1;31m\h:\w\e[0m "
diff --git a/arch/arm/boards/omap5_sevm/lowlevel.c
b/arch/arm/boards/omap5_sevm/lowlevel.c
new file mode 100644
index 0000000..b4479b2
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/lowlevel.c
@@ -0,0 +1,137 @@
+/*
+ * omap5_sevm - OMAP5-based board low-level initalization code
+ *
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP5 work in U-Boot project
+ */
+
+#include <common.h>
+#include <io.h>
+#include <mach/omap5-mux.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap5-clock.h>
+#include <mach/syslib.h>
+#include <asm/barebox-arm.h>
+#include <asm/barebox-arm-head.h>
+
+void set_muxconf_regs(void);
+
+static const struct omap5_ddr_regs ddr_regs_elpida_532_mhz_2cs = {
+ .sdram_config_init = 0x80800EBA, /* 00 */
+ .sdram_config = 0x808022BA, /* 04 */
+ .ref_ctrl = 0x0000081A, /* 08 */
+ .sdram_tim1 = 0x772F6873, /* 0c */
+ .sdram_tim2 = 0x304a129a, /* 01 */
+ .sdram_tim3 = 0x02f7e45f, /* 14 */
+ .read_idle_ctrl = 0x00050000, /* 18 */
+ .zq_config = 0x000b3215, /* 1c */
+ .temp_alert_config = 0x08000a05, /* 20 */
+ .emif_ddr_phy_ctlr_1_init = 0x0E28420d, /* 24 */
+ .emif_ddr_phy_ctlr_1 = 0x0E28420d, /* 28 */
+ .emif_ddr_ext_phy_ctrl_1_init = 0x04020080, /* 2c */
+ .emif_ddr_ext_phy_ctrl_1 = 0x04020080, /* 30 */
+ .emif_ddr_ext_phy_ctrl_2_init = 0x28C518A3, /* 34 */
+ .emif_ddr_ext_phy_ctrl_2 = 0x28C518A3, /* 38 */
+ .emif_ddr_ext_phy_ctrl_3_init = 0x518A3146, /* 3c */
+ .emif_ddr_ext_phy_ctrl_3 = 0x518A3146, /* 40 */
+ .emif_ddr_ext_phy_ctrl_4_init = 0x0014628C, /* 44 */
+ .emif_ddr_ext_phy_ctrl_4 = 0x0014628C, /* 48 */
+ .emif_ddr_ext_phy_ctrl_5_init = 0x04010040, /* 4c */
+ .emif_ddr_ext_phy_ctrl_5 = 0x04010040, /* 50 */
+ .emif_ddr_ext_phy_ctrl_6_init = 0x01004010, /* 54 */
+ .emif_ddr_ext_phy_ctrl_6 = 0x01004010, /* 58 */
+ .emif_ddr_ext_phy_ctrl_7_init = 0x00001004, /* 5c */
+ .emif_ddr_ext_phy_ctrl_7 = 0x00001004, /* 60 */
+ .emif_ddr_ext_phy_ctrl_8_init = 0x04010040, /* 64 */
+ .emif_ddr_ext_phy_ctrl_8 = 0x04010040, /* 68 */
+ .emif_ddr_ext_phy_ctrl_9_init = 0x01004010, /* 6c */
+ .emif_ddr_ext_phy_ctrl_9 = 0x01004010, /* 70 */
+ .emif_ddr_ext_phy_ctrl_10_init = 0x00001004, /* 74 */
+ .emif_ddr_ext_phy_ctrl_10 = 0x00001004, /* 78 */
+ .emif_ddr_ext_phy_ctrl_11_init = 0x00000000, /* 7c */
+ .emif_ddr_ext_phy_ctrl_11 = 0x00000000, /* 80 */
+ .emif_ddr_ext_phy_ctrl_12_init = 0x00000000, /* 84 */
+ .emif_ddr_ext_phy_ctrl_12 = 0x00000000, /* 88 */
+ .emif_ddr_ext_phy_ctrl_13_init = 0x00000000, /* 8c */
+ .emif_ddr_ext_phy_ctrl_13 = 0x00000000, /* 90 */
+ .emif_ddr_ext_phy_ctrl_14_init = 0x80080080, /* 94 */
+ .emif_ddr_ext_phy_ctrl_14 = 0x80080080, /* 98 */
+ .emif_ddr_ext_phy_ctrl_15_init = 0x00800800, /* 9c */
+ .emif_ddr_ext_phy_ctrl_15 = 0x00800800, /* a0 */
+ .emif_ddr_ext_phy_ctrl_16_init = 0x08102040, /* a4 */
+ .emif_ddr_ext_phy_ctrl_16 = 0x08102040, /* a8 */
+ .emif_ddr_ext_phy_ctrl_17_init = 0x00000001, /* ac */
+ .emif_ddr_ext_phy_ctrl_17 = 0x00000001, /* b0 */
+ .emif_ddr_ext_phy_ctrl_18_init = 0x540A8150, /* b4 */
+ .emif_ddr_ext_phy_ctrl_18 = 0x540A8150, /* b8 */
+ .emif_ddr_ext_phy_ctrl_19_init = 0xA81502A0, /* bc */
+ .emif_ddr_ext_phy_ctrl_19 = 0xA81502a0, /* c0 */
+ .emif_ddr_ext_phy_ctrl_20_init = 0x002A0540, /* c4 */
+ .emif_ddr_ext_phy_ctrl_20 = 0x002A0540, /* c8 */
+ .emif_ddr_ext_phy_ctrl_21_init = 0x00000000, /* cc */
+ .emif_ddr_ext_phy_ctrl_21 = 0x00000000, /* d0 */
+ .emif_ddr_ext_phy_ctrl_22_init = 0x00000000, /* d4 */
+ .emif_ddr_ext_phy_ctrl_22 = 0x00000000, /* d8 */
+ .emif_ddr_ext_phy_ctrl_23_init = 0x00000000, /* dc */
+ .emif_ddr_ext_phy_ctrl_23 = 0x00000000, /* e0 */
+ .emif_ddr_ext_phy_ctrl_24_init = 0x00000077, /* e4 */
+ .emif_ddr_ext_phy_ctrl_24 = 0x00000077, /* e8 */
+ .emif_rd_wr_lvl_rmp_win = 0x0, /* ec */
+ .emif_rd_wr_lvl_rmp_ctl = 0x0, /* f0 */
+ .emif_rd_wr_lvl_ctl = 0x20000000, /* f4 */
+ .emif_rd_wr_exec_thresh = 0x00000305 /* f8 */
+};
+
+static void noinline omap5_sevm_init_lowlevel(void)
+{
+ struct dpll_param core = OMAP5_CORE_DPLL_PARAM_19M2_NOM;
+ struct dpll_param mpu = OMAP5_MPU_DPLL_PARAM_19M2_NOM;
+ struct dpll_param iva = OMAP5_IVA_DPLL_PARAM_19M2_NOM;
+ struct dpll_param per = OMAP5_PER_DPLL_PARAM_19M2_NOM;
+ struct dpll_param abe = OMAP5_ABE_DPLL_PARAM;
+ struct dpll_param usb = OMAP5_USB_DPLL_PARAM_19M2;
+
+ set_muxconf_regs();
+
+ omap5_ddr_init(&ddr_regs_elpida_532_mhz_2cs, &core);
+
+ omap5_scale_vcores();
+
+ writel(CM_CLKSEL_SYS_19M2, CM_CLKSEL_SYS);
+
+ /* Configure all DPLL's at 100% OPP */
+ omap5_configure_mpu_dpll(&mpu);
+ omap5_configure_iva_dpll(&iva);
+ omap5_configure_per_dpll(&per);
+ omap5_configure_abe_dpll(&abe);
+ omap5_configure_usb_dpll(&usb);
+
+ /* Enable all clocks */
+ omap5_enable_all_clocks();
+
+ sr32(0x4Ae0a31C, 8, 1, 0x1); /* enable software ioreq */
+ sr32(0x4Ae0a31C, 1, 2, 0x0); /* set for sys_clk (19.2MHz) */
+ sr32(0x4Ae0a31C, 16, 4, 0x0); /* set divisor to 1 */
+ sr32(0x4Ae0a110, 0, 1, 0x1); /* set the clock source to active */
+ sr32(0x4Ae0a110, 2, 2, 0x3); /* enable clocks */
+}
+
+void barebox_arm_reset_vector(void)
+{
+ arm_cpu_lowlevel_init();
+
+ if (get_pc() > 0x80000000)
+ goto out;
+
+ arm_setup_stack(0x4030d000);
+
+ omap5_sevm_init_lowlevel();
+out:
+ barebox_arm_entry(0x80000000, SZ_512M, 0);
+}
diff --git a/arch/arm/boards/omap5_sevm/mux.c
b/arch/arm/boards/omap5_sevm/mux.c
new file mode 100644
index 0000000..4f6b5cd
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/mux.c
@@ -0,0 +1,284 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP5 work in U-Boot project by
+ * Aneesh V <aneesh@ti.com>
+ * Sricharan R <r.sricharan@ti.com>
+ * (Copyright 2010, Texas Instruments, <www.ti.com>)
+ */
+
+#include <common.h>
+#include <init.h>
+#include <io.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap5-mux.h>
+#include <mach/omap5-clock.h>
+
+static const struct pad_conf_entry core_padconf_array[] = {
+ {EMMC_CLK, (PTU | IEN | M0)},
+ {EMMC_CMD, (PTU | IEN | M0)},
+ {EMMC_DATA0, (PTU | IEN | M0)},
+ {EMMC_DATA1, (PTU | IEN | M0)},
+ {EMMC_DATA2, (PTU | IEN | M0)},
+ {EMMC_DATA3, (PTU | IEN | M0)},
+ {EMMC_DATA4, (PTU | IEN | M0)},
+ {EMMC_DATA5, (PTU | IEN | M0)},
+ {EMMC_DATA6, (PTU | IEN | M0)},
+ {EMMC_DATA7, (PTU | IEN | M0)},
+ {C2C_CLKOUT0, (M0)},
+ {C2C_CLKOUT1, (M0)},
+ {C2C_CLKIN0, (IEN | M0)},
+ {C2C_CLKIN1, (IEN | M0)},
+ {C2C_DATAIN0, (IEN | M0)},
+ {C2C_DATAIN1, (IEN | M0)},
+ {C2C_DATAIN2, (IEN | M0)},
+ {C2C_DATAIN3, (IEN | M0)},
+ {C2C_DATAIN4, (IEN | M0)},
+ {C2C_DATAIN5, (IEN | M0)},
+ {C2C_DATAIN6, (IEN | M0)},
+ {C2C_DATAIN7, (IEN | M0)},
+ {C2C_DATAOUT0, (M0)},
+ {C2C_DATAOUT1, (M0)},
+ {C2C_DATAOUT2, (M0)},
+ {C2C_DATAOUT3, (M0)},
+ {C2C_DATAOUT4, (M0)},
+ {C2C_DATAOUT5, (M0)},
+ {C2C_DATAOUT6, (M0)},
+ {C2C_DATAOUT7, (M0)},
+ {C2C_DATA8, (IEN | M0)},
+ {C2C_DATA9, (IEN | M0)},
+ {C2C_DATA10, (IEN | M0)},
+ {C2C_DATA11, (IEN | M0)},
+ {C2C_DATA12, (IEN | M0)},
+ {C2C_DATA13, (IEN | M0)},
+ {C2C_DATA14, (IEN | M0)},
+ {C2C_DATA15, (IEN | M0)},
+ {LLIB_WAKEREQOUT, (PTU | IEN | M6)},
+ {LLIA_WAKEREQOUT, (M1)},
+ {HSI1_ACREADY, (PTD | M6)},
+ {HSI1_CAREADY, (PTD | M6)},
+ {HSI1_ACWAKE, (PTD | IEN | M6)},
+ {HSI1_CAWAKE, (PTU | IEN | M6)},
+ {HSI1_ACFLAG, (PTD | IEN | M6)},
+ {HSI1_ACDATA, (PTD | M6)},
+ {HSI1_CAFLAG, (M6)},
+ {HSI1_CADATA, (M6)},
+ {UART1_TX, (M0)},
+ {UART1_CTS, (PTU | IEN | M0)},
+ {UART1_RX, (PTU | IEN | M0)},
+ {UART1_RTS, (M0)},
+ {HSI2_CAREADY, (IEN | M0)},
+ {HSI2_ACREADY, (M0)},
+ {HSI2_CAWAKE, (IEN | M0)},
+ {HSI2_ACWAKE, (M0)},
+ {HSI2_CAFLAG, (IEN | M0)},
+ {HSI2_CADATA, (IEN | M0)},
+ {HSI2_ACFLAG, (M0)},
+ {HSI2_ACDATA, (M0)},
+ {UART2_RTS, (IEN | M1)},
+ {UART2_CTS, (IEN | M1)},
+ {UART2_RX, (IEN | M1)},
+ {UART2_TX, (IEN | M1)},
+ {USBB1_HSIC_STROBE, (PTU | IEN | M0)},
+ {USBB1_HSIC_DATA, (PTU | IEN | M0)},
+ {USBB2_HSIC_STROBE, (PTU | IEN | M0)},
+ {USBB2_HSIC_DATA, (PTU | IEN | M0)},
+ {TIMER10_PWM_EVT, (IEN | M0)},
+ {DSIPORTA_TE0, (IEN | M0)},
+ {DSIPORTA_LANE0X, (IEN | M0)},
+ {DSIPORTA_LANE0Y, (IEN | M0)},
+ {DSIPORTA_LANE1X, (IEN | M0)},
+ {DSIPORTA_LANE1Y, (IEN | M0)},
+ {DSIPORTA_LANE2X, (IEN | M0)},
+ {DSIPORTA_LANE2Y, (IEN | M0)},
+ {DSIPORTA_LANE3X, (IEN | M0)},
+ {DSIPORTA_LANE3Y, (IEN | M0)},
+ {DSIPORTA_LANE4X, (IEN | M0)},
+ {DSIPORTA_LANE4Y, (IEN | M0)},
+ {DSIPORTC_LANE0X, (IEN | M0)},
+ {DSIPORTC_LANE0Y, (IEN | M0)},
+ {DSIPORTC_LANE1X, (IEN | M0)},
+ {DSIPORTC_LANE1Y, (IEN | M0)},
+ {DSIPORTC_LANE2X, (IEN | M0)},
+ {DSIPORTC_LANE2Y, (IEN | M0)},
+ {DSIPORTC_LANE3X, (IEN | M0)},
+ {DSIPORTC_LANE3Y, (IEN | M0)},
+ {DSIPORTC_LANE4X, (IEN | M0)},
+ {DSIPORTC_LANE4Y, (IEN | M0)},
+ {DSIPORTC_TE0, (IEN | M0)},
+ {TIMER9_PWM_EVT, (IEN | M0)},
+ {I2C4_SCL, (IEN | M0)},
+ {I2C4_SDA, (IEN | M0)},
+ {MCSPI2_CLK, (IEN | M0)},
+ {MCSPI2_SIMO, (IEN | M0)},
+ {MCSPI2_SOMI, (PTU | IEN | M0)},
+ {MCSPI2_CS0, (M0)},
+ {RFBI_DATA15, (M4)},
+ {RFBI_DATA14, (M4)},
+ {RFBI_DATA13, (PTU | IEN | M6)},
+ {RFBI_DATA12, (PTD | M6)},
+ {RFBI_DATA11, (PTD | M6)},
+ {RFBI_DATA10, (PTD | M6)},
+ {RFBI_DATA9, (PTD | M6)},
+ {RFBI_DATA8, (M4)},
+ {RFBI_DATA7, (PTD | M6)},
+ {RFBI_DATA6, (PTD | M6)},
+ {RFBI_DATA5, (IEN | M6)},
+ {RFBI_DATA4, (IEN | M6)},
+ {RFBI_DATA3, (PTD | IEN | M6)},
+ {RFBI_DATA2, (PTD | M6)},
+ {RFBI_DATA1, (PTD | M6)},
+ {RFBI_DATA0, (PTD | M6)},
+ {RFBI_WE, (PTD | M6)},
+ {MCSPI2_CS0, (M0)},
+ {RFBI_A0, (PTD | IEN | M6)},
+ {RFBI_RE, (M4)},
+ {RFBI_HSYNC0, (M4)},
+ {RFBI_TE_VSYNC0, (PTD | M6)},
+ {GPIO6_182, (M6)},
+ {GPIO6_183, (PTD | M6)},
+ {GPIO6_184, (M4)},
+ {GPIO6_185, (PTD | IEN | M6)},
+ {GPIO6_186, (PTD | M6)},
+ {GPIO6_187, (PTU | IEN | M4)},
+ {HDMI_CEC, (IEN | M0)},
+ {HDMI_HPD, (PTD | IEN | M0)},
+ {HDMI_DDC_SCL, (IEN | M0)},
+ {HDMI_DDC_SDA, (IEN | M0)},
+ {CSIPORTC_LANE0X, (IEN | M0)},
+ {CSIPORTC_LANE0Y, (IEN | M0)},
+ {CSIPORTC_LANE1X, (IEN | M0)},
+ {CSIPORTC_LANE1Y, (IEN | M0)},
+ {CSIPORTB_LANE0X, (IEN | M0)},
+ {CSIPORTB_LANE0Y, (IEN | M0)},
+ {CSIPORTB_LANE1X, (IEN | M0)},
+ {CSIPORTB_LANE1Y, (IEN | M0)},
+ {CSIPORTB_LANE2X, (IEN | M0)},
+ {CSIPORTB_LANE2Y, (IEN | M0)},
+ {CSIPORTB_LANE0X, (IEN | M0)},
+ {CSIPORTB_LANE0Y, (IEN | M0)},
+ {CSIPORTA_LANE1X, (IEN | M0)},
+ {CSIPORTA_LANE1Y, (IEN | M0)},
+ {CSIPORTA_LANE2X, (IEN | M0)},
+ {CSIPORTA_LANE2Y, (IEN | M0)},
+ {CSIPORTA_LANE3X, (IEN | M0)},
+ {CSIPORTA_LANE3Y, (IEN | M0)},
+ {CSIPORTA_LANE4X, (IEN | M0)},
+ {CSIPORTA_LANE4Y, (IEN | M0)},
+ {CAM_SHUTTER, (M0)},
+ {CAM_STROBE, (M0)},
+ {CAM_GLOBALRESET, (IEN | M0)},
+ {TIMER11_PWM_EVT, (PTD | M6)},
+ {TIMER5_PWM_EVT, (PTD | M6)},
+ {TIMER6_PWM_EVT, (PTD | M6)},
+ {TIMER8_PWM_EVT, (PTU | M6)},
+ {I2C3_SCL, (IEN | M0)},
+ {I2C3_SDA, (IEN | M0)},
+ {GPIO8_233, (IEN | M2)},
+ {GPIO8_234, (IEN | M3)},
+ {ABE_CLKS, (IEN | M0)},
+ {ABEDMIC_DIN1, (IEN | M0)},
+ {ABEDMIC_DIN2, (IEN | M0)},
+ {ABEDMIC_DIN3, (IEN | M0)},
+ {ABEDMIC_CLK1, (M0)},
+ {ABEDMIC_CLK2, (IEN | M1)},
+ {ABEDMIC_CLK3, (M1)},
+ {ABESLIMBUS1_CLOCK, (IEN | M1)},
+ {ABESLIMBUS1_DATA, (IEN | M1)},
+ {ABEMCBSP2_DR, (IEN | M0)},
+ {ABEMCBSP2_DX, (M0)},
+ {ABEMCBSP2_FSX, (IEN | M0)},
+ {ABEMCBSP2_CLKX, (IEN | M0)},
+ {ABEMCPDM_UL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},
+ {ABEMCPDM_DL_DATA, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},
+ {ABEMCPDM_FRAME, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},
+ {ABEMCPDM_LB_CLK, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)},
+ {WLSDIO_CLK, (PTU | IEN | M0)},
+ {WLSDIO_CMD, (PTU | IEN | M0)},
+ {WLSDIO_DATA0, (PTU | IEN | M0)},
+ {WLSDIO_DATA1, (PTU | IEN | M0)},
+ {WLSDIO_DATA2, (PTU | IEN | M0)},
+ {WLSDIO_DATA3, (PTU | IEN | M0)},
+ {UART5_RX, (PTU | IEN | M0)},
+ {UART5_TX, (M0)},
+ {UART5_CTS, (PTU | IEN | M0)},
+ {UART5_RTS, (M0)},
+ {I2C2_SCL, (IEN | M0)},
+ {I2C2_SDA, (IEN | M0)},
+ {MCSPI1_CLK, (M6)},
+ {MCSPI1_SOMI, (IEN | M6)},
+ {MCSPI1_SIMO, (PTD | M6)},
+ {MCSPI1_CS0, (PTD | M6)},
+ {MCSPI1_CS1, (PTD | IEN | M6)},
+ {I2C5_SCL, (IEN | M0)},
+ {I2C5_SDA, (IEN | M0)},
+ {PERSLIMBUS2_CLOCK, (PTD | M6)},
+ {PERSLIMBUS2_DATA, (PTD | IEN | M6)},
+ {UART6_TX, (PTU | IEN | M6)},
+ {UART6_RX, (PTU | IEN | M6)},
+ {UART6_CTS, (PTU | IEN | M6)},
+ {UART6_RTS, (PTU | M0)},
+ {UART3_CTS_RCTX, (PTU | IEN | M6)},
+ {UART3_RTS_IRSD, (PTU | IEN | M1)},
+ {UART3_RX_IRRX, (PTU | IEN | M0)},
+ {UART3_TX_IRTX, (M0)},
+ {USBB3_HSIC_STROBE, (PTU | IEN | M0)},
+ {USBB3_HSIC_DATA, (PTU | IEN | M0)},
+ {SDCARD_CLK, (PTU | IEN | M0)},
+ {SDCARD_CMD, (PTU | IEN | M0)},
+ {SDCARD_DATA2, (PTU | IEN | M0)},
+ {SDCARD_DATA3, (PTU | IEN | M0)},
+ {SDCARD_DATA0, (PTU | IEN | M0)},
+ {SDCARD_DATA1, (PTU | IEN | M0)},
+ {USBD0_HS_DP, (IEN | M0)},
+ {USBD0_HS_DM, (IEN | M0)},
+ {I2C1_PMIC_SCL, (PTU | IEN | M0)},
+ {I2C1_PMIC_SDA, (PTU | IEN | M0)},
+ {USBD0_SS_RX, (IEN | M0)},
+};
+
+static const struct pad_conf_entry wkup_padconf_array[] = {
+ {LLIA_WAKEREQIN, (IEN | M1)},
+ {LLIB_WAKEREQIN, (IEN | M1)},
+ {DRM_EMU0, (PTU | IEN | M0)},
+ {DRM_EMU1, (PTU | IEN | M0)},
+ {JTAG_NTRST, (IEN | M0)},
+ {JTAG_TCK, (IEN | M0)},
+ {JTAG_RTCK, (M0)},
+ {JTAG_TMSC, (IEN | M0)},
+ {JTAG_TDI, (IEN | M0)},
+ {JTAG_TDO, (M0)},
+ {SYS_32K, (IEN | M0)},
+ {FREF_CLK_IOREQ, (IEN | M0)},
+ {FREF_CLK0_OUT, (M0)},
+ {FREF_CLK1_OUT, (M0)},
+ {FREF_CLK2_OUT, (M0)},
+ {FREF_CLK2_REQ, (PTU | IEN | M6)},
+ {FREF_CLK1_REQ, (PTD | IEN | M6)},
+ {SYS_NRESPWRON, (IEN | M0)},
+ {SYS_NRESWARM, (PTU | IEN | M0)},
+ {SYS_PWR_REQ, (M0)},
+ {SYS_NIRQ1, (PTU | IEN | M0)},
+ {SYS_NIRQ2, (PTU | IEN | M0)},
+ {SR_PMIC_SCL, (PTU | IEN | M0)},
+ {SR_PMIC_SDA, (PTU | IEN | M0)},
+ {SYS_BOOT0, (IEN | M0)},
+ {SYS_BOOT1, (IEN | M0)},
+ {SYS_BOOT2, (IEN | M0)},
+ {SYS_BOOT3, (IEN | M0)},
+ {SYS_BOOT4, (IEN | M0)},
+ {SYS_BOOT5, (IEN | M0)},
+};
+
+void set_muxconf_regs(void)
+{
+ omap5_do_set_mux(OMAP54XX_CONTROL_PADCONF_CORE, core_padconf_array,
+ ARRAY_SIZE(core_padconf_array));
+ omap5_do_set_mux(OMAP54XX_CONTROL_PADCONF_WKUP, wkup_padconf_array,
+ ARRAY_SIZE(wkup_padconf_array));
+}
diff --git a/arch/arm/configs/omap5_sevm_defconfig
b/arch/arm/configs/omap5_sevm_defconfig
new file mode 100644
index 0000000..5cd51bb
--- /dev/null
+++ b/arch/arm/configs/omap5_sevm_defconfig
@@ -0,0 +1,68 @@
+CONFIG_ARCH_OMAP=y
+CONFIG_ARCH_OMAP5=y
+CONFIG_MACH_OMAP5_SEVM=y
+CONFIG_AEABI=y
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_ARM_UNWIND=y
+CONFIG_MMU=y
+CONFIG_TEXT_BASE=0x8f000000
+CONFIG_MALLOC_SIZE=0x2000000
+CONFIG_MALLOC_TLSF=y
+CONFIG_KALLSYMS=y
+CONFIG_PROMPT="barebox> "
+CONFIG_LONGHELP=y
+CONFIG_GLOB=y
+CONFIG_HUSH_FANCY_PROMPT=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+# CONFIG_TIMESTAMP is not set
+CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/omap5_sevm/env"
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_ECHO_E=y
+CONFIG_CMD_LOADB=y
+CONFIG_CMD_IOMEM=y
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_BOOTM_VERBOSE=y
+CONFIG_CMD_BOOTM_INITRD=y
+CONFIG_CMD_BOOTM_OFTREE=y
+# CONFIG_CMD_BOOTU is not set
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_MAGICVAR=y
+CONFIG_CMD_MAGICVAR_HELP=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_UNCOMPRESS=y
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_NFS=y
+CONFIG_NET_PING=y
+CONFIG_CMD_TFTP=y
+CONFIG_FS_TFTP=y
+CONFIG_DRIVER_SERIAL_NS16550=y
+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
+CONFIG_DRIVER_NET_SMC911X=y
+# CONFIG_SPI is not set
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_OMAP_GPMC=y
+CONFIG_UBI=y
+CONFIG_MCI=y
+CONFIG_MCI_STARTUP=y
+CONFIG_MCI_OMAP_HSMMC=y
+CONFIG_FS_FAT=y
+CONFIG_FS_FAT_WRITE=y
+CONFIG_FS_FAT_LFN=y
+CONFIG_ZLIB=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_DEBUG_LL=y
diff --git a/arch/arm/configs/omap5_sevm_xload_defconfig
b/arch/arm/configs/omap5_sevm_xload_defconfig
new file mode 100644
index 0000000..2c47c87
--- /dev/null
+++ b/arch/arm/configs/omap5_sevm_xload_defconfig
@@ -0,0 +1,44 @@
+CONFIG_ARCH_OMAP=y
+CONFIG_ARCH_OMAP5=y
+CONFIG_OMAP_BUILD_IFT=y
+CONFIG_MACH_OMAP5_SEVM=y
+CONFIG_AEABI=y
+CONFIG_THUMB2_BAREBOX=y
+# CONFIG_CMD_ARM_CPUINFO is not set
+# CONFIG_ARM_EXCEPTIONS is not set
+CONFIG_MMU=y
+CONFIG_TEXT_BASE=0x40300000
+CONFIG_MEMORY_LAYOUT_FIXED=y
+CONFIG_STACK_BASE=0x8f000000
+CONFIG_MALLOC_BASE=0x84000000
+CONFIG_MALLOC_SIZE=0x2000000
+CONFIG_MALLOC_DUMMY=y
+CONFIG_PROMPT="barebox> "
+CONFIG_SHELL_NONE=y
+# CONFIG_ERRNO_MESSAGES is not set
+# CONFIG_TIMESTAMP is not set
+# CONFIG_CONSOLE_FULL is not set
+# CONFIG_DEFAULT_ENVIRONMENT is not set
+# CONFIG_DRIVER_SERIAL_NS16550 is not set
+# CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS is not set
+# CONFIG_SPI is not set
+# CONFIG_MTD is not set
+# CONFIG_MTD_WRITE is not set
+# CONFIG_MTD_OOB_DEVICE is not set
+CONFIG_NAND=y
+# CONFIG_NAND_ECC_SOFT is not set
+# CONFIG_NAND_ECC_HW_SYNDROME is not set
+# CONFIG_NAND_ECC_HW_NONE is not set
+# CONFIG_NAND_INFO is not set
+# CONFIG_NAND_BBT is not set
+CONFIG_NAND_OMAP_GPMC=y
+CONFIG_MCI=y
+CONFIG_MCI_STARTUP=y
+# CONFIG_MCI_WRITE is not set
+CONFIG_MCI_OMAP_HSMMC=y
+# CONFIG_FS_RAMFS is not set
+# CONFIG_FS_DEVFS is not set
+CONFIG_FS_FAT=y
+# CONFIG_DEBUG_LL is not set
+# CONFIG_BANNER is not set
+# CONFIG_MEMINFO is not set
diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index 42e5f4a..0ad3864 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -41,6 +41,14 @@ config ARCH_OMAP4
help
Say Y here if you are using Texas Instrument's OMAP4 based platform
+config ARCH_OMAP5
+ bool "OMAP5"
+ select CPU_V7
+ select GENERIC_GPIO
+ select OMAP_CLOCK_SOURCE_S32K
+ help
+ Say Y here if you are using Texas Instrument's OMAP5 based platform
+
config ARCH_AM33XX
bool "AM33xx"
select CPU_V7
@@ -115,6 +123,7 @@ config BOARDINFO
default "Phytec phyCARD-A-L1" if MACH_PCAAL1
default "Phytec phyCARD-A-XL2" if MACH_PCAAXL2
default "Phytec phyCORE-AM335x" if MACH_PCM051
+ default "Phytec phyCORE omap5_sevm" if MACH_OMAP5_SEVM
choice
prompt "Select OMAP board"
@@ -177,6 +186,13 @@ config MACH_PCAAXL2
help
Say Y here if you are using a phyCARD-A-XL1 PCA-A-XL1
+config MACH_OMAP5_SEVM
+ bool "Phytec phyCORE omap5_sevm"
+ depends on ARCH_OMAP5
+ help
+ Say Y here if you are using Phytecs phyCORE omap5_sevm board
+ based on OMAP5
+
config MACH_PCM051
bool "Phytec phyCORE pcm051"
select OMAP_CLOCK_ALL
diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
index d9e00f7..e65353f 100644
--- a/arch/arm/mach-omap/Makefile
+++ b/arch/arm/mach-omap/Makefile
@@ -23,6 +23,8 @@ obj-$(CONFIG_ARCH_OMAP3) += omap3_generic.o auxcr.o
pbl-$(CONFIG_ARCH_OMAP3) += omap3_generic.o auxcr.o
obj-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
pbl-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
+obj-$(CONFIG_ARCH_OMAP5) += omap5_generic.o omap5_clock.o
+pbl-$(CONFIG_ARCH_OMAP5) += omap5_generic.o omap5_clock.o
obj-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o am33xx_clock.o am33xx_mux.o
obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
pbl-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
diff --git a/arch/arm/mach-omap/gpmc.c b/arch/arm/mach-omap/gpmc.c
index bb84b38..1620f0f 100644
--- a/arch/arm/mach-omap/gpmc.c
+++ b/arch/arm/mach-omap/gpmc.c
@@ -26,6 +26,7 @@
#include <errno.h>
#include <mach/omap3-silicon.h>
#include <mach/omap4-silicon.h>
+#include <mach/omap5-silicon.h>
#include <mach/am33xx-silicon.h>
#include <mach/gpmc.h>
#include <mach/sys_info.h>
@@ -39,6 +40,8 @@ static int gpmc_init(void)
omap_gpmc_base = (void *)OMAP3_GPMC_BASE;
#elif defined(CONFIG_ARCH_OMAP4)
omap_gpmc_base = (void *)OMAP44XX_GPMC_BASE;
+#elif defined(CONFIG_ARCH_OMAP5)
+ omap_gpmc_base = (void *)OMAP54XX_GPMC_BASE;
#elif defined(CONFIG_ARCH_AM33XX)
omap_gpmc_base = (void *)AM33XX_GPMC_BASE;
#else
diff --git a/arch/arm/mach-omap/include/mach/debug_ll.h
b/arch/arm/mach-omap/include/mach/debug_ll.h
index 38ca562..473d8f4 100644
--- a/arch/arm/mach-omap/include/mach/debug_ll.h
+++ b/arch/arm/mach-omap/include/mach/debug_ll.h
@@ -39,6 +39,11 @@
#endif
#endif
+#ifdef CONFIG_ARCH_OMAP5
+#include <mach/omap5-silicon.h>
+#define UART_BASE OMAP54XX_UART3_BASE
+#endif
+
#ifdef CONFIG_ARCH_AM33XX
#include <mach/am33xx-silicon.h>
#define UART_BASE AM33XX_UART0_BASE
diff --git a/arch/arm/mach-omap/include/mach/generic.h
b/arch/arm/mach-omap/include/mach/generic.h
index 7455404..f4917ba 100644
--- a/arch/arm/mach-omap/include/mach/generic.h
+++ b/arch/arm/mach-omap/include/mach/generic.h
@@ -27,6 +27,12 @@
#define cpu_is_omap4xxx() (0)
#endif
+#ifdef CONFIG_ARCH_OMAP5
+#define cpu_is_omap5xxx() (1)
+#else
+#define cpu_is_omap5xxx() (0)
+#endif
+
enum omap_boot_src {
OMAP_BOOTSRC_UNKNOWN,
OMAP_BOOTSRC_MMC1,
@@ -39,5 +45,6 @@ enum omap_boot_src omap_bootsrc(void);
enum omap_boot_src am33xx_bootsrc(void);
enum omap_boot_src omap3_bootsrc(void);
enum omap_boot_src omap4_bootsrc(void);
+enum omap_boot_src omap5_bootsrc(void);
#endif
diff --git a/arch/arm/mach-omap/include/mach/gpmc_nand.h
b/arch/arm/mach-omap/include/mach/gpmc_nand.h
index 4a93465..5fe6d0f 100644
--- a/arch/arm/mach-omap/include/mach/gpmc_nand.h
+++ b/arch/arm/mach-omap/include/mach/gpmc_nand.h
@@ -65,5 +65,6 @@ int omap_add_gpmc_nand_device(struct
gpmc_nand_platform_data *pdata);
extern struct gpmc_config omap3_nand_cfg;
extern struct gpmc_config omap4_nand_cfg;
+extern struct gpmc_config omap5_nand_cfg;
#endif /* __ASM_OMAP_NAND_GPMC_H */
diff --git a/arch/arm/mach-omap/include/mach/omap5-clock.h
b/arch/arm/mach-omap/include/mach/omap5-clock.h
new file mode 100644
index 0000000..9d9f9a4
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-clock.h
@@ -0,0 +1,444 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ */
+
+#define OMAP_543X_REV_1_0 1
+
+/* CKGEN_PRM Registers */
+#define CM_CLKSEL_ABE_DSS_SYS 0x4ae06100
+#define CM_CLKSEL_WKUPAON (CM_CLKSEL_ABE_DSS_SYS + 0x0008)
+#define CM_CLKSEL_ABE_PLL_REF (CM_CLKSEL_ABE_DSS_SYS + 0x000C)
+#define CM_CLKSEL_SYS (CM_CLKSEL_ABE_DSS_SYS + 0x0010)
+
+#define CM_CLKSEL_SYS_12M0 0x1 /* 12.0MHz */
+/* Reserved 0x2 */
+#define CM_CLKSEL_SYS_16M8 0x3 /* 16.8MHz */
+#define CM_CLKSEL_SYS_19M2 0x4 /* 19.2MHz */
+#define CM_CLKSEL_SYS_26M0 0x5 /* 26.0MHz */
+/* Reserved 0x6 */
+#define CM_CLKSEL_SYS_38M4 0x7 /* 38.4MHz */
+
+/* WKUPAON_CM Registers */
+#define CM_WKUPAON_CLKCTRL_REV1 0x4ae07800
+#define CM_WKUPAON_CLKCTRL_REV2 0x4ae07900
+#define CM_WKUPAON_L4_WKUP_CLKCTRL_OFT 0x0020
+#define CM_WKUPAON_WD_TIMER2_CLKCTRL_OFT 0x0030
+#define CM_WKUPAON_GPIO1_CLKCTRL_OFT 0x0038
+#define CM_WKUPAON_TIMER1_CLKCTRL_OFT 0x0040
+#define CM_WKUPAON_COUNTER_32K_CLKCTRL_OFT 0x0050
+#define CM_WKUPAON_SAR_RAM_CLKCTRL_OFT 0x0060
+#define CM_WKUPAON_KBD_CLKCTRL_OFT 0x0078
+#define CM_WKUPAON_SCRM_CLKCTRL_OFT 0x0090
+#define CM_WKUPAON_IO_SRCOMP_CLKCTRL_OFT 0x0098
+
+/* CKGEN_CM_CORE_AON Registers */
+#define CM_BASE 0x4a004100
+#define CM_CLKSEL_CORE CM_BASE
+#define CM_CLKSEL_ABE (CM_BASE + 0x0008)
+#define CM_DLL_CTRL (CM_BASE + 0x0010)
+#define CM_CLKMODE_DPLL_CORE (CM_BASE + 0x0020)
+#define CM_IDLEST_DPLL_CORE (CM_BASE + 0x0024)
+#define CM_AUTOIDLE_DPLL_CORE (CM_BASE + 0x0028)
+#define CM_CLKSEL_DPLL_CORE (CM_BASE + 0x002c)
+#define CM_DIV_M2_DPLL_CORE (CM_BASE + 0x0030)
+#define CM_DIV_M3_DPLL_CORE (CM_BASE + 0x0034)
+#define CM_DIV_H11_DPLL_CORE (CM_BASE + 0x0038)
+#define CM_DIV_H12_DPLL_CORE (CM_BASE + 0x003c)
+#define CM_DIV_H13_DPLL_CORE (CM_BASE + 0x0040)
+#define CM_DIV_H14_DPLL_CORE (CM_BASE + 0x0044)
+#define CM_SSC_DELTAMSTEP_DPLL_CORE (CM_BASE + 0x0048)
+#define CM_SSC_MODFREQDIV_DPLL_CORE (CM_BASE + 0x004c)
+#define CM_DIV_H21_DPLL_CORE (CM_BASE + 0x0050) /* For rev. 2 */
+#define CM_DIV_H22_DPLL_CORE (CM_BASE + 0x0054)
+#define CM_DIV_H23_DPLL_CORE (CM_BASE + 0x0058)
+#define CM_DIV_H24_DPLL_CORE (CM_BASE + 0x005c) /* For rev. 2 */
+#define CM_CLKMODE_DPLL_MPU (CM_BASE + 0x0060)
+#define CM_IDLEST_DPLL_MPU (CM_BASE + 0x0064)
+#define CM_AUTOIDLE_DPLL_MPU (CM_BASE + 0x0068)
+#define CM_CLKSEL_DPLL_MPU (CM_BASE + 0x006c)
+#define CM_DIV_M2_DPLL_MPU (CM_BASE + 0x0070)
+#define CM_SSC_DELTAMSTEP_DPLL_MPU (CM_BASE + 0x0088)
+#define CM_SSC_MODFREQDIV_DPLL_MPU (CM_BASE + 0x008c)
+#define CM_BYPCLK_DPLL_MPU (CM_BASE + 0x009c)
+#define CM_CLKMODE_DPLL_IVA (CM_BASE + 0x00a0)
+#define CM_IDLEST_DPLL_IVA (CM_BASE + 0x00a4)
+#define CM_AUTOIDLE_DPLL_IVA (CM_BASE + 0x00a8)
+#define CM_CLKSEL_DPLL_IVA (CM_BASE + 0x00ac)
+#define CM_DIV_H11_DPLL_IVA (CM_BASE + 0x00b8)
+#define CM_DIV_H12_DPLL_IVA (CM_BASE + 0x00bc)
+#define CM_SSC_DELTAMSTEP_DPLL_IVA (CM_BASE + 0x00c8)
+#define CM_SSC_MODFREQDIV_DPLL_IVA (CM_BASE + 0x00cc)
+#define CM_BYPCLK_DPLL_IVA (CM_BASE + 0x00dc)
+#define CM_CLKMODE_DPLL_ABE (CM_BASE + 0x00e0)
+#define CM_IDLEST_DPLL_ABE (CM_BASE + 0x00e4)
+#define CM_AUTOIDLE_DPLL_ABE (CM_BASE + 0x00e8)
+#define CM_CLKSEL_DPLL_ABE (CM_BASE + 0x00ec)
+#define CM_DIV_M2_DPLL_ABE (CM_BASE + 0x00f0)
+#define CM_DIV_M3_DPLL_ABE (CM_BASE + 0x00f4)
+#define CM_SSC_DELTAMSTEP_DPLL_ABE (CM_BASE + 0x0108)
+#define CM_SSC_MODFREQDIV_DPLL_ABE (CM_BASE + 0x010c)
+#define CM_SHADOW_FREQ_CONFIG1 (CM_BASE + 0x0160)
+#define CM_SHADOW_FREQ_CONFIG2 (CM_BASE + 0x0164)
+#define CM_DYN_DEP_PRESCAL (CM_BASE + 0x0170)
+#define CM_RESTORE_ST (CM_BASE + 0x0180)
+
+/* DSP_CM_CORE_AON Registers */
+#define CM_DSP_CLKSTCTRL 0x4a004400
+#define CM_DSP_STATICDEP (CM_DSP_CLKSTCTRL + 0x0004)
+#define CM_DSP_DYNAMICDEP (CM_DSP_CLKSTCTRL + 0x0008)
+#define CM_DSP_DSP_CLKCTRL (CM_DSP_CLKSTCTRL + 0x0020)
+
+/* ABE_CM_CORE_AON Registers */
+#define ABE_BASE 0x4a004500
+#define CM_ABE_CLKSTCTRL ABE_BASE
+#define CM_ABE_L4_ABE_CLKCTRL (ABE_BASE + 0x0020)
+#define CM_ABE_AESS_CLKCTRL (ABE_BASE + 0x0028)
+#define CM_ABE_MCPDM_CLKCTRL (ABE_BASE + 0x0030)
+#define CM_ABE_DMIC_CLKCTRL (ABE_BASE + 0x0038)
+#define CM_ABE_MCASP_CLKCTRL (ABE_BASE + 0x0040)
+#define CM_ABE_MCBSP1_CLKCTRL (ABE_BASE + 0x0048)
+#define CM_ABE_MCBSP2_CLKCTRL (ABE_BASE + 0x0050)
+#define CM_ABE_MCBSP3_CLKCTRL (ABE_BASE + 0x0058)
+#define CM_ABE_SLIMBUS1_CLKCTRL (ABE_BASE + 0x0060)
+#define CM_ABE_TIMER5_CLKCTRL (ABE_BASE + 0x0068)
+#define CM_ABE_TIMER6_CLKCTRL (ABE_BASE + 0x0070)
+#define CM_ABE_TIMER7_CLKCTRL (ABE_BASE + 0x0078)
+#define CM_ABE_TIMER8_CLKCTRL (ABE_BASE + 0x0080)
+#define CM_ABE_WD_TIMER3_CLKCTRL (ABE_BASE + 0x0088)
+
+/* CKGEN_CM_CORE Registers */
+#define CKGEN_BASE 0x4a008100
+#define CM_CLKSEL_USB_60MHZ (CKGEN_BASE + 0x0004)
+#define CM_CLKMODE_DPLL_PER (CKGEN_BASE + 0x0040)
+#define CM_IDLEST_DPLL_PER (CKGEN_BASE + 0x0044)
+#define CM_AUTOIDLE_DPLL_PER (CKGEN_BASE + 0x0048)
+#define CM_CLKSEL_DPLL_PER (CKGEN_BASE + 0x004c)
+#define CM_DIV_M2_DPLL_PER (CKGEN_BASE + 0x0050)
+#define CM_DIV_M3_DPLL_PER (CKGEN_BASE + 0x0054)
+#define CM_DIV_H11_DPLL_PER (CKGEN_BASE + 0x0058)
+#define CM_DIV_H12_DPLL_PER (CKGEN_BASE + 0x005c)
+#define CM_DIV_H14_DPLL_PER (CKGEN_BASE + 0x0064)
+#define CM_SSC_DELTAMSTEP_DPLL_PER (CKGEN_BASE + 0x0068)
+#define CM_SSC_MODFREQDIV_DPLL_PER (CKGEN_BASE + 0x006c)
+#define CM_CLKMODE_DPLL_USB (CKGEN_BASE + 0x0080)
+#define CM_IDLEST_DPLL_USB (CKGEN_BASE + 0x0084)
+#define CM_AUTOIDLE_DPLL_USB (CKGEN_BASE + 0x0088)
+#define CM_CLKSEL_DPLL_USB (CKGEN_BASE + 0x008c)
+#define CM_DIV_M2_DPLL_USB (CKGEN_BASE + 0x0090)
+#define CM_SSC_DELTAMSTEP_DPLL_USB (CKGEN_BASE + 0x00a8)
+#define CM_SSC_MODFREQDIV_DPLL_USB (CKGEN_BASE + 0x00ac)
+#define CM_CLKDCOLDO_DPLL_USB (CKGEN_BASE + 0x00b4)
+#define CM_CLKMODE_DPLL_UNIPRO2 (CKGEN_BASE + 0x00c0)
+#define CM_IDLEST_DPLL_UNIPRO2 (CKGEN_BASE + 0x00c4)
+#define CM_AUTOIDLE_DPLL_UNIPRO2 (CKGEN_BASE + 0x00c8)
+#define CM_CLKSEL_DPLL_UNIPRO2 (CKGEN_BASE + 0x00cc)
+#define CM_DIV_M2_DPLL_UNIPRO2 (CKGEN_BASE + 0x00d0)
+#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO2 (CKGEN_BASE + 0x00e8)
+#define CM_SSC_MODFREQDIV_DPLL_UNIPRO2 (CKGEN_BASE + 0x00ec)
+#define CM_CLKDCOLDO_DPLL_UNIPRO2 (CKGEN_BASE + 0x00f4)
+#define CM_CLKMODE_DPLL_UNIPRO1 (CKGEN_BASE + 0x0100)
+#define CM_IDLEST_DPLL_UNIPRO1 (CKGEN_BASE + 0x0104)
+#define CM_AUTOIDLE_DPLL_UNIPRO1 (CKGEN_BASE + 0x0108)
+#define CM_CLKSEL_DPLL_UNIPRO1 (CKGEN_BASE + 0x010c)
+#define CM_DIV_M2_DPLL_UNIPRO1 (CKGEN_BASE + 0x0110)
+#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO1 (CKGEN_BASE + 0x0128)
+#define CM_SSC_MODFREQDIV_DPLL_UNIPRO1 (CKGEN_BASE + 0x012c)
+#define CM_CLKDCOLDO_DPLL_UNIPRO1 (CKGEN_BASE + 0x0134)
+
+/* CORE_CM_CORE Registers */
+#define CORE_BASE 0x4a008700
+#define CM_L3MAIN1_CLKSTCTRL (CORE_BASE + 0x0000)
+#define CM_L3MAIN1_DYNAMICDEP (CORE_BASE + 0x0008)
+#define CM_L3MAIN1_L3_MAIN_1_CLKCTRL (CORE_BASE + 0x0020)
+#define CM_L3MAIN2_CLKSTCTRL (CORE_BASE + 0x0100)
+#define CM_L3MAIN2_DYNAMICDEP (CORE_BASE + 0x0108)
+#define CM_L3MAIN2_L3_MAIN_2_CLKCTRL (CORE_BASE + 0x0120)
+#define CM_L3MAIN2_GPMC_CLKCTRL (CORE_BASE + 0x0128)
+#define CM_L3MAIN2_OCMC_RAM_CLKCTRL (CORE_BASE + 0x0130)
+#define CM_IPU_CLKSTCTRL (CORE_BASE + 0x0200)
+#define CM_IPU_STATICDEP (CORE_BASE + 0x0204)
+#define CM_IPU_DYNAMICDEP (CORE_BASE + 0x0208)
+#define CM_IPU_IPU_CLKCTRL (CORE_BASE + 0x0220)
+#define CM_DMA_CLKSTCTRL (CORE_BASE + 0x0300)
+#define CM_DMA_STATICDEP (CORE_BASE + 0x0304)
+#define CM_DMA_DYNAMICDEP (CORE_BASE + 0x0308)
+#define CM_DMA_DMA_SYSTEM_CLKCTRL (CORE_BASE + 0x0320)
+#define CM_EMIF_CLKSTCTRL (CORE_BASE + 0x0400)
+#define CM_EMIF_DMM_CLKCTRL (CORE_BASE + 0x0420)
+#define CM_EMIF_EMIF_OCP_FW_CLKCTRL (CORE_BASE + 0x0428)
+#define CM_EMIF_EMIF1_CLKCTRL (CORE_BASE + 0x0430)
+#define CM_EMIF_EMIF2_CLKCTRL (CORE_BASE + 0x0438)
+#define CM_EMIF_EMIF_DLL_CLKCTRL (CORE_BASE + 0x0440)
+#define CM_C2C_CLKSTCTRL (CORE_BASE + 0x0500)
+#define CM_C2C_STATICDEP (CORE_BASE + 0x0504)
+#define CM_C2C_DYNAMICDEP (CORE_BASE + 0x0508)
+#define CM_C2C_C2C_CLKCTRL (CORE_BASE + 0x0520)
+#define CM_C2C_MODEM_ICR_CLKCTRL (CORE_BASE + 0x0528)
+#define CM_C2C_C2C_OCP_FW_CLKCTRL (CORE_BASE + 0x0530)
+#define CM_L4CFG_CLKSTCTRL (CORE_BASE + 0x0600)
+#define CM_L4CFG_DYNAMICDEP (CORE_BASE + 0x0608)
+#define CM_L4CFG_L4_CFG_CLKCTRL (CORE_BASE + 0x0620)
+#define CM_L4CFG_SPINLOCK_CLKCTRL (CORE_BASE + 0x0628)
+#define CM_L4CFG_MAILBOX_CLKCTRL (CORE_BASE + 0x0630)
+#define CM_L4CFG_SAR_ROM_CLKCTRL (CORE_BASE + 0x0638)
+#define CM_L4CFG_OCP2SCP2_CLKCTRL (CORE_BASE + 0x0640)
+#define CM_L3INSTR_CLKSTCTRL (CORE_BASE + 0x0700)
+#define CM_L3INSTR_L3_MAIN_3_CLKCTRL (CORE_BASE + 0x0720)
+#define CM_L3INSTR_L3_INSTR_CLKCTRL (CORE_BASE + 0x0728)
+#define CM_L3INSTR_OCP_WP_NOC_CLKCTRL (CORE_BASE + 0x0740)
+#define CM_L3INSTR_DLL_AGING_CLKCTRL (CORE_BASE + 0x0748)
+#define CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL (CORE_BASE + 0x0750)
+
+/* L4PER_CM_CORE Registers */
+#define CM_L4PER_CLKSTCTRL_REV1 0x4a009400
+#define CM_L4PER_CLKSTCTRL_REV2 0x4a009000
+#define CM_L4PER_DYNAMICDEP_OFT 0x0008
+#define CM_L4PER_TIMER10_CLKCTRL_OFT 0x0028
+#define CM_L4PER_TIMER11_CLKCTRL_OFT 0x0030
+#define CM_L4PER_TIMER2_CLKCTRL_OFT 0x0038
+#define CM_L4PER_TIMER3_CLKCTRL_OFT 0x0040
+#define CM_L4PER_TIMER4_CLKCTRL_OFT 0x0048
+#define CM_L4PER_TIMER9_CLKCTRL_OFT 0x0050
+#define CM_L4PER_ELM_CLKCTRL_OFT 0x0058
+#define CM_L4PER_GPIO2_CLKCTRL_OFT 0x0060
+#define CM_L4PER_GPIO3_CLKCTRL_OFT 0x0068
+#define CM_L4PER_GPIO4_CLKCTRL_OFT 0x0070
+#define CM_L4PER_GPIO5_CLKCTRL_OFT 0x0078
+#define CM_L4PER_GPIO6_CLKCTRL_OFT 0x0080
+#define CM_L4PER_HDQ1W_CLKCTRL_OFT 0x0088
+#define CM_L4PER_I2C1_CLKCTRL_OFT 0x00a0
+#define CM_L4PER_I2C2_CLKCTRL_OFT 0x00a8
+#define CM_L4PER_I2C3_CLKCTRL_OFT 0x00b0
+#define CM_L4PER_I2C4_CLKCTRL_OFT 0x00b8
+#define CM_L4PER_L4_PER_CLKCTRL_OFT 0x00c0
+#define CM_L4PER_MCSPI1_CLKCTRL_OFT 0x00f0
+#define CM_L4PER_MCSPI2_CLKCTRL_OFT 0x00f8
+#define CM_L4PER_MCSPI3_CLKCTRL_OFT 0x0100
+#define CM_L4PER_MCSPI4_CLKCTRL_OFT 0x0108
+#define CM_L4PER_GPIO7_CLKCTRL_OFT 0x0110
+#define CM_L4PER_GPIO8_CLKCTRL_OFT 0x0118
+#define CM_L4PER_MMC3_CLKCTRL_OFT 0x0120
+#define CM_L4PER_MMC4_CLKCTRL_OFT 0x0128
+#define CM_L4PER_SLIMBUS2_CLKCTRL_OFT 0x0138
+#define CM_L4PER_UART1_CLKCTRL_OFT 0x0140
+#define CM_L4PER_UART2_CLKCTRL_OFT 0x0148
+#define CM_L4PER_UART3_CLKCTRL_OFT 0x0150
+#define CM_L4PER_UART4_CLKCTRL_OFT 0x0158
+#define CM_L4PER_MMC5_CLKCTRL_OFT 0x0160
+#define CM_L4PER_I2C5_CLKCTRL_OFT 0x0168
+#define CM_L4PER_UART5_CLKCTRL_OFT 0x0170
+#define CM_L4PER_UART6_CLKCTRL_OFT 0x0178
+#define CM_L4SEC_CLKSTCTRL_OFT 0x0180
+#define CM_L4SEC_STATICDEP_OFT 0x0184
+#define CM_L4SEC_DYNAMICDEP_OFT 0x0188
+#define CM_L4SEC_AES1_CLKCTRL_OFT 0x01a0
+#define CM_L4SEC_AES2_CLKCTRL_OFT 0x01a8
+#define CM_L4SEC_DES3DES_CLKCTRL_OFT 0x01b0
+#define CM_L4SEC_FPKA_OFT 0x01b8
+#define CM_L4SEC_RNG_CLKCTRL_OFT 0x01c0
+#define CM_L4SEC_SHA2MD5_CLKCTRL_OFT 0x01c8
+#define CM_L4SEC_DMA_CRYPTO_CLKCTRL_OFT 0x01d8
+
+/* L3INIT_CM_CORE Registers */
+/* OMAP5 revision 1*/
+#define CM_L3INIT_CLKSTCTRL_REV1 0x4a009300
+#define CM_L3INIT_CLKSTCTRL_REV2 0x4a009600
+#define CM_L3INIT_STATICDEP_OFT 0x0004
+#define CM_L3INIT_DYNAMICDEP_OFT 0x0008
+#define CM_L3INIT_MMC1_CLKCTRL_OFT 0x0028
+#define CM_L3INIT_MMC2_CLKCTRL_OFT 0x0030
+#define CM_L3INIT_HSI_CLKCTRL_OFT 0x0038
+#define CM_L3INIT_UNIPRO2_CLKCTRL_OFT 0x0040
+#define CM_L3INIT_MPHY_UNIPRO2_CLKCTRL_OFT 0x0048
+#define CM_L3INIT_USB_HOST_HS_CLKCTRL_OFT 0x0058
+#define CM_L3INIT_USB_TLL_HS_CLKCTRL_OFT 0x0068
+#define CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFT 0x0078
+#define CM_L3INIT_SATA_CLKCTRL_OFT 0x0088
+#define CM_L3INIT_OCP2SCP1_CLKCTRL_OFT 0x00E0
+#define CM_L3INIT_OCP2SCP3_CLKCTRL_OFT 0x00E8
+#define CM_L3INIT_USB_OTG_SS_CLKCTRL_OFT 0x00F0
+
+/* CAM_CM_CORE Registers */
+#define CM_CAM_CLKSTCTRL_REV1 0x4a009000
+#define CM_CAM_CLKSTCTRL_REV2 0x4a009300
+#define CM_CAM_STATICDEP_OFT 0x0004
+#define CM_CAM_DYNAMICDEP_OFT 0x0008
+#define CM_CAM_ISS_CLKCTRL_OFT 0x0020
+#define CM_CAM_FDIF_CLKCTRL_OFT 0x0028
+#define CM_CAM_CAL_CLKCTRL_OFT 0x0030
+
+/* DSS_CM_CORE Registers */
+#define CM_DSS_CLKSTCTRL_REV1 0x4a009100
+#define CM_DSS_CLKSTCTRL_REV2 0x4a009400
+#define CM_DSS_STATICDEP_OFT 0x0004
+#define CM_DSS_DYNAMICDEP_OFT 0x0008
+#define CM_DSS_DSS_CLKCTRL_OFT 0x0020
+#define CM_DSS_BB2D_CLKCTRL_OFT 0x0030 /* For rev. 2 */
+
+/* GPU_CM_CORE Registers */
+#define CM_GPU_CLKSTCTRL_REV1 0x4a009200
+#define CM_GPU_CLKSTCTRL_REV2 0x4a009500
+#define CM_GPU_STATICDEP_OFT 0x0004
+#define CM_GPU_DYNAMICDEP_OFT 0x0008
+#define CM_GPU_GPU_CLKCTRL_OFT 0x0020
+
+#define PLL_STOP 0x1
+#define PLL_LOW_POWER_BYPASS 0x5
+#define PLL_FAST_RELOCK_BYPASS 0x6
+#define PLL_LOCK 0x7
+
+/* TPS */
+#define TPS62361_I2C_SLAVE_ADDR 0x60
+#define TPS62361_REG_ADDR_SET0 0x0
+#define TPS62361_REG_ADDR_SET1 0x1
+#define TPS62361_REG_ADDR_SET2 0x2
+#define TPS62361_REG_ADDR_SET3 0x3
+#define TPS62361_REG_ADDR_CTRL 0x4
+#define TPS62361_REG_ADDR_TEMP 0x5
+#define TPS62361_REG_ADDR_RMP_CTRL 0x6
+#define TPS62361_REG_ADDR_CHIP_ID 0x8
+#define TPS62361_REG_ADDR_CHIP_ID_2 0x9
+
+#define TPS62361_BASE_VOLT_MV 500
+#define TPS62361_VSEL0_GPIO 7
+
+/* Used to index into DPLL parameter tables */
+struct dpll_param {
+ unsigned int m;
+ unsigned int n;
+ unsigned int m2;
+ unsigned int m3;
+ unsigned int h11;
+ unsigned int h12;
+ unsigned int h13;
+ unsigned int h14;
+ unsigned int h22;
+ unsigned int h23;
+};
+
+/* DPLL_MPU Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_MPU_DPLL_PARAM_12M0_HIGH { 275, 2, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_12M0_NOM { 200, 2, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_12M0_LOW { 200, 2, 2, 0, 0, 0, 0,
0, 0, 0}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_MPU_DPLL_PARAM_16M8_HIGH { 458, 6, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_16M8_NOM { 375, 8, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_16M8_LOW { 375, 8, 2, 0, 0, 0, 0,
0, 0, 0}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_MPU_DPLL_PARAM_19M2_HIGH { 229, 3, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_19M2_NOM {1000, 20, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_19M2_LOW {1000, 20, 2, 0, 0, 0, 0,
0, 0, 0}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_MPU_DPLL_PARAM_26M0_HIGH { 296, 6, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_26M0_NOM { 400, 12, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_26M0_LOW { 400, 12, 2, 0, 0, 0, 0,
0, 0, 0}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_MPU_DPLL_PARAM_38M4_HIGH { 229, 7, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_38M4_NOM { 375, 17, 1, 0, 0, 0, 0,
0, 0, 0}
+#define OMAP5_MPU_DPLL_PARAM_38M4_LOW { 375, 17, 2, 0, 0, 0, 0,
0, 0, 0}
+
+/* DPLL_IVA Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_IVA_DPLL_PARAM_12M0_OD { 133, 2, 0, 0, 2, 2, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_12M0_NOM {1165, 11, 0, 0, 5, 6, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_12M0_LOW {1165, 11, 0, 0, 10, 12, 0,
0, 0, 0}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_IVA_DPLL_PARAM_16M8_OD { 253, 7, 0, 0, 2, 2, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_16M8_NOM { 208, 2, 0, 0, 5, 6, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_16M8_LOW { 208, 2, 0, 0, 10, 12, 0,
0, 0, 0}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_IVA_DPLL_PARAM_19M2_OD { 83, 2, 0, 0, 2, 2, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_19M2_NOM { 182, 2, 0, 0, 5, 6, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_19M2_LOW { 182, 2, 0, 0, 10, 12, 0,
0, 0, 0}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_IVA_DPLL_PARAM_26M0_OD { 143, 6, 0, 0, 2, 2, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_26M0_NOM { 224, 4, 0, 0, 5, 6, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_26M0_LOW { 224, 4, 0, 0, 10, 12, 0,
0, 0, 0}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_IVA_DPLL_PARAM_38M4_OD { 83, 5, 0, 0, 2, 2, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_38M4_NOM { 91, 2, 0, 0, 5, 6, 0,
0, 0, 0}
+#define OMAP5_IVA_DPLL_PARAM_38M4_LOW { 91, 2, 0, 0, 10, 12, 0,
0, 0, 0}
+
+/* DPLL_CORE Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_CORE_DPLL_PARAM_12M0_NOM { 266, 2, 2, 5, 8, 4, 62,
4, 5, 7}
+#define OMAP5_CORE_DPLL_PARAM_12M0_LOW { 266, 2, 4, 8, 8, 8, 62,
10, 10, 14}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_CORE_DPLL_PARAM_16M8_NOM { 443, 6, 2, 5, 8, 4, 62,
4, 5, 7}
+#define OMAP5_CORE_DPLL_PARAM_16M8_LOW { 443, 6, 4, 8, 8, 8, 62,
10, 10, 14}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_CORE_DPLL_PARAM_19M2_NOM { 277, 4, 2, 5, 8, 4, 62,
4, 5, 7}
+#define OMAP5_CORE_DPLL_PARAM_19M2_LOW { 277, 4, 4, 8, 8, 8, 62,
10, 10, 14}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_CORE_DPLL_PARAM_26M0_NOM { 368, 8, 2, 5, 8, 4, 62,
4, 5, 7}
+#define OMAP5_CORE_DPLL_PARAM_26M0_LOW { 368, 8, 4, 8, 8, 8, 62,
10, 10, 14}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_CORE_DPLL_PARAM_38M4_NOM { 277, 9, 2, 5, 8, 4, 62,
4, 5, 7}
+#define OMAP5_CORE_DPLL_PARAM_38M4_LOW { 277, 9, 4, 8, 8, 8, 62,
10, 10, 14}
+
+/* DPLL_PER Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_PER_DPLL_PARAM_12M0_NOM { 32, 0, 4, 3, 6, 4, 0,
2, 0, 0}
+#define OMAP5_PER_DPLL_PARAM_12M0_LOW { 32, 0, 4, 4, 6, 4, 0,
4, 0, 0}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_PER_DPLL_PARAM_16M8_NOM { 160, 6, 4, 3, 6, 4, 0,
2, 0, 0}
+#define OMAP5_PER_DPLL_PARAM_16M8_LOW { 160, 6, 4, 4, 6, 4, 0,
4, 0, 0}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_PER_DPLL_PARAM_19M2_NOM { 20, 0, 4, 3, 6, 4, 0,
2, 0, 0}
+#define OMAP5_PER_DPLL_PARAM_19M2_LOW { 20, 0, 4, 4, 6, 4, 0,
4, 0, 0}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_PER_DPLL_PARAM_26M0_NOM { 192, 12, 4, 3, 6, 4, 0,
2, 0, 0}
+#define OMAP5_PER_DPLL_PARAM_26M0_LOW { 192, 12, 4, 4, 6, 4, 0,
4, 0, 0}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_PER_DPLL_PARAM_38M4_NOM { 10, 0, 4, 3, 6, 4, 0,
2, 0, 0}
+#define OMAP5_PER_DPLL_PARAM_38M4_LOW { 10, 0, 4, 4, 6, 4, 0,
4, 0, 0}
+
+/* DPLL_ABE Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+#define OMAP5_ABE_DPLL_PARAM { 750, 0, 1, 1, 0, 0, 0, 0, 0, 0}
+
+/* DPLL_USB Preferred Settings m n m2 m3 h11 h12 h13
h14 h22 h23 */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_USB_DPLL_PARAM_12M0 { 400, 4, 2, 0, 0, 0, 0, 0,
0, 0}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_USB_DPLL_PARAM_16M8 { 400, 6, 2, 0, 0, 0, 0, 0,
0, 0}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_USB_DPLL_PARAM_19M2 { 400, 6, 2, 0, 0, 0, 0, 0,
0, 0}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_USB_DPLL_PARAM_26M0 { 480, 12, 2, 0, 0, 0, 0, 0,
0, 0}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_USB_DPLL_PARAM_38M4 { 480, 15, 2, 0, 0, 0, 0, 0,
0, 0}
+
+/* DPLL_UNIPRO1/UNIPRO2 Preferred Settings m n m2 m3 h11 h12
h13 h14 h22 h23 */
+/* Different for DCO clock 1500MHz and 1250MHz */
+/* SYS_CLK = 12.0MHz */
+#define OMAP5_UNIPRO_DPLL_PARAM_12M0_DCO1M50 { 520, 4, 4, 0, 0, 0,
0, 0, 0, 0}
+#define OMAP5_UNIPRO_DPLL_PARAM_12M0_DCO1M25 {1822, 14, 4, 0, 0, 0,
0, 0, 0, 0}
+/* SYS_CLK = 16.8MHz */
+#define OMAP5_UNIPRO_DPLL_PARAM_16M8_DCO1M50 { 520, 6, 4, 0, 0, 0,
0, 0, 0, 0}
+#define OMAP5_UNIPRO_DPLL_PARAM_16M8_DCO1M25 {1822, 20, 4, 0, 0, 0,
0, 0, 0, 0}
+/* SYS_CLK = 19.2MHz */
+#define OMAP5_UNIPRO_DPLL_PARAM_19M2_DCO1M50 { 520, 7, 4, 0, 0, 0,
0, 0, 0, 0}
+#define OMAP5_UNIPRO_DPLL_PARAM_19M2_DCO1M25 { 911, 11, 4, 0, 0, 0,
0, 0, 0, 0}
+/* SYS_CLK = 26.0MHz */
+#define OMAP5_UNIPRO_DPLL_PARAM_26M0_DCO1M50 { 528, 10, 4, 0, 0, 0,
0, 0, 0, 0}
+#define OMAP5_UNIPRO_DPLL_PARAM_26M0_DCO1M25 (1850, 32, 4, 0, 0, 0,
0, 0, 0, 0}
+/* SYS_CLK = 38.4MHz */
+#define OMAP5_UNIPRO_DPLL_PARAM_38M4_DCO1M50 { 520, 15, 4, 0, 0, 0,
0, 0, 0, 0}
+#define OMAP5_UNIPRO_DPLL_PARAM_38M4_DCO1M25 { 911, 23, 4, 0, 0, 0,
0, 0, 0, 0}
+
+void omap5_configure_mpu_dpll(const struct dpll_param *dpll_param);
+void omap5_configure_iva_dpll(const struct dpll_param *dpll_param);
+void omap5_configure_core_dpll_no_lock(const struct dpll_param *param);
+void omap5_configure_per_dpll(const struct dpll_param *dpll_param);
+void omap5_configure_abe_dpll(const struct dpll_param *dpll_param);
+void omap5_configure_usb_dpll(const struct dpll_param *dpll_param);
+void omap5_lock_core_dpll(void);
+void omap5_lock_core_dpll_shadow(const struct dpll_param *param);
+void omap5_enable_all_clocks(void);
+
diff --git a/arch/arm/mach-omap/include/mach/omap5-mux.h
b/arch/arm/mach-omap/include/mach/omap5-mux.h
new file mode 100644
index 0000000..808d045
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-mux.h
@@ -0,0 +1,321 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP5 work in U-Boot project by
+ * Richard Woodruff <r-woodruff2@ti.com>
+ * Aneesh V <aneesh@ti.com>
+ * Balaji Krishnamoorthy <balajitk@ti.com>
+ * (Copyright 2004-2009, Texas Instruments Incorporated)
+ */
+
+#ifndef _MUX_OMAP5_H_
+#define _MUX_OMAP5_H_
+
+#include <asm/types.h>
+
+struct pad_conf_entry {
+ u16 offset;
+ u16 val;
+};
+
+#define OFF_PD (0 << 12)
+#define OFF_PU (0 << 12)
+#define OFF_OUT_PTD (0 << 10)
+#define OFF_OUT_PTU (0 << 10)
+#define OFF_IN (0 << 10)
+#define OFF_OUT (0 << 10)
+#define OFF_EN (0 << 9)
+
+#define IEN (1 << 8)
+#define IDIS (0 << 8)
+#define PTU (3 << 3)
+#define PTD (1 << 3)
+#define EN (1 << 3)
+#define DIS (0 << 3)
+
+#define M0 0
+#define M1 1
+#define M2 2
+#define M3 3
+#define M4 4
+#define M5 5
+#define M6 6
+#define M7 7
+
+#define SAFE_MODE M7
+
+#define OFF_IN_PD 0
+#define OFF_IN_PU 0
+#define OFF_OUT_PD 0
+#define OFF_OUT_PU 0
+
+/* CTRL_MODULE_CORE_PAT Registers */
+/* Base address is 0x4a002800 */
+#define CORE_REVISION 0x0000
+#define CORE_HWINFO 0x0004
+#define CORE_SYSCONFIG 0x0010
+#define EMMC_CLK 0x0040
+#define EMMC_CMD 0x0042
+#define EMMC_DATA0 0x0044
+#define EMMC_DATA1 0x0046
+#define EMMC_DATA2 0x0048
+#define EMMC_DATA3 0x004a
+#define EMMC_DATA4 0x004c
+#define EMMC_DATA5 0x004e
+#define EMMC_DATA6 0x0050
+#define EMMC_DATA7 0x0052
+#define C2C_CLKOUT0 0x0054
+#define C2C_CLKOUT1 0x0056
+#define C2C_CLKIN0 0x0058
+#define C2C_CLKIN1 0x005a
+#define C2C_DATAIN0 0x005c
+#define C2C_DATAIN1 0x005e
+#define C2C_DATAIN2 0x0060
+#define C2C_DATAIN3 0x0062
+#define C2C_DATAIN4 0x0064
+#define C2C_DATAIN5 0x0066
+#define C2C_DATAIN6 0x0068
+#define C2C_DATAIN7 0x006a
+#define C2C_DATAOUT0 0x006c
+#define C2C_DATAOUT1 0x006e
+#define C2C_DATAOUT2 0x0070
+#define C2C_DATAOUT3 0x0072
+#define C2C_DATAOUT4 0x0074
+#define C2C_DATAOUT5 0x0076
+#define C2C_DATAOUT6 0x0078
+#define C2C_DATAOUT7 0x007a
+#define C2C_DATA8 0x007c
+#define C2C_DATA9 0x007e
+#define C2C_DATA10 0x0080
+#define C2C_DATA11 0x0082
+#define C2C_DATA12 0x0084
+#define C2C_DATA13 0x0086
+#define C2C_DATA14 0x0088
+#define C2C_DATA15 0x008a
+#define LLIA_WAKEREQOUT 0x008c
+#define LLIB_WAKEREQOUT 0x008e
+#define HSI1_ACREADY 0x0090
+#define HSI1_CAREADY 0x0092
+#define HSI1_ACWAKE 0x0094
+#define HSI1_CAWAKE 0x0096
+#define HSI1_ACFLAG 0x0098
+#define HSI1_ACDATA 0x009a
+#define HSI1_CAFLAG 0x009c
+#define HSI1_CADATA 0x009e
+#define UART1_TX 0x00a0
+#define UART1_CTS 0x00a2
+#define UART1_RX 0x00a4
+#define UART1_RTS 0x00a6
+#define HSI2_CAREADY 0x00a8
+#define HSI2_ACREADY 0x00aa
+#define HSI2_CAWAKE 0x00ac
+#define HSI2_ACWAKE 0x00ae
+#define HSI2_CAFLAG 0x00b0
+#define HSI2_CADATA 0x00b2
+#define HSI2_ACFLAG 0x00b4
+#define HSI2_ACDATA 0x00b6
+#define UART2_RTS 0x00b8
+#define UART2_CTS 0x00ba
+#define UART2_RX 0x00bc
+#define UART2_TX 0x00be
+#define USBB1_HSIC_STROBE 0x00c0
+#define USBB1_HSIC_DATA 0x00c2
+#define USBB2_HSIC_STROBE 0x00c4
+#define USBB2_HSIC_DATA 0x00c6
+#define TIMER10_PWM_EVT 0x00c8
+#define DSIPORTA_TE0 0x00ca
+#define DSIPORTA_LANE0X 0x00cc
+#define DSIPORTA_LANE0Y 0x00ce
+#define DSIPORTA_LANE1X 0x00d0
+#define DSIPORTA_LANE1Y 0x00d2
+#define DSIPORTA_LANE2X 0x00d4
+#define DSIPORTA_LANE2Y 0x00d6
+#define DSIPORTA_LANE3X 0x00d8
+#define DSIPORTA_LANE3Y 0x00da
+#define DSIPORTA_LANE4X 0x00dc
+#define DSIPORTA_LANE4Y 0x00de
+#define DSIPORTC_LANE0X 0x00e0
+#define DSIPORTC_LANE0Y 0x00e2
+#define DSIPORTC_LANE1X 0x00e4
+#define DSIPORTC_LANE1Y 0x00e6
+#define DSIPORTC_LANE2X 0x00e8
+#define DSIPORTC_LANE2Y 0x00ea
+#define DSIPORTC_LANE3X 0x00ec
+#define DSIPORTC_LANE3Y 0x00ee
+#define DSIPORTC_LANE4X 0x00f0
+#define DSIPORTC_LANE4Y 0x00f2
+#define DSIPORTC_TE0 0x00f4
+#define TIMER9_PWM_EVT 0x00f6
+#define I2C4_SCL 0x00f8
+#define I2C4_SDA 0x00fa
+#define MCSPI2_CLK 0x00fc
+#define MCSPI2_SIMO 0x00fe
+#define MCSPI2_SOMI 0x0100
+#define MCSPI2_CS0 0x0102
+#define RFBI_DATA15 0x0104
+#define RFBI_DATA14 0x0106
+#define RFBI_DATA13 0x0108
+#define RFBI_DATA12 0x010a
+#define RFBI_DATA11 0x010c
+#define RFBI_DATA10 0x010e
+#define RFBI_DATA9 0x0110
+#define RFBI_DATA8 0x0112
+#define RFBI_DATA7 0x0114
+#define RFBI_DATA6 0x0116
+#define RFBI_DATA5 0x0118
+#define RFBI_DATA4 0x011a
+#define RFBI_DATA3 0x011c
+#define RFBI_DATA2 0x011e
+#define RFBI_DATA1 0x0120
+#define RFBI_DATA0 0x0122
+#define RFBI_WE 0x0124
+#define RFBI_CS0 0x0126
+#define RFBI_A0 0x0128
+#define RFBI_RE 0x012a
+#define RFBI_HSYNC0 0x012c
+#define RFBI_TE_VSYNC0 0x012e
+#define GPIO6_182 0x0130
+#define GPIO6_183 0x0132
+#define GPIO6_184 0x0134
+#define GPIO6_185 0x0136
+#define GPIO6_186 0x0138
+#define GPIO6_187 0x013a
+#define HDMI_CEC 0x013c
+#define HDMI_HPD 0x013e
+#define HDMI_DDC_SCL 0x0140
+#define HDMI_DDC_SDA 0x0142
+#define CSIPORTC_LANE0X 0x0144
+#define CSIPORTC_LANE0Y 0x0146
+#define CSIPORTC_LANE1X 0x0148
+#define CSIPORTC_LANE1Y 0x014a
+#define CSIPORTB_LANE0X 0x014c
+#define CSIPORTB_LANE0Y 0x014e
+#define CSIPORTB_LANE1X 0x0150
+#define CSIPORTB_LANE1Y 0x0152
+#define CSIPORTB_LANE2X 0x0154
+#define CSIPORTB_LANE2Y 0x0156
+#define CSIPORTA_LANE0X 0x0158
+#define CSIPORTA_LANE0Y 0x015a
+#define CSIPORTA_LANE1X 0x015c
+#define CSIPORTA_LANE1Y 0x015e
+#define CSIPORTA_LANE2X 0x0160
+#define CSIPORTA_LANE2Y 0x0162
+#define CSIPORTA_LANE3X 0x0164
+#define CSIPORTA_LANE3Y 0x0166
+#define CSIPORTA_LANE4X 0x0168
+#define CSIPORTA_LANE4Y 0x016a
+#define CAM_SHUTTER 0x016c
+#define CAM_STROBE 0x016e
+#define CAM_GLOBALRESET 0x0170
+#define TIMER11_PWM_EVT 0x0172
+#define TIMER5_PWM_EVT 0x0174
+#define TIMER6_PWM_EVT 0x0176
+#define TIMER8_PWM_EVT 0x0178
+#define I2C3_SCL 0x017a
+#define I2C3_SDA 0x017c
+#define GPIO8_233 0x017e
+#define GPIO8_234 0x0180
+#define ABE_CLKS 0x0182
+#define ABEDMIC_DIN1 0x0184
+#define ABEDMIC_DIN2 0x0186
+#define ABEDMIC_DIN3 0x0188
+#define ABEDMIC_CLK1 0x018a
+#define ABEDMIC_CLK2 0x018c
+#define ABEDMIC_CLK3 0x018e
+#define ABESLIMBUS1_CLOCK 0x0190
+#define ABESLIMBUS1_DATA 0x0192
+#define ABEMCBSP2_DR 0x0194
+#define ABEMCBSP2_DX 0x0196
+#define ABEMCBSP2_FSX 0x0198
+#define ABEMCBSP2_CLKX 0x019a
+#define ABEMCPDM_UL_DATA 0x019c
+#define ABEMCPDM_DL_DATA 0x019e
+#define ABEMCPDM_FRAME 0x01a0
+#define ABEMCPDM_LB_CLK 0x01a2
+#define WLSDIO_CLK 0x01a4
+#define WLSDIO_CMD 0x01a6
+#define WLSDIO_DATA0 0x01a8
+#define WLSDIO_DATA1 0x01aa
+#define WLSDIO_DATA2 0x01ac
+#define WLSDIO_DATA3 0x01ae
+#define UART5_RX 0x01b0
+#define UART5_TX 0x01b2
+#define UART5_CTS 0x01b4
+#define UART5_RTS 0x01b6
+#define I2C2_SCL 0x01b8
+#define I2C2_SDA 0x01ba
+#define MCSPI1_CLK 0x01bc
+#define MCSPI1_SOMI 0x01be
+#define MCSPI1_SIMO 0x01c0
+#define MCSPI1_CS0 0x01c2
+#define MCSPI1_CS1 0x01c4
+#define I2C5_SCL 0x01c6
+#define I2C5_SDA 0x01c8
+#define PERSLIMBUS2_CLOCK 0x01ca /* GPIO5_145 in rev. 2 */
+#define PERSLIMBUS2_DATA 0x01cc /* GPIO5_146 in rev. 2 */
+#define UART6_TX 0x01ce
+#define UART6_RX 0x01d0
+#define UART6_CTS 0x01d2
+#define UART6_RTS 0x01d4
+#define UART3_CTS_RCTX 0x01d6
+#define UART3_RTS_IRSD 0x01d8
+#define UART3_TX_IRTX 0x01da
+#define UART3_RX_IRRX 0x01dc
+#define USBB3_HSIC_STROBE 0x01de
+#define USBB3_HSIC_DATA 0x01e0
+#define SDCARD_CLK 0x01e2
+#define SDCARD_CMD 0x01e4
+#define SDCARD_DATA2 0x01e6
+#define SDCARD_DATA3 0x01e8
+#define SDCARD_DATA0 0x01ea
+#define SDCARD_DATA1 0x01ec
+#define USBD0_HS_DP 0x01ee
+#define USBD0_HS_DM 0x01f0
+#define I2C1_PMIC_SCL 0x01f2
+#define I2C1_PMIC_SDA 0x01f4
+#define USBD0_SS_RX 0x01f6
+
+/* CTRL_MODULE_WKUP_PAD Registers */
+/* Base address is 0x4ae0c800 */
+#define WKUP_REVISION 0x0000
+#define WKUP_HWINFO 0x0004
+#define WKUP_SYSCONFIG 0x0010
+#define LLIA_WAKEREQIN 0x0040
+#define LLIB_WAKEREQIN 0x0042
+#define DRM_EMU0 0x0044
+#define DRM_EMU1 0x0046
+#define JTAG_NTRST 0x0048
+#define JTAG_TCK 0x004a
+#define JTAG_RTCK 0x004c
+#define JTAG_TMSC 0x004e
+#define JTAG_TDI 0x0050
+#define JTAG_TDO 0x0052
+#define SYS_32K 0x0054
+#define FREF_CLK_IOREQ 0x0056
+#define FREF_CLK0_OUT 0x0058
+#define FREF_CLK1_OUT 0x005a
+#define FREF_CLK2_OUT 0x005c
+#define FREF_CLK2_REQ 0x005e
+#define FREF_CLK1_REQ 0x0060
+#define SYS_NRESPWRON 0x0062
+#define SYS_NRESWARM 0x0064
+#define SYS_PWR_REQ 0x0066
+#define SYS_NIRQ1 0x0068
+#define SYS_NIRQ2 0x006a
+#define SR_PMIC_SCL 0x006c
+#define SR_PMIC_SDA 0x006e
+#define SYS_BOOT0 0x0070
+#define SYS_BOOT1 0x0072
+#define SYS_BOOT2 0x0074
+#define SYS_BOOT3 0x0076
+#define SYS_BOOT4 0x0078
+#define SYS_BOOT5 0x007a
+
+void omap5_do_set_mux(u32 base, struct pad_conf_entry const *array, int
size);
+
+#endif /* _MUX_OMAP5_H_ */
diff --git a/arch/arm/mach-omap/include/mach/omap5-silicon.h
b/arch/arm/mach-omap/include/mach/omap5-silicon.h
new file mode 100644
index 0000000..a0c7039
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-silicon.h
@@ -0,0 +1,244 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP4 work by
+ * Aneesh V <aneesh@ti.com>
+ */
+
+#ifndef _OMAP5_H_
+#define _OMAP5_H_
+
+#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
+#include <asm/types.h>
+#endif /* !(__KERNEL_STRICT_NAMES || __ASSEMBLY__) */
+
+/* L4 Peripherals - L4 Wakeup and L4 Core now */
+#define OMAP54XX_L4_CFG_BASE 0x4A000000
+#define OMAP54XX_L4_WKUP_BASE 0x4Ae00000
+#define OMAP54XX_L4_PER_BASE 0x48000000
+
+/* EMIF and DMM registers */
+#define OMAP54XX_EMIF1_BASE 0x4c000000
+#define OMAP54XX_EMIF2_BASE 0x4d000000
+
+#define OMAP54XX_DRAM_ADDR_SPACE_START 0x80000000
+#define OMAP54XX_DRAM_ADDR_SPACE_END 0xff000000
+
+/* CONTROL */
+#define OMAP54XX_CTRL_BASE (OMAP54XX_L4_CFG_BASE + 0x2000)
+#define OMAP54XX_CONTROL_PADCONF_CORE (OMAP54XX_CTRL_BASE + 0x0800)
+#define OMAP54XX_CONTROL_PADCONF_WKUP (OMAP54XX_L4_WKUP_BASE + 0xc800)
+
+/* PRM */
+#define OMAP54XX_PRM_VC_VAL_BYPASS (OMAP54XX_L4_WKUP_BASE + 0x7ba0)
+#define OMAP54XX_PRM_VC_CFG_I2C_MODE (OMAP54XX_L4_WKUP_BASE + 0x7bb4)
+#define OMAP54XX_PRM_VC_CFG_I2C_CLK (OMAP54XX_L4_WKUP_BASE + 0x7bb8)
+#define OMAP54XX_PRM_VC_VAL_BYPASS_VALID_BIT 0x1000000
+#define OMAP54XX_PRM_VC_VAL_BYPASS_SLAVEADDR_SHIFT 0
+#define OMAP54XX_PRM_VC_VAL_BYPASS_SLAVEADDR_MASK 0x7F
+#define OMAP54XX_PRM_VC_VAL_BYPASS_REGADDR_SHIFT 8
+#define OMAP54XX_PRM_VC_VAL_BYPASS_REGADDR_MASK 0xFF
+#define OMAP54XX_PRM_VC_VAL_BYPASS_DATA_SHIFT 16
+#define OMAP54XX_PRM_VC_VAL_BYPASS_DATA_MASK 0xFF
+
+#define VDD_MPU 1150
+#define VDD_MM 1150
+#define VDD_CORE 1150
+
+#define SMPS_BASE_VOLT_UV 500000
+#define SMPS_I2C_SLAVE_ADDR 0x12
+#define SMPS_REG_ADDR_12_MPU 0x23
+#define SMPS_REG_ADDR_45_IVA 0x2B
+#define SMPS_REG_ADDR_8_CORE 0x37
+
+/* IRQ */
+#define OMAP54XX_PRM_IRQSTATUS_MPU (OMAP54XX_L4_WKUP_BASE + 0x6010)
+
+/* UART */
+#define OMAP54XX_UART1_BASE (OMAP54XX_L4_PER_BASE + 0x6a000)
+#define OMAP54XX_UART2_BASE (OMAP54XX_L4_PER_BASE + 0x6c000)
+#define OMAP54XX_UART3_BASE (OMAP54XX_L4_PER_BASE + 0x20000)
+
+/* I2C */
+#define OMAP54XX_I2C1_BASE (OMAP54XX_L4_PER_BASE + 0x070000)
+#define OMAP54XX_I2C2_BASE (OMAP54XX_L4_PER_BASE + 0x072000)
+#define OMAP54XX_I2C3_BASE (OMAP54XX_L4_PER_BASE + 0x060000)
+
+/* General Purpose Timers */
+#define OMAP54XX_GPT1_BASE (OMAP54XX_L4_WKUP_BASE + 0x18000)
+#define OMAP54XX_GPT2_BASE (OMAP54XX_L4_PER_BASE + 0x32000)
+#define OMAP54XX_GPT3_BASE (OMAP54XX_L4_PER_BASE + 0x34000)
+
+/* Watchdog Timer2 - MPU watchdog */
+#define OMAP54XX_WDT2_BASE (OMAP54XX_L4_WKUP_BASE + 0x14000)
+
+#define OMAP54XX_SCRM_BASE (OMAP54XX_L4_WKUP_BASE + 0xa000)
+#define OMAP54XX_SCRM_AUXCLK1 (OMAP54XX_SCRM_BASE + 0x314)
+#define OMAP54XX_SCRM_AUXCLK3 (OMAP54XX_SCRM_BASE + 0x31c)
+
+/* 32KTIMER */
+#define OMAP54XX_32KTIMER_BASE (OMAP54XX_L4_WKUP_BASE + 0x4000)
+
+/* MMC */
+#define OMAP54XX_MMC1_BASE (OMAP54XX_L4_PER_BASE + 0x09C000)
+#define OMAP54XX_MMC2_BASE (OMAP54XX_L4_PER_BASE + 0x0B4000)
+#define OMAP54XX_MMC3_BASE (OMAP54XX_L4_PER_BASE + 0x0ad000)
+#define OMAP54XX_MMC4_BASE (OMAP54XX_L4_PER_BASE + 0x0d1000)
+#define OMAP54XX_MMC5_BASE (OMAP54XX_L4_PER_BASE + 0x0d5000)
+
+/* GPIO */
+#define OMAP54XX_GPIO1_BASE (OMAP54XX_L4_WKUP_BASE + 0x10000)
+#define OMAP54XX_GPIO2_BASE (OMAP54XX_L4_PER_BASE + 0x55000)
+#define OMAP54XX_GPIO3_BASE (OMAP54XX_L4_PER_BASE + 0x57000)
+#define OMAP54XX_GPIO4_BASE (OMAP54XX_L4_PER_BASE + 0x59000)
+#define OMAP54XX_GPIO5_BASE (OMAP54XX_L4_PER_BASE + 0x5b000)
+#define OMAP54XX_GPIO6_BASE (OMAP54XX_L4_PER_BASE + 0x5d000)
+
+/* GPMC */
+#define OMAP54XX_GPMC_BASE 0x50000000
+
+/* DMM */
+#define OMAP54XX_DMM_BASE 0x4e000000
+
+/* Memory Adapter */
+#define OMAP54XX_MA_BASE 0x482AF000
+
+/*
+ * Hardware Register Details
+ */
+
+/* Watchdog Timer */
+#define WD_UNLOCK1 0xAAAA
+#define WD_UNLOCK2 0x5555
+
+/* GP Timer */
+#define TCLR_ST (0x1 << 0)
+#define TCLR_AR (0x1 << 1)
+#define TCLR_PRE (0x1 << 5)
+
+/* PRM */
+#define PRM_BASE 0x4AE06000
+#define PRM_DEVICE_BASE (PRM_BASE + 0x1B00)
+
+#define PRM_RSTCTRL PRM_DEVICE_BASE
+#define PRM_RSTCTRL_RESET 0x01
+
+#ifndef __ASSEMBLY__
+
+struct s32ktimer {
+ unsigned char res[0x10];
+ unsigned int s32k_cr;
+};
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * Non-secure SRAM Addresses
+ * Non-secure RAM starts at 0x40300000 for GP devices. But we keep
SRAM_BASE
+ * at 0x40304000(EMU base) so that our code works for both EMU and GP
+ */
+#define NON_SECURE_SRAM_START 0x40304000
+#define NON_SECURE_SRAM_END 0x4030E000 /* Not inclusive */
+/* base address for indirect vectors (internal boot mode) */
+#define SRAM_ROM_VECT_BASE 0x4030D000
+
+/* OMAP5 silicon revisions */
+#define OMAP543X_SILICON_ID_INVALID 0
+#define OMAP5430_ES1_0 0x54300100
+#define OMAP5430_ES2_0 0x54300200
+#define OMAP5432_ES1_0 0x54320100
+#define OMAP5432_ES2_0 0x54320200
+
+struct omap5_ddr_regs {
+ u32 freq;
+ u32 sdram_config_init;
+ u32 sdram_config;
+ u32 ref_ctrl;
+ u32 sdram_tim1;
+ u32 sdram_tim2;
+ u32 sdram_tim3;
+ u32 read_idle_ctrl;
+ u32 zq_config;
+ u32 temp_alert_config;
+ u32 emif_ddr_phy_ctlr_1_init;
+ u32 emif_ddr_phy_ctlr_1;
+ u32 emif_ddr_phy_ctlr_2;
+ u32 emif_ddr_ext_phy_ctrl_1_init;
+ u32 emif_ddr_ext_phy_ctrl_1;
+ u32 emif_ddr_ext_phy_ctrl_2_init;
+ u32 emif_ddr_ext_phy_ctrl_2;
+ u32 emif_ddr_ext_phy_ctrl_3_init;
+ u32 emif_ddr_ext_phy_ctrl_3;
+ u32 emif_ddr_ext_phy_ctrl_4_init;
+ u32 emif_ddr_ext_phy_ctrl_4;
+ u32 emif_ddr_ext_phy_ctrl_5_init;
+ u32 emif_ddr_ext_phy_ctrl_5;
+ u32 emif_ddr_ext_phy_ctrl_6_init;
+ u32 emif_ddr_ext_phy_ctrl_6;
+ u32 emif_ddr_ext_phy_ctrl_7_init;
+ u32 emif_ddr_ext_phy_ctrl_7;
+ u32 emif_ddr_ext_phy_ctrl_8_init;
+ u32 emif_ddr_ext_phy_ctrl_8;
+ u32 emif_ddr_ext_phy_ctrl_9_init;
+ u32 emif_ddr_ext_phy_ctrl_9;
+ u32 emif_ddr_ext_phy_ctrl_10_init;
+ u32 emif_ddr_ext_phy_ctrl_10;
+ u32 emif_ddr_ext_phy_ctrl_11_init;
+ u32 emif_ddr_ext_phy_ctrl_11;
+ u32 emif_ddr_ext_phy_ctrl_12_init;
+ u32 emif_ddr_ext_phy_ctrl_12;
+ u32 emif_ddr_ext_phy_ctrl_13_init;
+ u32 emif_ddr_ext_phy_ctrl_13;
+ u32 emif_ddr_ext_phy_ctrl_14_init;
+ u32 emif_ddr_ext_phy_ctrl_14;
+ u32 emif_ddr_ext_phy_ctrl_15_init;
+ u32 emif_ddr_ext_phy_ctrl_15;
+ u32 emif_ddr_ext_phy_ctrl_16_init;
+ u32 emif_ddr_ext_phy_ctrl_16;
+ u32 emif_ddr_ext_phy_ctrl_17_init;
+ u32 emif_ddr_ext_phy_ctrl_17;
+ u32 emif_ddr_ext_phy_ctrl_18_init;
+ u32 emif_ddr_ext_phy_ctrl_18;
+ u32 emif_ddr_ext_phy_ctrl_19_init;
+ u32 emif_ddr_ext_phy_ctrl_19;
+ u32 emif_ddr_ext_phy_ctrl_20_init;
+ u32 emif_ddr_ext_phy_ctrl_20;
+ u32 emif_ddr_ext_phy_ctrl_21_init;
+ u32 emif_ddr_ext_phy_ctrl_21;
+ u32 emif_ddr_ext_phy_ctrl_22_init;
+ u32 emif_ddr_ext_phy_ctrl_22;
+ u32 emif_ddr_ext_phy_ctrl_23_init;
+ u32 emif_ddr_ext_phy_ctrl_23;
+ u32 emif_ddr_ext_phy_ctrl_24_init;
+ u32 emif_ddr_ext_phy_ctrl_24;
+ u32 emif_ddr_ext_phy_ctrl_25_init;
+ u32 emif_ddr_ext_phy_ctrl_25;
+ u32 emif_ddr_ext_phy_ctrl_26_init;
+ u32 emif_ddr_ext_phy_ctrl_26;
+ u32 emif_ddr_ext_phy_ctrl_27_init;
+ u32 emif_ddr_ext_phy_ctrl_27;
+ u32 emif_ddr_ext_phy_ctrl_28_init;
+ u32 emif_ddr_ext_phy_ctrl_28;
+ u32 emif_ddr_ext_phy_ctrl_29_init;
+ u32 emif_ddr_ext_phy_ctrl_29;
+ u32 emif_ddr_ext_phy_ctrl_30_init;
+ u32 emif_ddr_ext_phy_ctrl_30;
+ u32 emif_rd_wr_lvl_rmp_win;
+ u32 emif_rd_wr_lvl_rmp_ctl;
+ u32 emif_rd_wr_lvl_ctl;
+ u32 emif_rd_wr_exec_thresh;
+};
+
+struct dpll_param;
+
+void omap5_ddr_init(const struct omap5_ddr_regs *ddr_regs, const struct
dpll_param *);
+void omap5_power_i2c_send(u32);
+unsigned int omap5_revision(void);
+void omap5_scale_vcores(void);
+
+#endif /* _OMAP5_H_ */
diff --git a/arch/arm/mach-omap/omap5_clock.c
b/arch/arm/mach-omap/omap5_clock.c
new file mode 100644
index 0000000..9399e12
--- /dev/null
+++ b/arch/arm/mach-omap/omap5_clock.c
@@ -0,0 +1,385 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP4 work
+ */
+
+#include <common.h>
+#include <io.h>
+#include <mach/syslib.h>
+#include <mach/clocks.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap5-clock.h>
+
+#define LDELAY 12000000
+
+#define PM_DSS_PWRSTCTRL 0x4AE07400
+
+void omap5_configure_mpu_dpll(const struct dpll_param *dpll_param)
+{
+ /* Unlock the MPU dpll */
+ sr32(CM_CLKMODE_DPLL_MPU, 0, 3, PLL_FAST_RELOCK_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_MPU, LDELAY);
+
+ /* Disable DPLL auto control */
+ sr32(CM_AUTOIDLE_DPLL_MPU, 0, 3, 0x0);
+
+ /* Set M,N,M2 values */
+ sr32(CM_CLKSEL_DPLL_MPU, 8, 11, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_MPU, 0, 7, dpll_param->n);
+ sr32(CM_DIV_M2_DPLL_MPU, 0, 5, dpll_param->m2);
+
+ /* Lock the MPU dpll */
+ sr32(CM_CLKMODE_DPLL_MPU, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_MPU, LDELAY);
+
+ return;
+}
+
+void omap5_configure_iva_dpll(const struct dpll_param *dpll_param)
+{
+ /* Unlock the IVA dpll */
+ sr32(CM_CLKMODE_DPLL_IVA, 0, 3, PLL_FAST_RELOCK_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_IVA, LDELAY);
+
+ /* CM_BYPCLK_DPLL_IVA = CORE_X2_CLK/2 */
+ sr32(CM_BYPCLK_DPLL_IVA, 0, 2, 0x1);
+
+ /* Disable DPLL auto control */
+ sr32(CM_AUTOIDLE_DPLL_IVA, 0, 3, 0x0);
+
+ /* Set M,N,H11,H12 */
+ sr32(CM_CLKSEL_DPLL_IVA, 8, 11, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_IVA, 0, 7, dpll_param->n);
+ sr32(CM_DIV_H11_DPLL_IVA, 0, 5, dpll_param->h11);
+ sr32(CM_DIV_H12_DPLL_IVA, 0, 5, dpll_param->h12);
+
+ /* Lock the IVA dpll */
+ sr32(CM_CLKMODE_DPLL_IVA, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_IVA, LDELAY);
+
+ return;
+}
+
+void omap5_configure_core_dpll_no_lock(const struct dpll_param *dpll_param)
+{
+ /* CORE_CLK=CORE_X2_CLK/2, L3_CLK=CORE_CLK/2, L4_CLK=L3_CLK/2 */
+ sr32(CM_CLKSEL_CORE, 0, 32, 0x110);
+
+ /* Unlock the CORE dpll */
+ sr32(CM_CLKMODE_DPLL_CORE, 0, 3, PLL_FAST_RELOCK_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_CORE, LDELAY);
+
+ /* Disable DPLL auto control */
+ sr32(CM_AUTOIDLE_DPLL_CORE, 0, 3, 0x0);
+
+ /* Set M,N,M2, M3, H11, H12, H13, H14, H22, H23 */
+ sr32(CM_CLKSEL_DPLL_CORE, 8, 11, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_CORE, 0, 7, dpll_param->n);
+ sr32(CM_DIV_M2_DPLL_CORE, 0, 5, dpll_param->m2);
+ sr32(CM_DIV_M3_DPLL_CORE, 0, 5, dpll_param->m3);
+ sr32(CM_DIV_H11_DPLL_CORE, 0, 5, dpll_param->h11);
+ sr32(CM_DIV_H12_DPLL_CORE, 0, 5, dpll_param->h12);
+ sr32(CM_DIV_H13_DPLL_CORE, 0, 5, dpll_param->h13);
+ sr32(CM_DIV_H14_DPLL_CORE, 0, 5, dpll_param->h14);
+ sr32(CM_DIV_H22_DPLL_CORE, 0, 5, dpll_param->h22);
+ sr32(CM_DIV_H23_DPLL_CORE, 0, 5, dpll_param->h23);
+
+ return;
+}
+
+void omap5_configure_per_dpll(const struct dpll_param *dpll_param)
+{
+ /* Unlock the PER dpll */
+ sr32(CM_CLKMODE_DPLL_PER, 0, 3, PLL_FAST_RELOCK_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_PER, LDELAY);
+
+ /* Disable DPLL auto control */
+ sr32(CM_AUTOIDLE_DPLL_PER, 0, 3, 0x0);
+
+ /* Set M,N,M2, M3, H11, H12, H14 */
+ sr32(CM_CLKSEL_DPLL_PER, 8, 11, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_PER, 0, 7, dpll_param->n);
+ sr32(CM_DIV_M2_DPLL_PER, 0, 5, dpll_param->m2);
+ sr32(CM_DIV_M3_DPLL_PER, 0, 5, dpll_param->m3);
+ sr32(CM_DIV_H11_DPLL_PER, 0, 5, dpll_param->h11);
+ sr32(CM_DIV_H12_DPLL_PER, 0, 5, dpll_param->h12);
+ sr32(CM_DIV_H14_DPLL_PER, 0, 5, dpll_param->h14);
+
+ /* Lock the per dpll */
+ sr32(CM_CLKMODE_DPLL_PER, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_PER, LDELAY);
+
+ return;
+}
+
+void omap5_configure_abe_dpll(const struct dpll_param *dpll_param)
+{
+ /* Some options to achieve 196.608MHz from 32768 Hz */
+ sr32(CM_CLKMODE_DPLL_ABE, 8, 1, 1); /* DPLL_DRIFTGUARD_EN_MASK */
+ sr32(CM_CLKMODE_DPLL_ABE, 9, 1, 1); /* DPLL_RELOCK_RAMP_EN_MASK */
+ sr32(CM_CLKMODE_DPLL_ABE, 10, 1, 1); /* DPLL_LPMODE_EN_MASK */
+ sr32(CM_CLKMODE_DPLL_ABE, 11, 1, 1); /* DPLL_REGM4XEN_MASK */
+
+ /* Spend 4 REFCLK cycles at each stage */
+ sr32(CM_CLKMODE_DPLL_ABE, 5, 3, 7);
+
+ /* Select SYS_32K as ref clk for ABE dpll */
+ sr32(CM_CLKSEL_ABE_PLL_REF, 0, 1, 1);
+
+ /* Unlock the ABE dpll */
+ sr32(CM_CLKMODE_DPLL_ABE, 0, 3, PLL_LOW_POWER_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_ABE, LDELAY);
+
+ /* Disable DPLL auto control */
+ sr32(CM_AUTOIDLE_DPLL_ABE, 0, 3, 0x0);
+
+ /* Set M,N,M2, M3 */
+ sr32(CM_CLKSEL_DPLL_ABE, 8, 11, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_ABE, 0, 7, dpll_param->n);
+ sr32(CM_DIV_M2_DPLL_ABE, 0, 5, dpll_param->m2);
+ sr32(CM_DIV_M3_DPLL_ABE, 0, 5, dpll_param->m3);
+
+ /* Lock the abe dpll */
+ sr32(CM_CLKMODE_DPLL_ABE, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_ABE, LDELAY);
+
+ return;
+}
+
+void omap5_configure_usb_dpll(const struct dpll_param *dpll_param)
+{
+ /* Select the 60Mhz clock 480/8 = 60*/
+ sr32(CM_CLKSEL_USB_60MHZ, 0, 32, 0x1);
+
+ /* Unlock the USB dpll */
+ sr32(CM_CLKMODE_DPLL_USB, 0, 3, PLL_FAST_RELOCK_BYPASS);
+ wait_on_value((1 << 0), 0, CM_IDLEST_DPLL_USB, LDELAY);
+
+ /* Disable auto control */
+ sr32(CM_AUTOIDLE_DPLL_USB, 0, 3, 0x0);
+
+ /* Set M,N,M2 */
+ sr32(CM_CLKSEL_DPLL_USB, 8, 12, dpll_param->m);
+ sr32(CM_CLKSEL_DPLL_USB, 0, 8, dpll_param->n);
+ sr32(CM_DIV_M2_DPLL_USB, 0, 7, dpll_param->m2);
+ sr32(CM_DIV_M2_DPLL_USB, 9, 1, 0x1);
+
+ /* Lock the usb dpll */
+ sr32(CM_CLKMODE_DPLL_USB, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_USB, LDELAY);
+
+ return;
+}
+
+void omap5_lock_core_dpll(void)
+{
+ /* Lock the core dpll */
+ sr32(CM_CLKMODE_DPLL_CORE, 0, 3, PLL_LOCK);
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_CORE, LDELAY);
+
+ return;
+}
+
+void omap5_lock_core_dpll_shadow(const struct dpll_param *param)
+{
+ /* Lock the core dpll using freq update method */
+ *(volatile int*)CM_CLKMODE_DPLL_CORE = PLL_LOCK;
+
+ /* CM_SHADOW_FREQ_CONFIG1: DLL_OVERRIDE = 1(hack), DLL_RESET = 1,
+ * DPLL_CORE_M2_DIV = 1, DPLL_CORE_DPLL_EN = 0x7, FREQ_UPDATE = 1
+ */
+ *(volatile int*)CM_SHADOW_FREQ_CONFIG1 = 0x70D | (param->m2 << 11);
+
+ /* Wait for Freq_Update to get cleared: CM_SHADOW_FREQ_CONFIG1 */
+ while(((*(volatile int*)CM_SHADOW_FREQ_CONFIG1) & 0x1) == 0x1);
+
+ /* Wait for DPLL to Lock : CM_IDLEST_DPLL_CORE */
+ wait_on_value((1 << 0), 1, CM_IDLEST_DPLL_CORE, LDELAY);
+}
+
+void omap5_enable_all_clocks(void)
+{
+ unsigned int rev = omap5_revision();
+ u32 wkup_base = CM_WKUPAON_CLKCTRL_REV1;
+ u32 l4per_base = CM_L4PER_CLKSTCTRL_REV1;
+ u32 l3init_base = CM_L3INIT_CLKSTCTRL_REV1;
+ u32 cam_base = CM_CAM_CLKSTCTRL_REV1;
+ u32 dss_base = CM_DSS_CLKSTCTRL_REV1;
+ u32 gpu_base = CM_GPU_CLKSTCTRL_REV1;
+
+ if (rev == OMAP5430_ES2_0 || rev == OMAP5432_ES2_0) {
+ wkup_base = CM_WKUPAON_CLKCTRL_REV2;
+ l4per_base = CM_L4PER_CLKSTCTRL_REV2;
+ l3init_base = CM_L3INIT_CLKSTCTRL_REV2;
+ cam_base = CM_CAM_CLKSTCTRL_REV2;
+ dss_base = CM_DSS_CLKSTCTRL_REV2;
+ gpu_base = CM_GPU_CLKSTCTRL_REV2;
+ }
+
+ /* Enable DSP clocks */
+ sr32(CM_DSP_DSP_CLKCTRL, 0, 32, 0x1);
+ sr32(CM_DSP_CLKSTCTRL, 0, 32, 0x2);
+
+ wait_on_value((1 << 8), 0, CM_DSP_CLKSTCTRL, LDELAY);
+
+ /* ABE clocks */
+ sr32(CM_ABE_CLKSTCTRL, 0, 32, 0x3);
+ sr32(CM_ABE_AESS_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_MCPDM_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_DMIC_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_MCASP_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_MCBSP1_CLKCTRL, 0, 32, 0x08000002);
+ sr32(CM_ABE_MCBSP2_CLKCTRL, 0, 32, 0x08000002);
+ sr32(CM_ABE_MCBSP3_CLKCTRL, 0, 32, 0x08000002);
+ sr32(CM_ABE_SLIMBUS1_CLKCTRL, 0, 32, 0x0f02);
+ sr32(CM_ABE_TIMER5_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_TIMER6_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_TIMER7_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_TIMER8_CLKCTRL, 0, 32, 0x2);
+ sr32(CM_ABE_WD_TIMER3_CLKCTRL, 0, 32, 0x2);
+ /* Disable sleep transitions */
+ sr32(CM_ABE_CLKSTCTRL, 0, 32, 0x0);
+
+ /* L4PER clocks */
+ sr32(l4per_base, 0, 32, 0x2);
+ sr32(l4per_base + CM_L4PER_TIMER10_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER10_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_TIMER11_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER11_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_TIMER2_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER2_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_TIMER3_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_TIMER4_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER4_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_TIMER9_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_TIMER9_CLKCTRL_OFT, LDELAY);
+
+ /* GPIO clocks */
+ sr32(l4per_base + CM_L4PER_GPIO2_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_GPIO2_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_GPIO3_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_GPIO3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_GPIO4_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_GPIO4_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_GPIO5_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_GPIO5_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_GPIO6_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_GPIO6_CLKCTRL_OFT, LDELAY);
+
+ sr32(l4per_base + CM_L4PER_HDQ1W_CLKCTRL_OFT, 0, 32, 0x1);
+
+ /* I2C clocks */
+ sr32(l4per_base + CM_L4PER_I2C1_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_I2C1_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_I2C2_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_I2C2_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_I2C3_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_I2C3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_I2C4_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_I2C4_CLKCTRL_OFT, LDELAY);
+
+ /* MCSPI clocks */
+ sr32(l4per_base + CM_L4PER_MCSPI1_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MCSPI1_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_MCSPI2_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MCSPI2_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_MCSPI3_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MCSPI3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_MCSPI4_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MCSPI4_CLKCTRL_OFT, LDELAY);
+
+ /* MMC3-5 clocks */
+ sr32(l4per_base + CM_L4PER_MMC3_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MMC3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_MMC4_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MMC4_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_MMC5_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_MMC5_CLKCTRL_OFT, LDELAY);
+
+ /* UART clocks */
+ sr32(l4per_base + CM_L4PER_UART1_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_UART1_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_UART2_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_UART2_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_UART3_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_UART3_CLKCTRL_OFT, LDELAY);
+ sr32(l4per_base + CM_L4PER_UART4_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, l4per_base +
CM_L4PER_UART4_CLKCTRL_OFT, LDELAY);
+
+ /* MMC1-2 clocks */
+ sr32(l3init_base + CM_L3INIT_MMC1_CLKCTRL_OFT, 0, 2, 0x2);
+ sr32(l3init_base + CM_L3INIT_MMC1_CLKCTRL_OFT, 24, 1, 0x1);
+ sr32(l3init_base + CM_L3INIT_MMC1_CLKCTRL_OFT, 25, 1, 0x0);
+ sr32(l3init_base + CM_L3INIT_MMC2_CLKCTRL_OFT, 0, 2, 0x2);
+ sr32(l3init_base + CM_L3INIT_MMC2_CLKCTRL_OFT, 24, 1, 0x1);
+ sr32(l3init_base + CM_L3INIT_MMC2_CLKCTRL_OFT, 25, 1, 0x0);
+
+ /* WKUP clocks */
+ sr32(wkup_base + CM_WKUPAON_GPIO1_CLKCTRL_OFT, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, wkup_base +
CM_WKUPAON_GPIO1_CLKCTRL_OFT, LDELAY);
+ sr32(wkup_base + CM_WKUPAON_TIMER1_CLKCTRL_OFT, 0, 32, 0x01000002);
+ wait_on_value((1 << 17)|(1 << 16), 0, wkup_base +
CM_WKUPAON_TIMER1_CLKCTRL_OFT, LDELAY);
+ sr32(wkup_base + CM_WKUPAON_KBD_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, wkup_base +
CM_WKUPAON_KBD_CLKCTRL_OFT, LDELAY);
+
+ sr32(CM_DMA_CLKSTCTRL, 0, 32, 0x0);
+ sr32(CM_EMIF_CLKSTCTRL, 0, 32, 0x3);
+ sr32(CM_EMIF_EMIF1_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_EMIF_EMIF1_CLKCTRL, LDELAY);
+ sr32(CM_EMIF_EMIF2_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_EMIF_EMIF2_CLKCTRL, LDELAY);
+ sr32(CM_C2C_CLKSTCTRL, 0, 32, 0x3);
+ sr32(CM_L3MAIN2_GPMC_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_L3MAIN2_GPMC_CLKCTRL, LDELAY);
+ sr32(CM_L3INSTR_L3_MAIN_3_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_L3INSTR_L3_MAIN_3_CLKCTRL,
LDELAY);
+ sr32(CM_L3INSTR_L3_INSTR_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_L3INSTR_L3_INSTR_CLKCTRL,
LDELAY);
+ sr32(CM_L3INSTR_OCP_WP_NOC_CLKCTRL, 0, 32, 0x1);
+ wait_on_value((1 << 17)|(1 << 16), 0, CM_L3INSTR_OCP_WP_NOC_CLKCTRL,
LDELAY);
+
+ /* WDT clocks */
+ sr32(wkup_base + CM_WKUPAON_WD_TIMER2_CLKCTRL_OFT, 0, 32, 0x2);
+ wait_on_value((1 << 17)|(1 << 16), 0, wkup_base +
CM_WKUPAON_WD_TIMER2_CLKCTRL_OFT, LDELAY);
+
+ /* Enable Camera clocks */
+ sr32(cam_base, 0, 32, 0x3);
+ sr32(cam_base + CM_CAM_ISS_CLKCTRL_OFT, 0, 32, 0x102);
+ sr32(cam_base + CM_CAM_FDIF_CLKCTRL_OFT, 0, 32, 0x2);
+ sr32(cam_base, 0, 32, 0x0);
+
+ /* Enable DSS clocks */
+ /* PM_DSS_PWRSTCTRL ON State and LogicState = 1 (Retention) */
+ __raw_writel(7, PM_DSS_PWRSTCTRL); /* DSS_PRM */
+
+ sr32(dss_base, 0, 32, 0x2);
+ sr32(dss_base + CM_DSS_DSS_CLKCTRL_OFT, 0, 32, 0xf02);
+
+ /* Check for DSS Clocks */
+ while ((__raw_readl(dss_base) & 0xF00) != 0xE00)
+ ;
+ /* Set HW_AUTO transition mode */
+ sr32(dss_base, 0, 32, 0x3);
+
+ /* Enable GPU clocks */
+ sr32(gpu_base, 0, 32, 0x2);
+ sr32(gpu_base + CM_GPU_GPU_CLKCTRL_OFT, 0, 32, 0x2);
+
+ /* Enable hsi/unipro/usb/sata clocks */
+ sr32(l3init_base + CM_L3INIT_HSI_CLKCTRL_OFT, 0, 32, 0x1);
+ sr32(l3init_base + CM_L3INIT_UNIPRO2_CLKCTRL_OFT, 0, 32, 0x2);
+ sr32(l3init_base + CM_L3INIT_USB_HOST_HS_CLKCTRL_OFT, 0, 32, 0x2);
+ sr32(l3init_base + CM_L3INIT_USB_TLL_HS_CLKCTRL_OFT, 0, 32, 0x1);
+ sr32(l3init_base + CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFT, 0, 32, 0x2);
+ sr32(l3init_base + CM_L3INIT_SATA_CLKCTRL_OFT, 0, 32, 0x2);
+ sr32(l3init_base + CM_L3INIT_OCP2SCP1_CLKCTRL_OFT, 0, 32, 0x1);
+ sr32(l3init_base + CM_L3INIT_OCP2SCP3_CLKCTRL_OFT, 0, 32, 0x1);
+ sr32(l3init_base + CM_L3INIT_USB_OTG_SS_CLKCTRL_OFT, 0, 32, 0x1);
+}
diff --git a/arch/arm/mach-omap/omap5_generic.c
b/arch/arm/mach-omap/omap5_generic.c
new file mode 100644
index 0000000..debe849
--- /dev/null
+++ b/arch/arm/mach-omap/omap5_generic.c
@@ -0,0 +1,510 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ *
+ * Derived from OMAP4 work
+ */
+
+#include <common.h>
+#include <common.h>
+#include <init.h>
+#include <io.h>
+#include <mach/clocks.h>
+#include <mach/omap5-clock.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap5-mux.h>
+#include <mach/syslib.h>
+#include <mach/generic.h>
+#include <mach/gpmc.h>
+#include <mach/gpio.h>
+
+#define MIDR_CORTEX_A15_R0P0 0x410FC0F0
+
+#define CONTROL_ID_CODE 0x4A002204
+
+#define OMAP5430_CONTROL_ID_CODE_ES1_0 0x0B94202F
+#define OMAP5432_CONTROL_ID_CODE_ES1_0 0x0B99802F
+#define OMAP5430_CONTROL_ID_CODE_ES2_0 0x1B94202F
+#define OMAP5432_CONTROL_ID_CODE_ES2_0 0x1B99802F
+
+/* EMIF_L3_CONFIG register value */
+#define EMIF_L3_CONFIG_VAL_SYS_10_LL_0 0x0A0000FF
+#define EMIF_L3_CONFIG_VAL_SYS_10_MPU_3_LL_0 0x0A300000
+#define EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0 0x0A500000
+
+void __noreturn reset_cpu(unsigned long addr)
+{
+ writel(PRM_RSTCTRL_RESET, PRM_RSTCTRL);
+
+ while (1);
+}
+
+#define WATCHDOG_WSPR 0x48
+#define WATCHDOG_WWPS 0x34
+
+static void wait_for_command_complete(void)
+{
+ int pending = 1;
+
+ do {
+ pending = readl(OMAP54XX_WDT2_BASE + WATCHDOG_WWPS);
+ } while (pending);
+}
+
+/* EMIF */
+#define EMIF_REVISION 0x0000
+#define EMIF_STATUS 0x0004
+#define EMIF_SDRAM_CONFIG 0x0008
+#define EMIF_SDRAM_CONFIG_2 0x000C
+#define EMIF_SDRAM_REFRESH_CONTROL 0x0010
+#define EMIF_SDRAM_REFRESH_CONTROL_SHADOW 0x0014
+#define EMIF_SDRAM_TIMING_1 0x0018
+#define EMIF_SDRAM_TIMING_1_SHADOW 0x001C
+#define EMIF_SDRAM_TIMING_2 0x0020
+#define EMIF_SDRAM_TIMING_2_SHADOW 0x0024
+#define EMIF_SDRAM_TIMING_3 0x0028
+#define EMIF_SDRAM_TIMING_3_SHADOW 0x002C
+#define EMIF_POWER_MANAGEMENT_CONTROL 0x0038
+#define EMIF_POWER_MANAGEMENT_CONTROL_SHADOW 0x003C
+#define EMIF_LPDDR2_MODE_REG_DATA 0x0040
+#define EMIF_LPDDR2_MODE_REG_CONFIG 0x0050
+#define EMIF_OCP_CONFIG 0x0054
+#define EMIF_OCP_CFG_VALUE_1 0x0058
+#define EMIF_OCP_CFG_VALUE_2 0x005C
+#define EMIF_PERFORMANCE_COUNTER_1 0x0080
+#define EMIF_PERFORMANCE_COUNTER_2 0x0084
+#define EMIF_PERFORMANCE_COUNTER_CONFIG 0x0088
+#define EMIF_PERFORMANCE_COUNTER_MASTER_REGION_SELECT 0x008C
+#define EMIF_PERFORMANCE_COUNTER_TIME 0x0090
+#define EMIF_MISC_REG 0x0094
+#define EMIF_DLL_CALIB_CTRL 0x0098
+#define EMIF_DLL_CALIB_CTRL_SHADOW 0x009c
+
+#define EMIF_PWR_MGMT_CTRL 0x0038
+#define EMIF_PWR_MGMT_CTRL_SHADOW 0x003c
+#define EMIF_READ_IDLECTRL 0x0098
+#define EMIF_READ_IDLECTRL_SHADOW 0x009c
+#define EMIF_ZQ_CONFIG 0x00c8
+#define EMIF_TEMP_ALERT_CONFIG 0x00cc
+#define EMIF_L3_CONFIG 0x0054
+
+#define NUMBER_OF_EMIF_EXT_CTRL_REGISTERS 30
+
+#define EMIF_SDRAM_OUTPUT_IMPEDANCE_CALIBRATION_CONFIG 0x00C8
+
+#define EMIF_DDR_PHY_CTRL_1 0x00e4
+#define EMIF_DDR_PHY_CTRL_1_SHADOW 0x00e8
+#define EMIF_DDR_PHY_CTRL_2 0x00eC
+#define EMIF_DDR_EXT_PHY_CTRL_1 0x0200
+
+#define CS0 0
+#define CS1 1
+
+#define DMM_LISA_MAP_0 0x0040
+#define DMM_LISA_MAP_1 0x0044
+#define DMM_LISA_MAP_2 0x0048
+#define DMM_LISA_MAP_3 0x004C
+
+#define EMIF_REG_CS1NVMEN_MASK (1 << 30)
+#define EMIF_REG_INITREF_DIS_MASK (1 << 31)
+#define EMIF_REG_CS_SHIFT 31
+#define EMIF_REG_REFRESH_EN_MASK 0x40000000
+#define EMIF_REG_EBANK_MASK (1 << 3)
+
+#define MR0_ADDR 0
+#define MR1_ADDR 1
+#define MR2_ADDR 2
+#define MR3_ADDR 3
+#define MR4_ADDR 4
+#define MR10_ADDR 10
+#define MR16_ADDR 16
+#define RL_FINAL 8
+
+#define MR16_REF_FULL_ARRAY 0
+#define MR0_DAI_MASK 1
+
+#define REF_EN 0x40000000
+
+/* defines for MR1 */
+#define MR1_BL4 2
+#define MR1_BL8 3
+#define MR1_BL16 4
+
+#define MR1_BT_SEQ 0
+#define BT_INT 1
+
+#define MR1_WC 0
+#define MR1_NWC 1
+
+#define MR1_NWR3 1
+#define MR1_NWR4 2
+#define MR1_NWR5 3
+#define MR1_NWR6 4
+#define MR1_NWR7 5
+#define MR1_NWR8 6
+
+#define MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8 0xc3
+
+/* defines for MR2 */
+#define MR2_RL3_WL1 1
+#define MR2_RL4_WL2 2
+#define MR2_RL5_WL2 3
+#define MR2_RL6_WL3 4
+
+/* defines for MR10 */
+#define MR10_ZQINIT 0xFF
+#define MR10_ZQRESET 0xC3
+#define MR10_ZQCL 0xAB
+#define MR10_ZQCS 0x56
+
+/* Elpida 2x2Gbit */
+#define SDRAM_CONFIG_INIT 0x80800EB1
+#define DDR_PHY_CTRL_1_INIT 0x849FFFF5
+#define READ_IDLE_CTRL 0x000501FF
+#define PWR_MGMT_CTRL 0x4000000f
+#define PWR_MGMT_CTRL_OPP100 0x4000000f
+#define ZQ_CONFIG 0x500b3215
+
+#define CS1_MR(mr) ((mr) | 0x80000000)
+
+/* CLKCTRL_IDLSET */
+#define MODULE_CLKCTRL_IDLEST_TRANSITIONING 1
+#define MODULE_CLKCTRL_IDLEST_DISABLED 3
+#define MODULE_CLKCTRL_IDLEST_SHIFT 16
+#define MODULE_CLKCTRL_IDLEST_MASK (3 << 16)
+
+
+int omap5_emif_config(u32 base, const struct omap5_ddr_regs *regs)
+{
+ u32 *ext_phy_ctrl_base;
+ u32 *emif_ext_phy_ctrl_base;
+ int i;
+
+ /* Not NVM */
+ sr32(base + EMIF_SDRAM_CONFIG_2, 30, 1, 0);
+
+ /*
+ * Keep REG_INITREF_DIS = 1 to prevent re-initialization of SDRAM
+ * when EMIF_SDRAM_CONFIG register is written
+ */
+ sr32(base + EMIF_SDRAM_REFRESH_CONTROL, 31, 1, 1);
+
+ /*
+ * Set the SDRAM_CONFIG and PHY_CTRL for the
+ * un-locked frequency & default RL
+ */
+ writel(regs->sdram_config_init, base + EMIF_SDRAM_CONFIG);
+ writel(regs->emif_ddr_phy_ctlr_1_init, base + EMIF_DDR_PHY_CTRL_1);
+
+ ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1_init);
+ emif_ext_phy_ctrl_base = (u32 *) (base + EMIF_DDR_EXT_PHY_CTRL_1);
+
+ /* Configure external phy control registers */
+ for (i = 0; i < NUMBER_OF_EMIF_EXT_CTRL_REGISTERS; i++) {
+ writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
+ /* Write the shadow register here as well */
+ writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
+ }
+
+ writel(MR0_ADDR, base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(CS1_MR(MR0_ADDR), base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ while (readl(base + EMIF_LPDDR2_MODE_REG_DATA) & MR0_DAI_MASK);
+
+ writel(MR10_ADDR, base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR10_ZQINIT, base + EMIF_LPDDR2_MODE_REG_DATA);
+ writel(CS1_MR(MR10_ADDR), base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR10_ZQINIT, base + EMIF_LPDDR2_MODE_REG_DATA);
+
+ /*
+ * tZQINIT = 1 us
+ * Enough loops assuming a maximum of 2GHz
+ */
+ sdelay(2000);
+
+ writel(MR1_ADDR, base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8, base + EMIF_LPDDR2_MODE_REG_DATA);
+ writel(CS1_MR(MR1_ADDR), base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8, base + EMIF_LPDDR2_MODE_REG_DATA);
+
+ writel(MR16_ADDR, base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR16_REF_FULL_ARRAY, base + EMIF_LPDDR2_MODE_REG_DATA);
+ writel(CS1_MR(MR16_ADDR), base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(MR16_REF_FULL_ARRAY, base + EMIF_LPDDR2_MODE_REG_DATA);
+
+ /*
+ * Enable refresh along with writing MR2
+ * Encoding of RL in MR2 is (RL - 2)
+ */
+ writel(MR2_ADDR | EMIF_REG_REFRESH_EN_MASK, base +
EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(RL_FINAL - 2, base + EMIF_LPDDR2_MODE_REG_DATA);
+ writel(CS1_MR(MR2_ADDR) | EMIF_REG_REFRESH_EN_MASK, base +
EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(RL_FINAL - 2, base + EMIF_LPDDR2_MODE_REG_DATA);
+
+ writel(MR3_ADDR, base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(0x1, base + EMIF_LPDDR2_MODE_REG_DATA);
+ writel(CS1_MR(MR3_ADDR), base + EMIF_LPDDR2_MODE_REG_CONFIG);
+ writel(0x1, base + EMIF_LPDDR2_MODE_REG_DATA);
+
+
+ writel(regs->sdram_config, base + EMIF_SDRAM_CONFIG);
+ writel(regs->emif_ddr_phy_ctlr_1, base + EMIF_DDR_PHY_CTRL_1);
+
+ /* Enable refresh now */
+ sr32(base + EMIF_SDRAM_REFRESH_CONTROL, 31, 1, 0);
+
+ /* Emif_update_timings */
+ writel(regs->ref_ctrl, base + EMIF_SDRAM_REFRESH_CONTROL_SHADOW);
+ writel(regs->sdram_tim1, base + EMIF_SDRAM_TIMING_1_SHADOW);
+ writel(regs->sdram_tim2, base + EMIF_SDRAM_TIMING_2_SHADOW);
+ writel(regs->sdram_tim3, base + EMIF_SDRAM_TIMING_3_SHADOW);
+
+ writel(0xF0F0, base + EMIF_PWR_MGMT_CTRL);
+ writel(0xF0F0, base + EMIF_PWR_MGMT_CTRL_SHADOW);
+ writel(regs->read_idle_ctrl, base + EMIF_READ_IDLECTRL_SHADOW);
+ writel(regs->zq_config, base + EMIF_ZQ_CONFIG);
+ writel(regs->temp_alert_config, base + EMIF_TEMP_ALERT_CONFIG);
+ writel(regs->emif_ddr_phy_ctlr_1, base + EMIF_DDR_PHY_CTRL_1_SHADOW);
+
+ writel(EMIF_L3_CONFIG_VAL_SYS_10_MPU_5_LL_0, base + EMIF_L3_CONFIG);
+
+ return 0;
+}
+
+static inline void wait_for_clk_enable(u32 *clkctrl_addr)
+{
+ u32 clkctrl, idlest = MODULE_CLKCTRL_IDLEST_DISABLED;
+ u32 bound = LDELAY;
+
+ while ((idlest == MODULE_CLKCTRL_IDLEST_DISABLED) ||
+ (idlest == MODULE_CLKCTRL_IDLEST_TRANSITIONING)) {
+
+ clkctrl = readl(clkctrl_addr);
+ idlest = (clkctrl & MODULE_CLKCTRL_IDLEST_MASK) >>
+ MODULE_CLKCTRL_IDLEST_SHIFT;
+ if (--bound == 0) {
+ debug("Clock enable failed for 0x%p idlest 0x%x\n",
+ clkctrl_addr, clkctrl);
+ return;
+ }
+ }
+}
+
+static unsigned int cortex_a15_rev(void)
+{
+ unsigned int rev;
+
+ /* Read Main ID Register (MIDR) */
+ asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (rev));
+
+ return rev;
+}
+
+unsigned int omap5_revision(void)
+{
+ unsigned int rev = cortex_a15_rev();
+
+ switch(rev) {
+ case MIDR_CORTEX_A15_R0P0:
+ switch(readl(CONTROL_ID_CODE)) {
+ case OMAP5430_CONTROL_ID_CODE_ES1_0:
+ return OMAP5430_ES1_0;
+ break;
+ case OMAP5430_CONTROL_ID_CODE_ES2_0:
+ return OMAP5430_ES2_0;
+ break;
+ case OMAP5432_CONTROL_ID_CODE_ES1_0:
+ return OMAP5432_ES1_0;
+ break;
+ case OMAP5432_CONTROL_ID_CODE_ES2_0:
+ return OMAP5432_ES2_0;
+ break;
+ default:
+ return OMAP5430_ES1_0;
+ break;
+ }
+ default:
+ return OMAP543X_SILICON_ID_INVALID;
+ break;
+ }
+}
+
+void omap5_ddr_init(const struct omap5_ddr_regs *ddr_regs, const struct
dpll_param *core)
+{
+ /* DMM Configuration */
+ writel(0xFF020100, OMAP54XX_DMM_BASE + DMM_LISA_MAP_3);
+ writel(0x80740300, OMAP54XX_DMM_BASE + DMM_LISA_MAP_2);
+ writel(0x0, OMAP54XX_DMM_BASE + DMM_LISA_MAP_1);
+ writel(0x0, OMAP54XX_DMM_BASE + DMM_LISA_MAP_0);
+
+ writel(0xFF020100, OMAP54XX_MA_BASE + DMM_LISA_MAP_3);
+ writel(0x80740300, OMAP54XX_MA_BASE + DMM_LISA_MAP_2);
+ writel(0x0, OMAP54XX_MA_BASE + DMM_LISA_MAP_1);
+ writel(0x0, OMAP54XX_MA_BASE + DMM_LISA_MAP_0);
+
+ /*
+ * DDR needs to be initialised @ 19.2 MHz
+ * So put core DPLL in bypass mode
+ * Configure the Core DPLL but don't lock it
+ */
+ omap5_configure_core_dpll_no_lock(core);
+
+ omap5_emif_config(OMAP54XX_EMIF1_BASE, ddr_regs);
+ omap5_emif_config(OMAP54XX_EMIF2_BASE, ddr_regs);
+
+ /* Put EMIF clock domain in sw wakeup mode */
+ sr32(CM_EMIF_CLKSTCTRL, 0, 2, 2);
+
+ wait_for_clk_enable((u32*)CM_EMIF_EMIF1_CLKCTRL);
+ wait_for_clk_enable((u32*)CM_EMIF_EMIF2_CLKCTRL);
+
+ writel(0x00001709, CM_SHADOW_FREQ_CONFIG1);
+
+ if (!wait_on_value(1, 0, CM_SHADOW_FREQ_CONFIG1, LDELAY)) {
+ debug("FREQ UPDATE procedure failed!!");
+ hang();
+ }
+}
+
+void omap5_power_i2c_send(u32 r)
+{
+ u32 val;
+
+ writel(r, OMAP54XX_PRM_VC_VAL_BYPASS);
+
+ val = readl(OMAP54XX_PRM_VC_VAL_BYPASS);
+ val |= 0x1000000;
+ writel(val, OMAP54XX_PRM_VC_VAL_BYPASS);
+
+ while (readl(OMAP54XX_PRM_VC_VAL_BYPASS) & 0x1000000)
+ ;
+
+ val = readl(OMAP54XX_PRM_IRQSTATUS_MPU);
+ writel(val, OMAP54XX_PRM_IRQSTATUS_MPU);
+}
+
+/* Shutdown watchdog */
+static int watchdog_init(void)
+{
+ void __iomem *wd2_base = (void *)OMAP54XX_WDT2_BASE;
+
+ writel(WD_UNLOCK1, wd2_base + WATCHDOG_WSPR);
+ wait_for_command_complete();
+ writel(WD_UNLOCK2, wd2_base + WATCHDOG_WSPR);
+
+ return 0;
+}
+late_initcall(watchdog_init);
+
+static int omap_vector_init(void)
+{
+ /*
+ * omap4 usbboot interfaces with the omap4 ROM to reuse the USB port
+ * used for booting.
+ * The ROM code uses interrupts for the transfers, so do not modify the
+ * interrupt vectors in this case.
+ */
+ if (omap5_bootsrc() != OMAP_BOOTSRC_USB1) {
+ __asm__ __volatile__ (
+ "mov r0, #0;"
+ "mcr p15, #0, r0, c12, c0, #0;"
+ :
+ :
+ : "r0"
+ );
+ }
+
+ return 0;
+}
+core_initcall(omap_vector_init);
+
+#define OMAP5_TRACING_VECTOR3 0x4031f048
+
+enum omap_boot_src omap5_bootsrc(void)
+{
+ u32 bootsrc = readl(OMAP5_TRACING_VECTOR3);
+
+ if (bootsrc & (1 << 5))
+ return OMAP_BOOTSRC_MMC1;
+ if (bootsrc & (1 << 3))
+ return OMAP_BOOTSRC_NAND;
+ if (bootsrc & (1<<21))
+ return OMAP_BOOTSRC_USB1;
+ return OMAP_BOOTSRC_UNKNOWN;
+}
+
+/* Scaling vcore functions are taken from u-boot */
+void do_scale_vcore(u32 vcore_reg, u32 volt_mv)
+{
+ u32 temp, offset_code;
+ u32 step = 10000; /* 10 mV represented in uV */;
+
+ offset_code = (volt_mv * 1000 - SMPS_BASE_VOLT_UV + step - 1) / step + 6;
+
+ temp = SMPS_I2C_SLAVE_ADDR |
+ (vcore_reg << OMAP54XX_PRM_VC_VAL_BYPASS_REGADDR_SHIFT) |
+ (offset_code << OMAP54XX_PRM_VC_VAL_BYPASS_DATA_SHIFT) |
+ OMAP54XX_PRM_VC_VAL_BYPASS_VALID_BIT;
+ writel(temp, OMAP54XX_PRM_VC_VAL_BYPASS);
+ if (!wait_on_value(OMAP54XX_PRM_VC_VAL_BYPASS_VALID_BIT, 0,
+ OMAP54XX_PRM_VC_VAL_BYPASS, LDELAY)) {
+ debug("Scaling voltage failed for 0x%x\n", vcore_reg);
+ }
+}
+
+void omap5_scale_vcores(void)
+{
+ writel(0x150e, OMAP54XX_PRM_VC_CFG_I2C_CLK);
+ writel(0, OMAP54XX_PRM_VC_CFG_I2C_MODE);
+
+ /* Palmas settings */
+ do_scale_vcore(SMPS_REG_ADDR_12_MPU, VDD_MPU);
+ do_scale_vcore(SMPS_REG_ADDR_45_IVA, VDD_MM);
+ do_scale_vcore(SMPS_REG_ADDR_8_CORE, VDD_CORE);
+}
+
+void omap5_do_set_mux(u32 base, struct pad_conf_entry const *array, int
size)
+{
+ int i;
+ struct pad_conf_entry *pad = (struct pad_conf_entry *) array;
+
+ for (i = 0; i < size; i++, pad++)
+ writew(pad->val, base + pad->offset);
+}
+
+/* GPMC timing for OMAP4 nand device */
+const struct gpmc_config omap5_nand_cfg = {
+ .cfg = {
+ 0x00000800, /* CONF1 */
+ 0x00050500, /* CONF2 */
+ 0x00040400, /* CONF3 */
+ 0x03000300, /* CONF4 */
+ 0x00050808, /* CONF5 */
+ 0x00000000, /* CONF6 */
+ },
+ /* GPMC address map as small as possible */
+ .base = 0x28000000,
+ .size = GPMC_SIZE_16M,
+};
+
+static int omap5_gpio_init(void)
+{
+ add_generic_device("omap-gpio", 0, NULL, OMAP54XX_GPIO1_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 1, NULL, OMAP54XX_GPIO2_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 2, NULL, OMAP54XX_GPIO3_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 3, NULL, OMAP54XX_GPIO4_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 4, NULL, OMAP54XX_GPIO5_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+ add_generic_device("omap-gpio", 5, NULL, OMAP54XX_GPIO6_BASE,
+ 0xf00, IORESOURCE_MEM, NULL);
+
+ return 0;
+}
+coredevice_initcall(omap5_gpio_init);
diff --git a/arch/arm/mach-omap/omap_generic.c
b/arch/arm/mach-omap/omap_generic.c
index 580ed3e..ca3e553 100644
--- a/arch/arm/mach-omap/omap_generic.c
+++ b/arch/arm/mach-omap/omap_generic.c
@@ -26,6 +26,8 @@ enum omap_boot_src omap_bootsrc(void)
return omap3_bootsrc();
#elif defined(CONFIG_ARCH_OMAP4)
return omap4_bootsrc();
+#elif defined(CONFIG_ARCH_OMAP5)
+ return omap5_bootsrc();
#elif defined(CONFIG_ARCH_AM33XX)
return am33xx_bootsrc();
#endif
diff --git a/arch/arm/mach-omap/s32k_clksource.c
b/arch/arm/mach-omap/s32k_clksource.c
index 7def8b1..0377e0d 100644
--- a/arch/arm/mach-omap/s32k_clksource.c
+++ b/arch/arm/mach-omap/s32k_clksource.c
@@ -27,13 +27,18 @@
#include <io.h>
#include <mach/omap3-silicon.h>
#include <mach/omap4-silicon.h>
+#include <mach/omap5-silicon.h>
#include <mach/clocks.h>
#include <mach/timers.h>
#include <mach/sys_info.h>
#include <mach/syslib.h>
/** Sync 32Khz Timer registers */
+#ifdef CONFIG_ARCH_OMAP5
+#define S32K_CR 0x30
+#else
#define S32K_CR 0x10
+#endif
#define S32K_FREQUENCY 32768
static void __iomem *timerbase;
@@ -73,6 +78,8 @@ static int s32k_clocksource_init(void)
timerbase = (void *)OMAP3_32KTIMER_BASE;
else if (IS_ENABLED(CONFIG_ARCH_OMAP4))
timerbase = (void *)OMAP44XX_32KTIMER_BASE;
+ else if (IS_ENABLED(CONFIG_ARCH_OMAP5))
+ timerbase = (void *)OMAP54XX_32KTIMER_BASE;
else
BUG();
diff --git a/drivers/mci/Kconfig b/drivers/mci/Kconfig
index 9558f28..5aee417 100644
--- a/drivers/mci/Kconfig
+++ b/drivers/mci/Kconfig
@@ -67,7 +67,7 @@ config MCI_IMX_ESDHC_PIO
config MCI_OMAP_HSMMC
bool "OMAP HSMMC"
- depends on ARCH_OMAP4 || ARCH_OMAP3 || ARCH_AM33XX
+ depends on ARCH_OMAP5 || ARCH_OMAP4 || ARCH_OMAP3 || ARCH_AM33XX
help
Enable this entry to add support to read and write SD cards on
both OMAP3 and OMAP4 based systems.
--
1.8.1.5
--
With regards,
Uladzimir Bely.
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next reply other threads:[~2013-04-23 11:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-23 11:57 Uladzimir Bely [this message]
2013-04-24 9:09 ` [PATCH] ARM OMAP5: Basic support of Texas Instruments OMAP5 processors Jan Lübbe
2013-04-24 9:47 ` Uladzimir Bely
2013-04-25 11:56 ` Jan Lübbe
2013-04-25 12:55 ` Uladzimir Bely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51767713.8070507@sam-solutions.net \
--to=u.bely@sam-solutions.net \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.