* [PATCH] ARM: OMAP5 processors support
[not found] <014261>
@ 2013-04-24 10:33 ` Uladzimir Bely
2013-04-24 10:51 ` Uladzimir Bely
2013-04-24 20:11 ` Sascha Hauer
0 siblings, 2 replies; 13+ messages in thread
From: Uladzimir Bely @ 2013-04-24 10:33 UTC (permalink / raw)
To: barebox; +Cc: Uladzimir Bely, Uladzimir Bely
From: Uladzimir Bely <u.bely@sam-solutions.net>
Signed-off-by: Uladzimir Bely <u.bely@sam-solutions.com>
---
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
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-24 10:33 ` [PATCH] ARM: OMAP5 processors support Uladzimir Bely
@ 2013-04-24 10:51 ` Uladzimir Bely
2013-04-24 20:11 ` Sascha Hauer
1 sibling, 0 replies; 13+ messages in thread
From: Uladzimir Bely @ 2013-04-24 10:51 UTC (permalink / raw)
Cc: barebox
Previous patch
(http://lists.infradead.org/pipermail/barebox/2013-April/014243.html)
was broken (wrapped long lines) by mailer, so it's a correct version.
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.
--
With regards,
Uladzimir Bely.
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-24 10:33 ` [PATCH] ARM: OMAP5 processors support Uladzimir Bely
2013-04-24 10:51 ` Uladzimir Bely
@ 2013-04-24 20:11 ` Sascha Hauer
2013-04-25 9:09 ` Uladzimir Bely
1 sibling, 1 reply; 13+ messages in thread
From: Sascha Hauer @ 2013-04-24 20:11 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: barebox, Uladzimir Bely
On Wed, Apr 24, 2013 at 01:33:20PM +0300, Uladzimir Bely wrote:
> From: Uladzimir Bely <u.bely@sam-solutions.net>
>
> +
> +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);
We have convenience wrappers for omap3/4 (omap3_add_uartx). Would be
nice to get them for omap5 aswell.
> 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 "
> +#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
Please add at least to the base addresses a proper OMAP5_ prefix.
> +struct s32ktimer {
> + unsigned char res[0x10];
> + unsigned int s32k_cr;
> +};
This is unused.
Much of the code looks quite famliar from the omap4 port. Isn't there
more code sharing possible?
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] ARM: OMAP5 processors support
2013-04-24 20:11 ` Sascha Hauer
@ 2013-04-25 9:09 ` Uladzimir Bely
2013-04-25 11:05 ` Jean-Christophe PLAGNIOL-VILLARD
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Uladzimir Bely @ 2013-04-25 9:09 UTC (permalink / raw)
To: barebox; +Cc: Uladzimir Bely
Since commit
8bafdc1 ARM i.MX28: make chip reset via reset pin work again
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.
It's an optimized and cleaned up version of previous patch.
Signed-off-by: Uladzimir Bely <u.bely@sam-solutions.com>
---
arch/arm/Makefile | 1 +
arch/arm/boards/omap5_sevm/Makefile | 2 +
arch/arm/boards/omap5_sevm/board.c | 57 +++
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 | 425 ++++++++++++++++++++
arch/arm/mach-omap/include/mach/omap5-devices.h | 21 +
arch/arm/mach-omap/include/mach/omap5-mux.h | 321 +++++++++++++++
arch/arm/mach-omap/include/mach/omap5-silicon.h | 235 +++++++++++
arch/arm/mach-omap/omap5_clock.c | 385 ++++++++++++++++++
arch/arm/mach-omap/omap5_generic.c | 509 ++++++++++++++++++++++++
arch/arm/mach-omap/omap_generic.c | 2 +
arch/arm/mach-omap/s32k_clksource.c | 7 +
drivers/mci/Kconfig | 2 +-
drivers/mci/omap_hsmmc.c | 7 +
25 files changed, 2552 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-devices.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..5d4eb10
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/Makefile
@@ -0,0 +1,2 @@
+obj-y += board.o
+lwl-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..5700d6a
--- /dev/null
+++ b/arch/arm/boards/omap5_sevm/board.c
@@ -0,0 +1,57 @@
+/*
+ * 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 <driver.h>
+#include <io.h>
+#include <ns16550.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap5-devices.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 <asm/mmu.h>
+#include <mach/gpio.h>
+#include <i2c/i2c.h>
+
+static int omap5_sevm_console_init(void)
+{
+ omap54xx_add_uart3();
+
+ return 0;
+}
+console_initcall(omap5_sevm_console_init);
+
+static int omap5_sevm_mem_init(void)
+{
+ omap_add_ram0(SZ_512M);
+
+ return 0;
+}
+mem_initcall(omap5_sevm_mem_init);
+
+static int omap5_sevm_devices_init(void)
+{
+ omap54xx_add_mmc1(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..c606a60
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-clock.h
@@ -0,0 +1,425 @@
+/*
+ * (C) Copyright 2013
+ * Sam Solutions, <sam-solutions.com>
+ *
+ * Authors:
+ * Uladzimir Bely <u.bely@sam-solutions.com>
+ * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
+ */
+
+/* CKGEN_PRM Registers */
+#define CM_CLKSEL_ABE_DSS_SYS 0x4ae06100
+#define CM_CLKSEL_WKUPAON 0x4ae06108
+#define CM_CLKSEL_ABE_PLL_REF 0x4ae0610C
+#define CM_CLKSEL_SYS 0x4ae06110
+
+#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 offsets */
+#define CM_WKUPAON_L4_WKUP_CLKCTRL_OFT 0x20
+#define CM_WKUPAON_WD_TIMER2_CLKCTRL_OFT 0x30
+#define CM_WKUPAON_GPIO1_CLKCTRL_OFT 0x38
+#define CM_WKUPAON_TIMER1_CLKCTRL_OFT 0x40
+#define CM_WKUPAON_COUNTER_32K_CLKCTRL_OFT 0x50
+#define CM_WKUPAON_SAR_RAM_CLKCTRL_OFT 0x60
+#define CM_WKUPAON_KBD_CLKCTRL_OFT 0x78
+#define CM_WKUPAON_SCRM_CLKCTRL_OFT 0x90
+#define CM_WKUPAON_IO_SRCOMP_CLKCTRL_OFT 0x98
+
+/* CKGEN_CM_CORE_AON Registers */
+#define CM_CLKSEL_CORE 0x4a004100
+#define CM_CLKSEL_ABE 0x4a004108
+#define CM_DLL_CTRL 0x4a004110
+#define CM_CLKMODE_DPLL_CORE 0x4a004120
+#define CM_IDLEST_DPLL_CORE 0x4a004124
+#define CM_AUTOIDLE_DPLL_CORE 0x4a004128
+#define CM_CLKSEL_DPLL_CORE 0x4a00412c
+#define CM_DIV_M2_DPLL_CORE 0x4a004130
+#define CM_DIV_M3_DPLL_CORE 0x4a004134
+#define CM_DIV_H11_DPLL_CORE 0x4a004138
+#define CM_DIV_H12_DPLL_CORE 0x4a00413c
+#define CM_DIV_H13_DPLL_CORE 0x4a004140
+#define CM_DIV_H14_DPLL_CORE 0x4a004144
+#define CM_SSC_DELTAMSTEP_DPLL_CORE 0x4a004148
+#define CM_SSC_MODFREQDIV_DPLL_CORE 0x4a00414c
+#define CM_DIV_H21_DPLL_CORE 0x4a004150 /* For rev. 2 */
+#define CM_DIV_H22_DPLL_CORE 0x4a004154
+#define CM_DIV_H23_DPLL_CORE 0x4a004158
+#define CM_DIV_H24_DPLL_CORE 0x4a00415c /* For rev. 2 */
+#define CM_CLKMODE_DPLL_MPU 0x4a004160
+#define CM_IDLEST_DPLL_MPU 0x4a004164
+#define CM_AUTOIDLE_DPLL_MPU 0x4a004168
+#define CM_CLKSEL_DPLL_MPU 0x4a00416c
+#define CM_DIV_M2_DPLL_MPU 0x4a004170
+#define CM_SSC_DELTAMSTEP_DPLL_MPU 0x4a004188
+#define CM_SSC_MODFREQDIV_DPLL_MPU 0x4a00418c
+#define CM_BYPCLK_DPLL_MPU 0x4a00419c
+#define CM_CLKMODE_DPLL_IVA 0x4a0041a0
+#define CM_IDLEST_DPLL_IVA 0x4a0041a4
+#define CM_AUTOIDLE_DPLL_IVA 0x4a0041a8
+#define CM_CLKSEL_DPLL_IVA 0x4a0041ac
+#define CM_DIV_H11_DPLL_IVA 0x4a0041b8
+#define CM_DIV_H12_DPLL_IVA 0x4a0041bc
+#define CM_SSC_DELTAMSTEP_DPLL_IVA 0x4a0041c8
+#define CM_SSC_MODFREQDIV_DPLL_IVA 0x4a0041cc
+#define CM_BYPCLK_DPLL_IVA 0x4a0041dc
+#define CM_CLKMODE_DPLL_ABE 0x4a0041e0
+#define CM_IDLEST_DPLL_ABE 0x4a0041e4
+#define CM_AUTOIDLE_DPLL_ABE 0x4a0041e8
+#define CM_CLKSEL_DPLL_ABE 0x4a0041ec
+#define CM_DIV_M2_DPLL_ABE 0x4a0041f0
+#define CM_DIV_M3_DPLL_ABE 0x4a0041f4
+#define CM_SSC_DELTAMSTEP_DPLL_ABE 0x4a004208
+#define CM_SSC_MODFREQDIV_DPLL_ABE 0x4a00420c
+#define CM_SHADOW_FREQ_CONFIG1 0x4a004260
+#define CM_SHADOW_FREQ_CONFIG2 0x4a004264
+#define CM_DYN_DEP_PRESCAL 0x4a004270
+#define CM_RESTORE_ST 0x4a004280
+
+/* DSP_CM_CORE_AON Registers */
+#define CM_DSP_CLKSTCTRL 0x4a004400
+#define CM_DSP_STATICDEP 0x4a004404
+#define CM_DSP_DYNAMICDEP 0x4a004408
+#define CM_DSP_DSP_CLKCTRL 0x4a004420
+
+/* ABE_CM_CORE_AON Registers */
+#define CM_ABE_CLKSTCTRL 0x4a004500
+#define CM_ABE_L4_ABE_CLKCTRL 0x4a004520
+#define CM_ABE_AESS_CLKCTRL 0x4a004528
+#define CM_ABE_MCPDM_CLKCTRL 0x4a004530
+#define CM_ABE_DMIC_CLKCTRL 0x4a004538
+#define CM_ABE_MCASP_CLKCTRL 0x4a004540
+#define CM_ABE_MCBSP1_CLKCTRL 0x4a004548
+#define CM_ABE_MCBSP2_CLKCTRL 0x4a004550
+#define CM_ABE_MCBSP3_CLKCTRL 0x4a004558
+#define CM_ABE_SLIMBUS1_CLKCTRL 0x4a004560
+#define CM_ABE_TIMER5_CLKCTRL 0x4a004568
+#define CM_ABE_TIMER6_CLKCTRL 0x4a004570
+#define CM_ABE_TIMER7_CLKCTRL 0x4a004578
+#define CM_ABE_TIMER8_CLKCTRL 0x4a004580
+#define CM_ABE_WD_TIMER3_CLKCTRL 0x4a004588
+
+/* CKGEN_CM_CORE Registers */
+#define CM_CLKSEL_USB_60MHZ 0x4a008104
+#define CM_CLKMODE_DPLL_PER 0x4a008140
+#define CM_IDLEST_DPLL_PER 0x4a008144
+#define CM_AUTOIDLE_DPLL_PER 0x4a008148
+#define CM_CLKSEL_DPLL_PER 0x4a00814c
+#define CM_DIV_M2_DPLL_PER 0x4a008150
+#define CM_DIV_M3_DPLL_PER 0x4a008154
+#define CM_DIV_H11_DPLL_PER 0x4a008158
+#define CM_DIV_H12_DPLL_PER 0x4a00815c
+#define CM_DIV_H14_DPLL_PER 0x4a008164
+#define CM_SSC_DELTAMSTEP_DPLL_PER 0x4a008168
+#define CM_SSC_MODFREQDIV_DPLL_PER 0x4a00816c
+#define CM_CLKMODE_DPLL_USB 0x4a008180
+#define CM_IDLEST_DPLL_USB 0x4a008184
+#define CM_AUTOIDLE_DPLL_USB 0x4a008188
+#define CM_CLKSEL_DPLL_USB 0x4a00818c
+#define CM_DIV_M2_DPLL_USB 0x4a008190
+#define CM_SSC_DELTAMSTEP_DPLL_USB 0x4a0081a8
+#define CM_SSC_MODFREQDIV_DPLL_USB 0x4a0081ac
+#define CM_CLKDCOLDO_DPLL_USB 0x4a0081b4
+#define CM_CLKMODE_DPLL_UNIPRO2 0x4a0081c0
+#define CM_IDLEST_DPLL_UNIPRO2 0x4a0081c4
+#define CM_AUTOIDLE_DPLL_UNIPRO2 0x4a0081c8
+#define CM_CLKSEL_DPLL_UNIPRO2 0x4a0081cc
+#define CM_DIV_M2_DPLL_UNIPRO2 0x4a0081d0
+#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO2 0x4a0081e8
+#define CM_SSC_MODFREQDIV_DPLL_UNIPRO2 0x4a0081ec
+#define CM_CLKDCOLDO_DPLL_UNIPRO2 0x4a0081f4
+#define CM_CLKMODE_DPLL_UNIPRO1 0x4a008200
+#define CM_IDLEST_DPLL_UNIPRO1 0x4a008204
+#define CM_AUTOIDLE_DPLL_UNIPRO1 0x4a008208
+#define CM_CLKSEL_DPLL_UNIPRO1 0x4a00820c
+#define CM_DIV_M2_DPLL_UNIPRO1 0x4a008210
+#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO1 0x4a008228
+#define CM_SSC_MODFREQDIV_DPLL_UNIPRO1 0x4a00822c
+#define CM_CLKDCOLDO_DPLL_UNIPRO1 0x4a008234
+
+/* CORE_CM_CORE Registers */
+#define CM_L3MAIN1_CLKSTCTRL 0x4a008700
+#define CM_L3MAIN1_DYNAMICDEP 0x4a008708
+#define CM_L3MAIN1_L3_MAIN_1_CLKCTRL 0x4a008720
+#define CM_L3MAIN2_CLKSTCTRL 0x4a008800
+#define CM_L3MAIN2_DYNAMICDEP 0x4a008808
+#define CM_L3MAIN2_L3_MAIN_2_CLKCTRL 0x4a008820
+#define CM_L3MAIN2_GPMC_CLKCTRL 0x4a008828
+#define CM_L3MAIN2_OCMC_RAM_CLKCTRL 0x4a008830
+#define CM_IPU_CLKSTCTRL 0x4a008900
+#define CM_IPU_STATICDEP 0x4a008904
+#define CM_IPU_DYNAMICDEP 0x4a008908
+#define CM_IPU_IPU_CLKCTRL 0x4a008920
+#define CM_DMA_CLKSTCTRL 0x4a008a00
+#define CM_DMA_STATICDEP 0x4a008a04
+#define CM_DMA_DYNAMICDEP 0x4a008a08
+#define CM_DMA_DMA_SYSTEM_CLKCTRL 0x4a008a20
+#define CM_EMIF_CLKSTCTRL 0x4a008b00
+#define CM_EMIF_DMM_CLKCTRL 0x4a008b20
+#define CM_EMIF_EMIF_OCP_FW_CLKCTRL 0x4a008b28
+#define CM_EMIF_EMIF1_CLKCTRL 0x4a008b30
+#define CM_EMIF_EMIF2_CLKCTRL 0x4a008b38
+#define CM_EMIF_EMIF_DLL_CLKCTRL 0x4a008b40
+#define CM_C2C_CLKSTCTRL 0x4a008c00
+#define CM_C2C_STATICDEP 0x4a008c04
+#define CM_C2C_DYNAMICDEP 0x4a008c08
+#define CM_C2C_C2C_CLKCTRL 0x4a008c20
+#define CM_C2C_MODEM_ICR_CLKCTRL 0x4a008c28
+#define CM_C2C_C2C_OCP_FW_CLKCTRL 0x4a008c30
+#define CM_L4CFG_CLKSTCTRL 0x4a008d00
+#define CM_L4CFG_DYNAMICDEP 0x4a008d08
+#define CM_L4CFG_L4_CFG_CLKCTRL 0x4a008d20
+#define CM_L4CFG_SPINLOCK_CLKCTRL 0x4a008d28
+#define CM_L4CFG_MAILBOX_CLKCTRL 0x4a008d30
+#define CM_L4CFG_SAR_ROM_CLKCTRL 0x4a008d38
+#define CM_L4CFG_OCP2SCP2_CLKCTRL 0x4a008d40
+#define CM_L3INSTR_CLKSTCTRL 0x4a008e00
+#define CM_L3INSTR_L3_MAIN_3_CLKCTRL 0x4a008e20
+#define CM_L3INSTR_L3_INSTR_CLKCTRL 0x4a008e28
+#define CM_L3INSTR_OCP_WP_NOC_CLKCTRL 0x4a008e40
+#define CM_L3INSTR_DLL_AGING_CLKCTRL 0x4a008e48
+#define CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL 0x4a008e50
+
+/* L4PER_CM_CORE Registers offsets*/
+#define CM_L4PER_DYNAMICDEP_OFT 0x08
+#define CM_L4PER_TIMER10_CLKCTRL_OFT 0x28
+#define CM_L4PER_TIMER11_CLKCTRL_OFT 0x30
+#define CM_L4PER_TIMER2_CLKCTRL_OFT 0x38
+#define CM_L4PER_TIMER3_CLKCTRL_OFT 0x40
+#define CM_L4PER_TIMER4_CLKCTRL_OFT 0x48
+#define CM_L4PER_TIMER9_CLKCTRL_OFT 0x50
+#define CM_L4PER_ELM_CLKCTRL_OFT 0x58
+#define CM_L4PER_GPIO2_CLKCTRL_OFT 0x60
+#define CM_L4PER_GPIO3_CLKCTRL_OFT 0x68
+#define CM_L4PER_GPIO4_CLKCTRL_OFT 0x70
+#define CM_L4PER_GPIO5_CLKCTRL_OFT 0x78
+#define CM_L4PER_GPIO6_CLKCTRL_OFT 0x80
+#define CM_L4PER_HDQ1W_CLKCTRL_OFT 0x88
+#define CM_L4PER_I2C1_CLKCTRL_OFT 0xa0
+#define CM_L4PER_I2C2_CLKCTRL_OFT 0xa8
+#define CM_L4PER_I2C3_CLKCTRL_OFT 0xb0
+#define CM_L4PER_I2C4_CLKCTRL_OFT 0xb8
+#define CM_L4PER_L4_PER_CLKCTRL_OFT 0xc0
+#define CM_L4PER_MCSPI1_CLKCTRL_OFT 0xf0
+#define CM_L4PER_MCSPI2_CLKCTRL_OFT 0xf8
+#define CM_L4PER_MCSPI3_CLKCTRL_OFT 0x100
+#define CM_L4PER_MCSPI4_CLKCTRL_OFT 0x108
+#define CM_L4PER_GPIO7_CLKCTRL_OFT 0x110
+#define CM_L4PER_GPIO8_CLKCTRL_OFT 0x118
+#define CM_L4PER_MMC3_CLKCTRL_OFT 0x120
+#define CM_L4PER_MMC4_CLKCTRL_OFT 0x128
+#define CM_L4PER_SLIMBUS2_CLKCTRL_OFT 0x138
+#define CM_L4PER_UART1_CLKCTRL_OFT 0x140
+#define CM_L4PER_UART2_CLKCTRL_OFT 0x148
+#define CM_L4PER_UART3_CLKCTRL_OFT 0x150
+#define CM_L4PER_UART4_CLKCTRL_OFT 0x158
+#define CM_L4PER_MMC5_CLKCTRL_OFT 0x160
+#define CM_L4PER_I2C5_CLKCTRL_OFT 0x168
+#define CM_L4PER_UART5_CLKCTRL_OFT 0x170
+#define CM_L4PER_UART6_CLKCTRL_OFT 0x178
+#define CM_L4SEC_CLKSTCTRL_OFT 0x180
+#define CM_L4SEC_STATICDEP_OFT 0x184
+#define CM_L4SEC_DYNAMICDEP_OFT 0x188
+#define CM_L4SEC_AES1_CLKCTRL_OFT 0x1a0
+#define CM_L4SEC_AES2_CLKCTRL_OFT 0x1a8
+#define CM_L4SEC_DES3DES_CLKCTRL_OFT 0x1b0
+#define CM_L4SEC_FPKA_OFT 0x1b8
+#define CM_L4SEC_RNG_CLKCTRL_OFT 0x1c0
+#define CM_L4SEC_SHA2MD5_CLKCTRL_OFT 0x1c8
+#define CM_L4SEC_DMA_CRYPTO_CLKCTRL_OFT 0x1d8
+
+/* L3INIT_CM_CORE Registers offsets */
+#define CM_L3INIT_STATICDEP_OFT 0x04
+#define CM_L3INIT_DYNAMICDEP_OFT 0x08
+#define CM_L3INIT_MMC1_CLKCTRL_OFT 0x28
+#define CM_L3INIT_MMC2_CLKCTRL_OFT 0x30
+#define CM_L3INIT_HSI_CLKCTRL_OFT 0x38
+#define CM_L3INIT_UNIPRO2_CLKCTRL_OFT 0x40
+#define CM_L3INIT_MPHY_UNIPRO2_CLKCTRL_OFT 0x48
+#define CM_L3INIT_USB_HOST_HS_CLKCTRL_OFT 0x58
+#define CM_L3INIT_USB_TLL_HS_CLKCTRL_OFT 0x68
+#define CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFT 0x78
+#define CM_L3INIT_SATA_CLKCTRL_OFT 0x88
+#define CM_L3INIT_OCP2SCP1_CLKCTRL_OFT 0xe0
+#define CM_L3INIT_OCP2SCP3_CLKCTRL_OFT 0xe8
+#define CM_L3INIT_USB_OTG_SS_CLKCTRL_OFT 0xf0
+
+/* CAM_CM_CORE Registers offsets */
+#define CM_CAM_STATICDEP_OFT 0x04
+#define CM_CAM_DYNAMICDEP_OFT 0x08
+#define CM_CAM_ISS_CLKCTRL_OFT 0x20
+#define CM_CAM_FDIF_CLKCTRL_OFT 0x28
+#define CM_CAM_CAL_CLKCTRL_OFT 0x30
+
+/* DSS_CM_CORE Registers offsets */
+#define CM_DSS_STATICDEP_OFT 0x04
+#define CM_DSS_DYNAMICDEP_OFT 0x08
+#define CM_DSS_DSS_CLKCTRL_OFT 0x20
+#define CM_DSS_BB2D_CLKCTRL_OFT 0x30 /* For rev. 2 */
+
+/* GPU_CM_CORE Registers offsets */
+#define CM_GPU_STATICDEP_OFT 0x04
+#define CM_GPU_DYNAMICDEP_OFT 0x08
+#define CM_GPU_GPU_CLKCTRL_OFT 0x20
+
+#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-devices.h b/arch/arm/mach-omap/include/mach/omap5-devices.h
new file mode 100644
index 0000000..adef686
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-devices.h
@@ -0,0 +1,21 @@
+#ifndef __MACH_OMAP5_DEVICES_H
+#define __MACH_OMAP5_DEVICES_H
+
+#include <driver.h>
+#include <sizes.h>
+#include <mach/devices.h>
+#include <mach/omap5-silicon.h>
+#include <mach/omap_hsmmc.h>
+
+static inline struct device_d *omap54xx_add_uart3(void)
+{
+ return omap_add_uart(2, OMAP54XX_UART3_BASE);
+}
+
+static inline struct device_d *omap54xx_add_mmc1(struct omap_hsmmc_platform_data *pdata)
+{
+ return add_generic_device("omap5-hsmmc", 0, NULL,
+ OMAP54XX_MMC1_BASE, SZ_4K, IORESOURCE_MEM, pdata);
+}
+
+#endif /* __MACH_OMAP5_DEVICES_H */
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..4e2b3fb
--- /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 0x00
+#define CORE_HWINFO 0x04
+#define CORE_SYSCONFIG 0x10
+#define EMMC_CLK 0x40
+#define EMMC_CMD 0x42
+#define EMMC_DATA0 0x44
+#define EMMC_DATA1 0x46
+#define EMMC_DATA2 0x48
+#define EMMC_DATA3 0x4a
+#define EMMC_DATA4 0x4c
+#define EMMC_DATA5 0x4e
+#define EMMC_DATA6 0x50
+#define EMMC_DATA7 0x52
+#define C2C_CLKOUT0 0x54
+#define C2C_CLKOUT1 0x56
+#define C2C_CLKIN0 0x58
+#define C2C_CLKIN1 0x5a
+#define C2C_DATAIN0 0x5c
+#define C2C_DATAIN1 0x5e
+#define C2C_DATAIN2 0x60
+#define C2C_DATAIN3 0x62
+#define C2C_DATAIN4 0x64
+#define C2C_DATAIN5 0x66
+#define C2C_DATAIN6 0x68
+#define C2C_DATAIN7 0x6a
+#define C2C_DATAOUT0 0x6c
+#define C2C_DATAOUT1 0x6e
+#define C2C_DATAOUT2 0x70
+#define C2C_DATAOUT3 0x72
+#define C2C_DATAOUT4 0x74
+#define C2C_DATAOUT5 0x76
+#define C2C_DATAOUT6 0x78
+#define C2C_DATAOUT7 0x7a
+#define C2C_DATA8 0x7c
+#define C2C_DATA9 0x7e
+#define C2C_DATA10 0x80
+#define C2C_DATA11 0x82
+#define C2C_DATA12 0x84
+#define C2C_DATA13 0x86
+#define C2C_DATA14 0x88
+#define C2C_DATA15 0x8a
+#define LLIA_WAKEREQOUT 0x8c
+#define LLIB_WAKEREQOUT 0x8e
+#define HSI1_ACREADY 0x90
+#define HSI1_CAREADY 0x92
+#define HSI1_ACWAKE 0x94
+#define HSI1_CAWAKE 0x96
+#define HSI1_ACFLAG 0x98
+#define HSI1_ACDATA 0x9a
+#define HSI1_CAFLAG 0x9c
+#define HSI1_CADATA 0x9e
+#define UART1_TX 0xa0
+#define UART1_CTS 0xa2
+#define UART1_RX 0xa4
+#define UART1_RTS 0xa6
+#define HSI2_CAREADY 0xa8
+#define HSI2_ACREADY 0xaa
+#define HSI2_CAWAKE 0xac
+#define HSI2_ACWAKE 0xae
+#define HSI2_CAFLAG 0xb0
+#define HSI2_CADATA 0xb2
+#define HSI2_ACFLAG 0xb4
+#define HSI2_ACDATA 0xb6
+#define UART2_RTS 0xb8
+#define UART2_CTS 0xba
+#define UART2_RX 0xbc
+#define UART2_TX 0xbe
+#define USBB1_HSIC_STROBE 0xc0
+#define USBB1_HSIC_DATA 0xc2
+#define USBB2_HSIC_STROBE 0xc4
+#define USBB2_HSIC_DATA 0xc6
+#define TIMER10_PWM_EVT 0xc8
+#define DSIPORTA_TE0 0xca
+#define DSIPORTA_LANE0X 0xcc
+#define DSIPORTA_LANE0Y 0xce
+#define DSIPORTA_LANE1X 0xd0
+#define DSIPORTA_LANE1Y 0xd2
+#define DSIPORTA_LANE2X 0xd4
+#define DSIPORTA_LANE2Y 0xd6
+#define DSIPORTA_LANE3X 0xd8
+#define DSIPORTA_LANE3Y 0xda
+#define DSIPORTA_LANE4X 0xdc
+#define DSIPORTA_LANE4Y 0xde
+#define DSIPORTC_LANE0X 0xe0
+#define DSIPORTC_LANE0Y 0xe2
+#define DSIPORTC_LANE1X 0xe4
+#define DSIPORTC_LANE1Y 0xe6
+#define DSIPORTC_LANE2X 0xe8
+#define DSIPORTC_LANE2Y 0xea
+#define DSIPORTC_LANE3X 0xec
+#define DSIPORTC_LANE3Y 0xee
+#define DSIPORTC_LANE4X 0xf0
+#define DSIPORTC_LANE4Y 0xf2
+#define DSIPORTC_TE0 0xf4
+#define TIMER9_PWM_EVT 0xf6
+#define I2C4_SCL 0xf8
+#define I2C4_SDA 0xfa
+#define MCSPI2_CLK 0xfc
+#define MCSPI2_SIMO 0xfe
+#define MCSPI2_SOMI 0x100
+#define MCSPI2_CS0 0x102
+#define RFBI_DATA15 0x104
+#define RFBI_DATA14 0x106
+#define RFBI_DATA13 0x108
+#define RFBI_DATA12 0x10a
+#define RFBI_DATA11 0x10c
+#define RFBI_DATA10 0x10e
+#define RFBI_DATA9 0x110
+#define RFBI_DATA8 0x112
+#define RFBI_DATA7 0x114
+#define RFBI_DATA6 0x116
+#define RFBI_DATA5 0x118
+#define RFBI_DATA4 0x11a
+#define RFBI_DATA3 0x11c
+#define RFBI_DATA2 0x11e
+#define RFBI_DATA1 0x120
+#define RFBI_DATA0 0x122
+#define RFBI_WE 0x124
+#define RFBI_CS0 0x126
+#define RFBI_A0 0x128
+#define RFBI_RE 0x12a
+#define RFBI_HSYNC0 0x12c
+#define RFBI_TE_VSYNC0 0x12e
+#define GPIO6_182 0x130
+#define GPIO6_183 0x132
+#define GPIO6_184 0x134
+#define GPIO6_185 0x136
+#define GPIO6_186 0x138
+#define GPIO6_187 0x13a
+#define HDMI_CEC 0x13c
+#define HDMI_HPD 0x13e
+#define HDMI_DDC_SCL 0x140
+#define HDMI_DDC_SDA 0x142
+#define CSIPORTC_LANE0X 0x144
+#define CSIPORTC_LANE0Y 0x146
+#define CSIPORTC_LANE1X 0x148
+#define CSIPORTC_LANE1Y 0x14a
+#define CSIPORTB_LANE0X 0x14c
+#define CSIPORTB_LANE0Y 0x14e
+#define CSIPORTB_LANE1X 0x150
+#define CSIPORTB_LANE1Y 0x152
+#define CSIPORTB_LANE2X 0x154
+#define CSIPORTB_LANE2Y 0x156
+#define CSIPORTA_LANE0X 0x158
+#define CSIPORTA_LANE0Y 0x15a
+#define CSIPORTA_LANE1X 0x15c
+#define CSIPORTA_LANE1Y 0x15e
+#define CSIPORTA_LANE2X 0x160
+#define CSIPORTA_LANE2Y 0x162
+#define CSIPORTA_LANE3X 0x164
+#define CSIPORTA_LANE3Y 0x166
+#define CSIPORTA_LANE4X 0x168
+#define CSIPORTA_LANE4Y 0x16a
+#define CAM_SHUTTER 0x16c
+#define CAM_STROBE 0x16e
+#define CAM_GLOBALRESET 0x170
+#define TIMER11_PWM_EVT 0x172
+#define TIMER5_PWM_EVT 0x174
+#define TIMER6_PWM_EVT 0x176
+#define TIMER8_PWM_EVT 0x178
+#define I2C3_SCL 0x17a
+#define I2C3_SDA 0x17c
+#define GPIO8_233 0x17e
+#define GPIO8_234 0x180
+#define ABE_CLKS 0x182
+#define ABEDMIC_DIN1 0x184
+#define ABEDMIC_DIN2 0x186
+#define ABEDMIC_DIN3 0x188
+#define ABEDMIC_CLK1 0x18a
+#define ABEDMIC_CLK2 0x18c
+#define ABEDMIC_CLK3 0x18e
+#define ABESLIMBUS1_CLOCK 0x190
+#define ABESLIMBUS1_DATA 0x192
+#define ABEMCBSP2_DR 0x194
+#define ABEMCBSP2_DX 0x196
+#define ABEMCBSP2_FSX 0x198
+#define ABEMCBSP2_CLKX 0x19a
+#define ABEMCPDM_UL_DATA 0x19c
+#define ABEMCPDM_DL_DATA 0x19e
+#define ABEMCPDM_FRAME 0x1a0
+#define ABEMCPDM_LB_CLK 0x1a2
+#define WLSDIO_CLK 0x1a4
+#define WLSDIO_CMD 0x1a6
+#define WLSDIO_DATA0 0x1a8
+#define WLSDIO_DATA1 0x1aa
+#define WLSDIO_DATA2 0x1ac
+#define WLSDIO_DATA3 0x1ae
+#define UART5_RX 0x1b0
+#define UART5_TX 0x1b2
+#define UART5_CTS 0x1b4
+#define UART5_RTS 0x1b6
+#define I2C2_SCL 0x1b8
+#define I2C2_SDA 0x1ba
+#define MCSPI1_CLK 0x1bc
+#define MCSPI1_SOMI 0x1be
+#define MCSPI1_SIMO 0x1c0
+#define MCSPI1_CS0 0x1c2
+#define MCSPI1_CS1 0x1c4
+#define I2C5_SCL 0x1c6
+#define I2C5_SDA 0x1c8
+#define PERSLIMBUS2_CLOCK 0x1ca /* GPIO5_145 in rev. 2 */
+#define PERSLIMBUS2_DATA 0x1cc /* GPIO5_146 in rev. 2 */
+#define UART6_TX 0x1ce
+#define UART6_RX 0x1d0
+#define UART6_CTS 0x1d2
+#define UART6_RTS 0x1d4
+#define UART3_CTS_RCTX 0x1d6
+#define UART3_RTS_IRSD 0x1d8
+#define UART3_TX_IRTX 0x1da
+#define UART3_RX_IRRX 0x1dc
+#define USBB3_HSIC_STROBE 0x1de
+#define USBB3_HSIC_DATA 0x1e0
+#define SDCARD_CLK 0x1e2
+#define SDCARD_CMD 0x1e4
+#define SDCARD_DATA2 0x1e6
+#define SDCARD_DATA3 0x1e8
+#define SDCARD_DATA0 0x1ea
+#define SDCARD_DATA1 0x1ec
+#define USBD0_HS_DP 0x1ee
+#define USBD0_HS_DM 0x1f0
+#define I2C1_PMIC_SCL 0x1f2
+#define I2C1_PMIC_SDA 0x1f4
+#define USBD0_SS_RX 0x1f6
+
+/* CTRL_MODULE_WKUP_PAD Registers offsets */
+/* Base address is 0x4ae0c800 */
+#define WKUP_REVISION 0x00
+#define WKUP_HWINFO 0x04
+#define WKUP_SYSCONFIG 0x10
+#define LLIA_WAKEREQIN 0x40
+#define LLIB_WAKEREQIN 0x42
+#define DRM_EMU0 0x44
+#define DRM_EMU1 0x46
+#define JTAG_NTRST 0x48
+#define JTAG_TCK 0x4a
+#define JTAG_RTCK 0x4c
+#define JTAG_TMSC 0x4e
+#define JTAG_TDI 0x50
+#define JTAG_TDO 0x52
+#define SYS_32K 0x54
+#define FREF_CLK_IOREQ 0x56
+#define FREF_CLK0_OUT 0x58
+#define FREF_CLK1_OUT 0x5a
+#define FREF_CLK2_OUT 0x5c
+#define FREF_CLK2_REQ 0x5e
+#define FREF_CLK1_REQ 0x60
+#define SYS_NRESPWRON 0x62
+#define SYS_NRESWARM 0x64
+#define SYS_PWR_REQ 0x66
+#define SYS_NIRQ1 0x68
+#define SYS_NIRQ2 0x6a
+#define SR_PMIC_SCL 0x6c
+#define SR_PMIC_SDA 0x6e
+#define SYS_BOOT0 0x70
+#define SYS_BOOT1 0x72
+#define SYS_BOOT2 0x74
+#define SYS_BOOT3 0x76
+#define SYS_BOOT4 0x78
+#define SYS_BOOT5 0x7a
+
+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..b29242d
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap5-silicon.h
@@ -0,0 +1,235 @@
+/*
+ * (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
+
+/*
+ * 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..6cba922
--- /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 = 0x4ae07800;
+ u32 l4per_base = 0x4a009400;
+ u32 l3init_base = 0x4a009300;
+ u32 cam_base = 0x4a009000;
+ u32 dss_base = 0x4a009100;
+ u32 gpu_base = 0x4a009200;
+
+ if (rev == OMAP5430_ES2_0 || rev == OMAP5432_ES2_0) {
+ wkup_base = 0x4ae07900;
+ l4per_base = 0x4a009000;
+ l3init_base = 0x4a009600;
+ cam_base = 0x4a009300;
+ dss_base = 0x4a009400;
+ gpu_base = 0x4a009500;
+ }
+
+ /* 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..11bb068
--- /dev/null
+++ b/arch/arm/mach-omap/omap5_generic.c
@@ -0,0 +1,509 @@
+/*
+ * (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 <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.
diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
index b379c31..e923dc1 100644
--- a/drivers/mci/omap_hsmmc.c
+++ b/drivers/mci/omap_hsmmc.c
@@ -71,6 +71,10 @@ static struct omap_mmc_driver_data omap4_data = {
.reg_ofs = 0x100,
};
+static struct omap_mmc_driver_data omap5_data = {
+ .reg_ofs = 0x100,
+};
+
/*
* OMAP HS MMC Bit definitions
*/
@@ -621,6 +625,9 @@ static struct platform_device_id omap_mmc_ids[] = {
.name = "omap4-hsmmc",
.driver_data = (unsigned long)&omap4_data,
}, {
+ .name = "omap5-hsmmc",
+ .driver_data = (unsigned long)&omap5_data,
+ }, {
/* sentinel */
},
};
--
1.8.1.5
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 9:09 ` Uladzimir Bely
@ 2013-04-25 11:05 ` Jean-Christophe PLAGNIOL-VILLARD
2013-04-25 11:58 ` Jan Lübbe
2013-04-25 13:31 ` menon.nishanth
2 siblings, 0 replies; 13+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-04-25 11:05 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: barebox
On 12:09 Thu 25 Apr , Uladzimir Bely wrote:
> Since commit
> 8bafdc1 ARM i.MX28: make chip reset via reset pin work again
>
> 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.
>
> It's an optimized and cleaned up version of previous patch.
>
> Signed-off-by: Uladzimir Bely <u.bely@sam-solutions.com>
> ---
> arch/arm/Makefile | 1 +
> arch/arm/boards/omap5_sevm/Makefile | 2 +
> arch/arm/boards/omap5_sevm/board.c | 57 +++
> 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 | 425 ++++++++++++++++++++
> arch/arm/mach-omap/include/mach/omap5-devices.h | 21 +
> arch/arm/mach-omap/include/mach/omap5-mux.h | 321 +++++++++++++++
> arch/arm/mach-omap/include/mach/omap5-silicon.h | 235 +++++++++++
> arch/arm/mach-omap/omap5_clock.c | 385 ++++++++++++++++++
> arch/arm/mach-omap/omap5_generic.c | 509 ++++++++++++++++++++++++
> arch/arm/mach-omap/omap_generic.c | 2 +
> arch/arm/mach-omap/s32k_clksource.c | 7 +
> drivers/mci/Kconfig | 2 +-
> drivers/mci/omap_hsmmc.c | 7 +
> 25 files changed, 2552 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-devices.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..5d4eb10
> --- /dev/null
> +++ b/arch/arm/boards/omap5_sevm/Makefile
> @@ -0,0 +1,2 @@
> +obj-y += board.o
> +lwl-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..5700d6a
> --- /dev/null
> +++ b/arch/arm/boards/omap5_sevm/board.c
> @@ -0,0 +1,57 @@
> +/*
> + * 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 <driver.h>
> +#include <io.h>
> +#include <ns16550.h>
> +#include <asm/armlinux.h>
> +#include <generated/mach-types.h>
> +#include <mach/omap5-silicon.h>
> +#include <mach/omap5-devices.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 <asm/mmu.h>
> +#include <mach/gpio.h>
> +#include <i2c/i2c.h>
> +
> +static int omap5_sevm_console_init(void)
> +{
> + omap54xx_add_uart3();
> +
> + return 0;
> +}
> +console_initcall(omap5_sevm_console_init);
> +
> +static int omap5_sevm_mem_init(void)
> +{
> + omap_add_ram0(SZ_512M);
can we detect it?
> +
> + return 0;
> +}
> +mem_initcall(omap5_sevm_mem_init);
> +
> +static int omap5_sevm_devices_init(void)
> +{
> + omap54xx_add_mmc1(NULL);
> +
> + armlinux_set_bootparams((void *)0x80000100);
> + armlinux_set_architecture(MACH_TYPE_OMAP5_SEVM);
IIRC the omap5 is DT only
> +
> + 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 "
please switch to defaultenv-2
> 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);
really hardcoded?
> +}
> 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..c606a60
> --- /dev/null
> +++ b/arch/arm/mach-omap/include/mach/omap5-clock.h
> @@ -0,0 +1,425 @@
> +/*
> + * (C) Copyright 2013
> + * Sam Solutions, <sam-solutions.com>
> + *
> + * Authors:
> + * Uladzimir Bely <u.bely@sam-solutions.com>
> + * Dmitry Lavnikevich <d.lavnikevich@sam-solutions.com>
> + */
> +
> +/* CKGEN_PRM Registers */
> +#define CM_CLKSEL_ABE_DSS_SYS 0x4ae06100
> +#define CM_CLKSEL_WKUPAON 0x4ae06108
> +#define CM_CLKSEL_ABE_PLL_REF 0x4ae0610C
> +#define CM_CLKSEL_SYS 0x4ae06110
> +
> +#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 offsets */
> +#define CM_WKUPAON_L4_WKUP_CLKCTRL_OFT 0x20
> +#define CM_WKUPAON_WD_TIMER2_CLKCTRL_OFT 0x30
> +#define CM_WKUPAON_GPIO1_CLKCTRL_OFT 0x38
> +#define CM_WKUPAON_TIMER1_CLKCTRL_OFT 0x40
> +#define CM_WKUPAON_COUNTER_32K_CLKCTRL_OFT 0x50
> +#define CM_WKUPAON_SAR_RAM_CLKCTRL_OFT 0x60
> +#define CM_WKUPAON_KBD_CLKCTRL_OFT 0x78
> +#define CM_WKUPAON_SCRM_CLKCTRL_OFT 0x90
> +#define CM_WKUPAON_IO_SRCOMP_CLKCTRL_OFT 0x98
> +
> +/* CKGEN_CM_CORE_AON Registers */
> +#define CM_CLKSEL_CORE 0x4a004100
> +#define CM_CLKSEL_ABE 0x4a004108
> +#define CM_DLL_CTRL 0x4a004110
> +#define CM_CLKMODE_DPLL_CORE 0x4a004120
> +#define CM_IDLEST_DPLL_CORE 0x4a004124
> +#define CM_AUTOIDLE_DPLL_CORE 0x4a004128
> +#define CM_CLKSEL_DPLL_CORE 0x4a00412c
> +#define CM_DIV_M2_DPLL_CORE 0x4a004130
> +#define CM_DIV_M3_DPLL_CORE 0x4a004134
> +#define CM_DIV_H11_DPLL_CORE 0x4a004138
> +#define CM_DIV_H12_DPLL_CORE 0x4a00413c
> +#define CM_DIV_H13_DPLL_CORE 0x4a004140
> +#define CM_DIV_H14_DPLL_CORE 0x4a004144
> +#define CM_SSC_DELTAMSTEP_DPLL_CORE 0x4a004148
> +#define CM_SSC_MODFREQDIV_DPLL_CORE 0x4a00414c
> +#define CM_DIV_H21_DPLL_CORE 0x4a004150 /* For rev. 2 */
> +#define CM_DIV_H22_DPLL_CORE 0x4a004154
> +#define CM_DIV_H23_DPLL_CORE 0x4a004158
> +#define CM_DIV_H24_DPLL_CORE 0x4a00415c /* For rev. 2 */
> +#define CM_CLKMODE_DPLL_MPU 0x4a004160
> +#define CM_IDLEST_DPLL_MPU 0x4a004164
> +#define CM_AUTOIDLE_DPLL_MPU 0x4a004168
> +#define CM_CLKSEL_DPLL_MPU 0x4a00416c
> +#define CM_DIV_M2_DPLL_MPU 0x4a004170
> +#define CM_SSC_DELTAMSTEP_DPLL_MPU 0x4a004188
> +#define CM_SSC_MODFREQDIV_DPLL_MPU 0x4a00418c
> +#define CM_BYPCLK_DPLL_MPU 0x4a00419c
> +#define CM_CLKMODE_DPLL_IVA 0x4a0041a0
> +#define CM_IDLEST_DPLL_IVA 0x4a0041a4
> +#define CM_AUTOIDLE_DPLL_IVA 0x4a0041a8
> +#define CM_CLKSEL_DPLL_IVA 0x4a0041ac
> +#define CM_DIV_H11_DPLL_IVA 0x4a0041b8
> +#define CM_DIV_H12_DPLL_IVA 0x4a0041bc
> +#define CM_SSC_DELTAMSTEP_DPLL_IVA 0x4a0041c8
> +#define CM_SSC_MODFREQDIV_DPLL_IVA 0x4a0041cc
> +#define CM_BYPCLK_DPLL_IVA 0x4a0041dc
> +#define CM_CLKMODE_DPLL_ABE 0x4a0041e0
> +#define CM_IDLEST_DPLL_ABE 0x4a0041e4
> +#define CM_AUTOIDLE_DPLL_ABE 0x4a0041e8
> +#define CM_CLKSEL_DPLL_ABE 0x4a0041ec
> +#define CM_DIV_M2_DPLL_ABE 0x4a0041f0
> +#define CM_DIV_M3_DPLL_ABE 0x4a0041f4
> +#define CM_SSC_DELTAMSTEP_DPLL_ABE 0x4a004208
> +#define CM_SSC_MODFREQDIV_DPLL_ABE 0x4a00420c
> +#define CM_SHADOW_FREQ_CONFIG1 0x4a004260
> +#define CM_SHADOW_FREQ_CONFIG2 0x4a004264
> +#define CM_DYN_DEP_PRESCAL 0x4a004270
> +#define CM_RESTORE_ST 0x4a004280
> +
> +/* DSP_CM_CORE_AON Registers */
> +#define CM_DSP_CLKSTCTRL 0x4a004400
> +#define CM_DSP_STATICDEP 0x4a004404
> +#define CM_DSP_DYNAMICDEP 0x4a004408
> +#define CM_DSP_DSP_CLKCTRL 0x4a004420
> +
> +/* ABE_CM_CORE_AON Registers */
> +#define CM_ABE_CLKSTCTRL 0x4a004500
> +#define CM_ABE_L4_ABE_CLKCTRL 0x4a004520
> +#define CM_ABE_AESS_CLKCTRL 0x4a004528
> +#define CM_ABE_MCPDM_CLKCTRL 0x4a004530
> +#define CM_ABE_DMIC_CLKCTRL 0x4a004538
> +#define CM_ABE_MCASP_CLKCTRL 0x4a004540
> +#define CM_ABE_MCBSP1_CLKCTRL 0x4a004548
> +#define CM_ABE_MCBSP2_CLKCTRL 0x4a004550
> +#define CM_ABE_MCBSP3_CLKCTRL 0x4a004558
> +#define CM_ABE_SLIMBUS1_CLKCTRL 0x4a004560
> +#define CM_ABE_TIMER5_CLKCTRL 0x4a004568
> +#define CM_ABE_TIMER6_CLKCTRL 0x4a004570
> +#define CM_ABE_TIMER7_CLKCTRL 0x4a004578
> +#define CM_ABE_TIMER8_CLKCTRL 0x4a004580
> +#define CM_ABE_WD_TIMER3_CLKCTRL 0x4a004588
> +
> +/* CKGEN_CM_CORE Registers */
> +#define CM_CLKSEL_USB_60MHZ 0x4a008104
> +#define CM_CLKMODE_DPLL_PER 0x4a008140
> +#define CM_IDLEST_DPLL_PER 0x4a008144
> +#define CM_AUTOIDLE_DPLL_PER 0x4a008148
> +#define CM_CLKSEL_DPLL_PER 0x4a00814c
> +#define CM_DIV_M2_DPLL_PER 0x4a008150
> +#define CM_DIV_M3_DPLL_PER 0x4a008154
> +#define CM_DIV_H11_DPLL_PER 0x4a008158
> +#define CM_DIV_H12_DPLL_PER 0x4a00815c
> +#define CM_DIV_H14_DPLL_PER 0x4a008164
> +#define CM_SSC_DELTAMSTEP_DPLL_PER 0x4a008168
> +#define CM_SSC_MODFREQDIV_DPLL_PER 0x4a00816c
> +#define CM_CLKMODE_DPLL_USB 0x4a008180
> +#define CM_IDLEST_DPLL_USB 0x4a008184
> +#define CM_AUTOIDLE_DPLL_USB 0x4a008188
> +#define CM_CLKSEL_DPLL_USB 0x4a00818c
> +#define CM_DIV_M2_DPLL_USB 0x4a008190
> +#define CM_SSC_DELTAMSTEP_DPLL_USB 0x4a0081a8
> +#define CM_SSC_MODFREQDIV_DPLL_USB 0x4a0081ac
> +#define CM_CLKDCOLDO_DPLL_USB 0x4a0081b4
> +#define CM_CLKMODE_DPLL_UNIPRO2 0x4a0081c0
> +#define CM_IDLEST_DPLL_UNIPRO2 0x4a0081c4
> +#define CM_AUTOIDLE_DPLL_UNIPRO2 0x4a0081c8
> +#define CM_CLKSEL_DPLL_UNIPRO2 0x4a0081cc
> +#define CM_DIV_M2_DPLL_UNIPRO2 0x4a0081d0
> +#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO2 0x4a0081e8
> +#define CM_SSC_MODFREQDIV_DPLL_UNIPRO2 0x4a0081ec
> +#define CM_CLKDCOLDO_DPLL_UNIPRO2 0x4a0081f4
> +#define CM_CLKMODE_DPLL_UNIPRO1 0x4a008200
> +#define CM_IDLEST_DPLL_UNIPRO1 0x4a008204
> +#define CM_AUTOIDLE_DPLL_UNIPRO1 0x4a008208
> +#define CM_CLKSEL_DPLL_UNIPRO1 0x4a00820c
> +#define CM_DIV_M2_DPLL_UNIPRO1 0x4a008210
> +#define CM_SSC_DELTAMSTEP_DPLL_UNIPRO1 0x4a008228
> +#define CM_SSC_MODFREQDIV_DPLL_UNIPRO1 0x4a00822c
> +#define CM_CLKDCOLDO_DPLL_UNIPRO1 0x4a008234
> +
> +/* CORE_CM_CORE Registers */
> +#define CM_L3MAIN1_CLKSTCTRL 0x4a008700
> +#define CM_L3MAIN1_DYNAMICDEP 0x4a008708
> +#define CM_L3MAIN1_L3_MAIN_1_CLKCTRL 0x4a008720
> +#define CM_L3MAIN2_CLKSTCTRL 0x4a008800
> +#define CM_L3MAIN2_DYNAMICDEP 0x4a008808
> +#define CM_L3MAIN2_L3_MAIN_2_CLKCTRL 0x4a008820
> +#define CM_L3MAIN2_GPMC_CLKCTRL 0x4a008828
> +#define CM_L3MAIN2_OCMC_RAM_CLKCTRL 0x4a008830
> +#define CM_IPU_CLKSTCTRL 0x4a008900
> +#define CM_IPU_STATICDEP 0x4a008904
> +#define CM_IPU_DYNAMICDEP 0x4a008908
> +#define CM_IPU_IPU_CLKCTRL 0x4a008920
> +#define CM_DMA_CLKSTCTRL 0x4a008a00
> +#define CM_DMA_STATICDEP 0x4a008a04
> +#define CM_DMA_DYNAMICDEP 0x4a008a08
> +#define CM_DMA_DMA_SYSTEM_CLKCTRL 0x4a008a20
> +#define CM_EMIF_CLKSTCTRL 0x4a008b00
> +#define CM_EMIF_DMM_CLKCTRL 0x4a008b20
> +#define CM_EMIF_EMIF_OCP_FW_CLKCTRL 0x4a008b28
> +#define CM_EMIF_EMIF1_CLKCTRL 0x4a008b30
> +#define CM_EMIF_EMIF2_CLKCTRL 0x4a008b38
> +#define CM_EMIF_EMIF_DLL_CLKCTRL 0x4a008b40
> +#define CM_C2C_CLKSTCTRL 0x4a008c00
> +#define CM_C2C_STATICDEP 0x4a008c04
> +#define CM_C2C_DYNAMICDEP 0x4a008c08
> +#define CM_C2C_C2C_CLKCTRL 0x4a008c20
> +#define CM_C2C_MODEM_ICR_CLKCTRL 0x4a008c28
> +#define CM_C2C_C2C_OCP_FW_CLKCTRL 0x4a008c30
> +#define CM_L4CFG_CLKSTCTRL 0x4a008d00
> +#define CM_L4CFG_DYNAMICDEP 0x4a008d08
> +#define CM_L4CFG_L4_CFG_CLKCTRL 0x4a008d20
> +#define CM_L4CFG_SPINLOCK_CLKCTRL 0x4a008d28
> +#define CM_L4CFG_MAILBOX_CLKCTRL 0x4a008d30
> +#define CM_L4CFG_SAR_ROM_CLKCTRL 0x4a008d38
> +#define CM_L4CFG_OCP2SCP2_CLKCTRL 0x4a008d40
> +#define CM_L3INSTR_CLKSTCTRL 0x4a008e00
> +#define CM_L3INSTR_L3_MAIN_3_CLKCTRL 0x4a008e20
> +#define CM_L3INSTR_L3_INSTR_CLKCTRL 0x4a008e28
> +#define CM_L3INSTR_OCP_WP_NOC_CLKCTRL 0x4a008e40
> +#define CM_L3INSTR_DLL_AGING_CLKCTRL 0x4a008e48
> +#define CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL 0x4a008e50
> +
> +/* L4PER_CM_CORE Registers offsets*/
> +#define CM_L4PER_DYNAMICDEP_OFT 0x08
> +#define CM_L4PER_TIMER10_CLKCTRL_OFT 0x28
> +#define CM_L4PER_TIMER11_CLKCTRL_OFT 0x30
> +#define CM_L4PER_TIMER2_CLKCTRL_OFT 0x38
> +#define CM_L4PER_TIMER3_CLKCTRL_OFT 0x40
> +#define CM_L4PER_TIMER4_CLKCTRL_OFT 0x48
> +#define CM_L4PER_TIMER9_CLKCTRL_OFT 0x50
> +#define CM_L4PER_ELM_CLKCTRL_OFT 0x58
> +#define CM_L4PER_GPIO2_CLKCTRL_OFT 0x60
> +#define CM_L4PER_GPIO3_CLKCTRL_OFT 0x68
> +#define CM_L4PER_GPIO4_CLKCTRL_OFT 0x70
> +#define CM_L4PER_GPIO5_CLKCTRL_OFT 0x78
> +#define CM_L4PER_GPIO6_CLKCTRL_OFT 0x80
> +#define CM_L4PER_HDQ1W_CLKCTRL_OFT 0x88
> +#define CM_L4PER_I2C1_CLKCTRL_OFT 0xa0
> +#define CM_L4PER_I2C2_CLKCTRL_OFT 0xa8
> +#define CM_L4PER_I2C3_CLKCTRL_OFT 0xb0
> +#define CM_L4PER_I2C4_CLKCTRL_OFT 0xb8
> +#define CM_L4PER_L4_PER_CLKCTRL_OFT 0xc0
> +#define CM_L4PER_MCSPI1_CLKCTRL_OFT 0xf0
> +#define CM_L4PER_MCSPI2_CLKCTRL_OFT 0xf8
> +#define CM_L4PER_MCSPI3_CLKCTRL_OFT 0x100
> +#define CM_L4PER_MCSPI4_CLKCTRL_OFT 0x108
> +#define CM_L4PER_GPIO7_CLKCTRL_OFT 0x110
> +#define CM_L4PER_GPIO8_CLKCTRL_OFT 0x118
> +#define CM_L4PER_MMC3_CLKCTRL_OFT 0x120
> +#define CM_L4PER_MMC4_CLKCTRL_OFT 0x128
> +#define CM_L4PER_SLIMBUS2_CLKCTRL_OFT 0x138
> +#define CM_L4PER_UART1_CLKCTRL_OFT 0x140
> +#define CM_L4PER_UART2_CLKCTRL_OFT 0x148
> +#define CM_L4PER_UART3_CLKCTRL_OFT 0x150
> +#define CM_L4PER_UART4_CLKCTRL_OFT 0x158
> +#define CM_L4PER_MMC5_CLKCTRL_OFT 0x160
> +#define CM_L4PER_I2C5_CLKCTRL_OFT 0x168
> +#define CM_L4PER_UART5_CLKCTRL_OFT 0x170
> +#define CM_L4PER_UART6_CLKCTRL_OFT 0x178
> +#define CM_L4SEC_CLKSTCTRL_OFT 0x180
> +#define CM_L4SEC_STATICDEP_OFT 0x184
> +#define CM_L4SEC_DYNAMICDEP_OFT 0x188
> +#define CM_L4SEC_AES1_CLKCTRL_OFT 0x1a0
> +#define CM_L4SEC_AES2_CLKCTRL_OFT 0x1a8
> +#define CM_L4SEC_DES3DES_CLKCTRL_OFT 0x1b0
> +#define CM_L4SEC_FPKA_OFT 0x1b8
> +#define CM_L4SEC_RNG_CLKCTRL_OFT 0x1c0
> +#define CM_L4SEC_SHA2MD5_CLKCTRL_OFT 0x1c8
> +#define CM_L4SEC_DMA_CRYPTO_CLKCTRL_OFT 0x1d8
> +
> +/* L3INIT_CM_CORE Registers offsets */
> +#define CM_L3INIT_STATICDEP_OFT 0x04
> +#define CM_L3INIT_DYNAMICDEP_OFT 0x08
> +#define CM_L3INIT_MMC1_CLKCTRL_OFT 0x28
> +#define CM_L3INIT_MMC2_CLKCTRL_OFT 0x30
> +#define CM_L3INIT_HSI_CLKCTRL_OFT 0x38
> +#define CM_L3INIT_UNIPRO2_CLKCTRL_OFT 0x40
> +#define CM_L3INIT_MPHY_UNIPRO2_CLKCTRL_OFT 0x48
> +#define CM_L3INIT_USB_HOST_HS_CLKCTRL_OFT 0x58
> +#define CM_L3INIT_USB_TLL_HS_CLKCTRL_OFT 0x68
> +#define CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFT 0x78
> +#define CM_L3INIT_SATA_CLKCTRL_OFT 0x88
> +#define CM_L3INIT_OCP2SCP1_CLKCTRL_OFT 0xe0
> +#define CM_L3INIT_OCP2SCP3_CLKCTRL_OFT 0xe8
> +#define CM_L3INIT_USB_OTG_SS_CLKCTRL_OFT 0xf0
> +
> +/* CAM_CM_CORE Registers offsets */
> +#define CM_CAM_STATICDEP_OFT 0x04
> +#define CM_CAM_DYNAMICDEP_OFT 0x08
> +#define CM_CAM_ISS_CLKCTRL_OFT 0x20
> +#define CM_CAM_FDIF_CLKCTRL_OFT 0x28
> +#define CM_CAM_CAL_CLKCTRL_OFT 0x30
> +
> +/* DSS_CM_CORE Registers offsets */
> +#define CM_DSS_STATICDEP_OFT 0x04
> +#define CM_DSS_DYNAMICDEP_OFT 0x08
> +#define CM_DSS_DSS_CLKCTRL_OFT 0x20
> +#define CM_DSS_BB2D_CLKCTRL_OFT 0x30 /* For rev. 2 */
> +
> +/* GPU_CM_CORE Registers offsets */
> +#define CM_GPU_STATICDEP_OFT 0x04
> +#define CM_GPU_DYNAMICDEP_OFT 0x08
> +#define CM_GPU_GPU_CLKCTRL_OFT 0x20
> +
> +#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-devices.h b/arch/arm/mach-omap/include/mach/omap5-devices.h
> new file mode 100644
> index 0000000..adef686
> --- /dev/null
> +++ b/arch/arm/mach-omap/include/mach/omap5-devices.h
> @@ -0,0 +1,21 @@
> +#ifndef __MACH_OMAP5_DEVICES_H
> +#define __MACH_OMAP5_DEVICES_H
> +
> +#include <driver.h>
> +#include <sizes.h>
> +#include <mach/devices.h>
> +#include <mach/omap5-silicon.h>
> +#include <mach/omap_hsmmc.h>
> +
> +static inline struct device_d *omap54xx_add_uart3(void)
> +{
> + return omap_add_uart(2, OMAP54XX_UART3_BASE);
> +}
> +
> +static inline struct device_d *omap54xx_add_mmc1(struct omap_hsmmc_platform_data *pdata)
> +{
> + return add_generic_device("omap5-hsmmc", 0, NULL,
> + OMAP54XX_MMC1_BASE, SZ_4K, IORESOURCE_MEM, pdata);
> +}
> +
> +#endif /* __MACH_OMAP5_DEVICES_H */
> 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..4e2b3fb
> --- /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 0x00
> +#define CORE_HWINFO 0x04
> +#define CORE_SYSCONFIG 0x10
> +#define EMMC_CLK 0x40
> +#define EMMC_CMD 0x42
> +#define EMMC_DATA0 0x44
> +#define EMMC_DATA1 0x46
> +#define EMMC_DATA2 0x48
> +#define EMMC_DATA3 0x4a
> +#define EMMC_DATA4 0x4c
> +#define EMMC_DATA5 0x4e
> +#define EMMC_DATA6 0x50
> +#define EMMC_DATA7 0x52
> +#define C2C_CLKOUT0 0x54
> +#define C2C_CLKOUT1 0x56
> +#define C2C_CLKIN0 0x58
> +#define C2C_CLKIN1 0x5a
> +#define C2C_DATAIN0 0x5c
> +#define C2C_DATAIN1 0x5e
> +#define C2C_DATAIN2 0x60
> +#define C2C_DATAIN3 0x62
> +#define C2C_DATAIN4 0x64
> +#define C2C_DATAIN5 0x66
> +#define C2C_DATAIN6 0x68
> +#define C2C_DATAIN7 0x6a
> +#define C2C_DATAOUT0 0x6c
> +#define C2C_DATAOUT1 0x6e
> +#define C2C_DATAOUT2 0x70
> +#define C2C_DATAOUT3 0x72
> +#define C2C_DATAOUT4 0x74
> +#define C2C_DATAOUT5 0x76
> +#define C2C_DATAOUT6 0x78
> +#define C2C_DATAOUT7 0x7a
> +#define C2C_DATA8 0x7c
> +#define C2C_DATA9 0x7e
> +#define C2C_DATA10 0x80
> +#define C2C_DATA11 0x82
> +#define C2C_DATA12 0x84
> +#define C2C_DATA13 0x86
> +#define C2C_DATA14 0x88
> +#define C2C_DATA15 0x8a
> +#define LLIA_WAKEREQOUT 0x8c
> +#define LLIB_WAKEREQOUT 0x8e
> +#define HSI1_ACREADY 0x90
> +#define HSI1_CAREADY 0x92
> +#define HSI1_ACWAKE 0x94
> +#define HSI1_CAWAKE 0x96
> +#define HSI1_ACFLAG 0x98
> +#define HSI1_ACDATA 0x9a
> +#define HSI1_CAFLAG 0x9c
> +#define HSI1_CADATA 0x9e
> +#define UART1_TX 0xa0
> +#define UART1_CTS 0xa2
> +#define UART1_RX 0xa4
> +#define UART1_RTS 0xa6
> +#define HSI2_CAREADY 0xa8
> +#define HSI2_ACREADY 0xaa
> +#define HSI2_CAWAKE 0xac
> +#define HSI2_ACWAKE 0xae
> +#define HSI2_CAFLAG 0xb0
> +#define HSI2_CADATA 0xb2
> +#define HSI2_ACFLAG 0xb4
> +#define HSI2_ACDATA 0xb6
> +#define UART2_RTS 0xb8
> +#define UART2_CTS 0xba
> +#define UART2_RX 0xbc
> +#define UART2_TX 0xbe
> +#define USBB1_HSIC_STROBE 0xc0
> +#define USBB1_HSIC_DATA 0xc2
> +#define USBB2_HSIC_STROBE 0xc4
> +#define USBB2_HSIC_DATA 0xc6
> +#define TIMER10_PWM_EVT 0xc8
> +#define DSIPORTA_TE0 0xca
> +#define DSIPORTA_LANE0X 0xcc
> +#define DSIPORTA_LANE0Y 0xce
> +#define DSIPORTA_LANE1X 0xd0
> +#define DSIPORTA_LANE1Y 0xd2
> +#define DSIPORTA_LANE2X 0xd4
> +#define DSIPORTA_LANE2Y 0xd6
> +#define DSIPORTA_LANE3X 0xd8
> +#define DSIPORTA_LANE3Y 0xda
> +#define DSIPORTA_LANE4X 0xdc
> +#define DSIPORTA_LANE4Y 0xde
> +#define DSIPORTC_LANE0X 0xe0
> +#define DSIPORTC_LANE0Y 0xe2
> +#define DSIPORTC_LANE1X 0xe4
> +#define DSIPORTC_LANE1Y 0xe6
> +#define DSIPORTC_LANE2X 0xe8
> +#define DSIPORTC_LANE2Y 0xea
> +#define DSIPORTC_LANE3X 0xec
> +#define DSIPORTC_LANE3Y 0xee
> +#define DSIPORTC_LANE4X 0xf0
> +#define DSIPORTC_LANE4Y 0xf2
> +#define DSIPORTC_TE0 0xf4
> +#define TIMER9_PWM_EVT 0xf6
> +#define I2C4_SCL 0xf8
> +#define I2C4_SDA 0xfa
> +#define MCSPI2_CLK 0xfc
> +#define MCSPI2_SIMO 0xfe
> +#define MCSPI2_SOMI 0x100
> +#define MCSPI2_CS0 0x102
> +#define RFBI_DATA15 0x104
> +#define RFBI_DATA14 0x106
> +#define RFBI_DATA13 0x108
> +#define RFBI_DATA12 0x10a
> +#define RFBI_DATA11 0x10c
> +#define RFBI_DATA10 0x10e
> +#define RFBI_DATA9 0x110
> +#define RFBI_DATA8 0x112
> +#define RFBI_DATA7 0x114
> +#define RFBI_DATA6 0x116
> +#define RFBI_DATA5 0x118
> +#define RFBI_DATA4 0x11a
> +#define RFBI_DATA3 0x11c
> +#define RFBI_DATA2 0x11e
> +#define RFBI_DATA1 0x120
> +#define RFBI_DATA0 0x122
> +#define RFBI_WE 0x124
> +#define RFBI_CS0 0x126
> +#define RFBI_A0 0x128
> +#define RFBI_RE 0x12a
> +#define RFBI_HSYNC0 0x12c
> +#define RFBI_TE_VSYNC0 0x12e
> +#define GPIO6_182 0x130
> +#define GPIO6_183 0x132
> +#define GPIO6_184 0x134
> +#define GPIO6_185 0x136
> +#define GPIO6_186 0x138
> +#define GPIO6_187 0x13a
> +#define HDMI_CEC 0x13c
> +#define HDMI_HPD 0x13e
> +#define HDMI_DDC_SCL 0x140
> +#define HDMI_DDC_SDA 0x142
> +#define CSIPORTC_LANE0X 0x144
> +#define CSIPORTC_LANE0Y 0x146
> +#define CSIPORTC_LANE1X 0x148
> +#define CSIPORTC_LANE1Y 0x14a
> +#define CSIPORTB_LANE0X 0x14c
> +#define CSIPORTB_LANE0Y 0x14e
> +#define CSIPORTB_LANE1X 0x150
> +#define CSIPORTB_LANE1Y 0x152
> +#define CSIPORTB_LANE2X 0x154
> +#define CSIPORTB_LANE2Y 0x156
> +#define CSIPORTA_LANE0X 0x158
> +#define CSIPORTA_LANE0Y 0x15a
> +#define CSIPORTA_LANE1X 0x15c
> +#define CSIPORTA_LANE1Y 0x15e
> +#define CSIPORTA_LANE2X 0x160
> +#define CSIPORTA_LANE2Y 0x162
> +#define CSIPORTA_LANE3X 0x164
> +#define CSIPORTA_LANE3Y 0x166
> +#define CSIPORTA_LANE4X 0x168
> +#define CSIPORTA_LANE4Y 0x16a
> +#define CAM_SHUTTER 0x16c
> +#define CAM_STROBE 0x16e
> +#define CAM_GLOBALRESET 0x170
> +#define TIMER11_PWM_EVT 0x172
> +#define TIMER5_PWM_EVT 0x174
> +#define TIMER6_PWM_EVT 0x176
> +#define TIMER8_PWM_EVT 0x178
> +#define I2C3_SCL 0x17a
> +#define I2C3_SDA 0x17c
> +#define GPIO8_233 0x17e
> +#define GPIO8_234 0x180
> +#define ABE_CLKS 0x182
> +#define ABEDMIC_DIN1 0x184
> +#define ABEDMIC_DIN2 0x186
> +#define ABEDMIC_DIN3 0x188
> +#define ABEDMIC_CLK1 0x18a
> +#define ABEDMIC_CLK2 0x18c
> +#define ABEDMIC_CLK3 0x18e
> +#define ABESLIMBUS1_CLOCK 0x190
> +#define ABESLIMBUS1_DATA 0x192
> +#define ABEMCBSP2_DR 0x194
> +#define ABEMCBSP2_DX 0x196
> +#define ABEMCBSP2_FSX 0x198
> +#define ABEMCBSP2_CLKX 0x19a
> +#define ABEMCPDM_UL_DATA 0x19c
> +#define ABEMCPDM_DL_DATA 0x19e
> +#define ABEMCPDM_FRAME 0x1a0
> +#define ABEMCPDM_LB_CLK 0x1a2
> +#define WLSDIO_CLK 0x1a4
> +#define WLSDIO_CMD 0x1a6
> +#define WLSDIO_DATA0 0x1a8
> +#define WLSDIO_DATA1 0x1aa
> +#define WLSDIO_DATA2 0x1ac
> +#define WLSDIO_DATA3 0x1ae
> +#define UART5_RX 0x1b0
> +#define UART5_TX 0x1b2
> +#define UART5_CTS 0x1b4
> +#define UART5_RTS 0x1b6
> +#define I2C2_SCL 0x1b8
> +#define I2C2_SDA 0x1ba
> +#define MCSPI1_CLK 0x1bc
> +#define MCSPI1_SOMI 0x1be
> +#define MCSPI1_SIMO 0x1c0
> +#define MCSPI1_CS0 0x1c2
> +#define MCSPI1_CS1 0x1c4
> +#define I2C5_SCL 0x1c6
> +#define I2C5_SDA 0x1c8
> +#define PERSLIMBUS2_CLOCK 0x1ca /* GPIO5_145 in rev. 2 */
> +#define PERSLIMBUS2_DATA 0x1cc /* GPIO5_146 in rev. 2 */
> +#define UART6_TX 0x1ce
> +#define UART6_RX 0x1d0
> +#define UART6_CTS 0x1d2
> +#define UART6_RTS 0x1d4
> +#define UART3_CTS_RCTX 0x1d6
> +#define UART3_RTS_IRSD 0x1d8
> +#define UART3_TX_IRTX 0x1da
> +#define UART3_RX_IRRX 0x1dc
> +#define USBB3_HSIC_STROBE 0x1de
> +#define USBB3_HSIC_DATA 0x1e0
> +#define SDCARD_CLK 0x1e2
> +#define SDCARD_CMD 0x1e4
> +#define SDCARD_DATA2 0x1e6
> +#define SDCARD_DATA3 0x1e8
> +#define SDCARD_DATA0 0x1ea
> +#define SDCARD_DATA1 0x1ec
> +#define USBD0_HS_DP 0x1ee
> +#define USBD0_HS_DM 0x1f0
> +#define I2C1_PMIC_SCL 0x1f2
> +#define I2C1_PMIC_SDA 0x1f4
> +#define USBD0_SS_RX 0x1f6
> +
> +/* CTRL_MODULE_WKUP_PAD Registers offsets */
> +/* Base address is 0x4ae0c800 */
> +#define WKUP_REVISION 0x00
> +#define WKUP_HWINFO 0x04
> +#define WKUP_SYSCONFIG 0x10
> +#define LLIA_WAKEREQIN 0x40
> +#define LLIB_WAKEREQIN 0x42
> +#define DRM_EMU0 0x44
> +#define DRM_EMU1 0x46
> +#define JTAG_NTRST 0x48
> +#define JTAG_TCK 0x4a
> +#define JTAG_RTCK 0x4c
> +#define JTAG_TMSC 0x4e
> +#define JTAG_TDI 0x50
> +#define JTAG_TDO 0x52
> +#define SYS_32K 0x54
> +#define FREF_CLK_IOREQ 0x56
> +#define FREF_CLK0_OUT 0x58
> +#define FREF_CLK1_OUT 0x5a
> +#define FREF_CLK2_OUT 0x5c
> +#define FREF_CLK2_REQ 0x5e
> +#define FREF_CLK1_REQ 0x60
> +#define SYS_NRESPWRON 0x62
> +#define SYS_NRESWARM 0x64
> +#define SYS_PWR_REQ 0x66
> +#define SYS_NIRQ1 0x68
> +#define SYS_NIRQ2 0x6a
> +#define SR_PMIC_SCL 0x6c
> +#define SR_PMIC_SDA 0x6e
> +#define SYS_BOOT0 0x70
> +#define SYS_BOOT1 0x72
> +#define SYS_BOOT2 0x74
> +#define SYS_BOOT3 0x76
> +#define SYS_BOOT4 0x78
> +#define SYS_BOOT5 0x7a
> +
> +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..b29242d
> --- /dev/null
> +++ b/arch/arm/mach-omap/include/mach/omap5-silicon.h
> @@ -0,0 +1,235 @@
> +/*
> + * (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
> +
> +/*
> + * 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..6cba922
> --- /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 = 0x4ae07800;
> + u32 l4per_base = 0x4a009400;
> + u32 l3init_base = 0x4a009300;
> + u32 cam_base = 0x4a009000;
> + u32 dss_base = 0x4a009100;
> + u32 gpu_base = 0x4a009200;
> +
> + if (rev == OMAP5430_ES2_0 || rev == OMAP5432_ES2_0) {
> + wkup_base = 0x4ae07900;
> + l4per_base = 0x4a009000;
> + l3init_base = 0x4a009600;
> + cam_base = 0x4a009300;
> + dss_base = 0x4a009400;
> + gpu_base = 0x4a009500;
> + }
> +
> + /* 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..11bb068
> --- /dev/null
> +++ b/arch/arm/mach-omap/omap5_generic.c
> @@ -0,0 +1,509 @@
> +/*
> + * (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 <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.
> diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
> index b379c31..e923dc1 100644
> --- a/drivers/mci/omap_hsmmc.c
> +++ b/drivers/mci/omap_hsmmc.c
> @@ -71,6 +71,10 @@ static struct omap_mmc_driver_data omap4_data = {
> .reg_ofs = 0x100,
> };
>
> +static struct omap_mmc_driver_data omap5_data = {
> + .reg_ofs = 0x100,
> +};
> +
> /*
> * OMAP HS MMC Bit definitions
> */
> @@ -621,6 +625,9 @@ static struct platform_device_id omap_mmc_ids[] = {
> .name = "omap4-hsmmc",
> .driver_data = (unsigned long)&omap4_data,
> }, {
> + .name = "omap5-hsmmc",
> + .driver_data = (unsigned long)&omap5_data,
> + }, {
> /* sentinel */
> },
> };
> --
> 1.8.1.5
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 9:09 ` Uladzimir Bely
2013-04-25 11:05 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2013-04-25 11:58 ` Jan Lübbe
2013-04-25 12:42 ` Uladzimir Bely
[not found] ` <517A57F8.8020805@sam-solutions.net>
2013-04-25 13:31 ` menon.nishanth
2 siblings, 2 replies; 13+ messages in thread
From: Jan Lübbe @ 2013-04-25 11:58 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: barebox
On Thu, 2013-04-25 at 12:09 +0300, Uladzimir Bely wrote:
> 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 "
Please use defaultenv-2.
> 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
Isn't the OMAP5 sEVM from TI?
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 11:58 ` Jan Lübbe
@ 2013-04-25 12:42 ` Uladzimir Bely
2013-04-25 20:47 ` Sascha Hauer
2013-04-26 8:31 ` Jan Lübbe
[not found] ` <517A57F8.8020805@sam-solutions.net>
1 sibling, 2 replies; 13+ messages in thread
From: Uladzimir Bely @ 2013-04-25 12:42 UTC (permalink / raw)
To: Jan Lübbe; +Cc: barebox
25.04.2013 14:58, Jan Lübbe пишет:
> On Thu, 2013-04-25 at 12:09 +0300, Uladzimir Bely wrote:
>> 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 "
>
> Please use defaultenv-2.
>
I'm not too familiar with barebox's defaultenv/defaultenv-2. Our work on
omap5 was based mostly on omap5 code from U-Boot and omap4 code from barebox.
Mostly, I used pcm049 as an example of omap4-based board in barebox. So
arch/arm/boards/omap5_sevm/env/config looks like this one, but includes
only most necessary thinks to load to barebox prompt.
Please, give me a hint, which board can be used as an example of using
defaultenv-2, maybe I'll do something.
>> 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
>
> Isn't the OMAP5 sEVM from TI?
>
We worked with OMAP5-based board, produced by Phytec (Phytec phyCORE-OMAP5),
but, as I have mentioned above, code was partially ported from U-Boot's
OMAP5-sevm board. I'll correct it.
--
With regards,
Uladzimir Bely.
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 9:09 ` Uladzimir Bely
2013-04-25 11:05 ` Jean-Christophe PLAGNIOL-VILLARD
2013-04-25 11:58 ` Jan Lübbe
@ 2013-04-25 13:31 ` menon.nishanth
2 siblings, 0 replies; 13+ messages in thread
From: menon.nishanth @ 2013-04-25 13:31 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: U-Boot Version 2 (barebox)
Hi,
On Thu, Apr 25, 2013 at 4:09 AM, Uladzimir Bely
<u.bely@sam-solutions.com> wrote:
> Since commit
> 8bafdc1 ARM i.MX28: make chip reset via reset pin work again
>
> 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.
>
> It's an optimized and cleaned up version of previous patch.
Our upstream kernel support will be DT-only :). Further, OMAP5 ES2.0
SEVM does not exist. ES1.0 is few initial samples for development
purposes - there are drastic differences in base addresses etc for
OMAP5 ES2.0.
If providing support for ES2.0, please use uEVM as reference platform.
ES1.0 was meant to be in-development processor - no longer produced
and definitely meant to be replaced with ES2.0.
<snip>
Regards,
Nishanth Menon
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 12:42 ` Uladzimir Bely
@ 2013-04-25 20:47 ` Sascha Hauer
2013-04-26 8:31 ` Jan Lübbe
1 sibling, 0 replies; 13+ messages in thread
From: Sascha Hauer @ 2013-04-25 20:47 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: barebox
On Thu, Apr 25, 2013 at 03:42:10PM +0300, Uladzimir Bely wrote:
>
> I'm not too familiar with barebox's defaultenv/defaultenv-2. Our work on
> omap5 was based mostly on omap5 code from U-Boot and omap4 code from barebox.
> Mostly, I used pcm049 as an example of omap4-based board in barebox. So
> arch/arm/boards/omap5_sevm/env/config looks like this one, but includes
> only most necessary thinks to load to barebox prompt.
>
> Please, give me a hint, which board can be used as an example of using
> defaultenv-2, maybe I'll do something.
>
See for example the i.MX53 loco (aka qsb) board:
arch/arm/boards/freescale-mx53-loco/env/
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
2013-04-25 12:42 ` Uladzimir Bely
2013-04-25 20:47 ` Sascha Hauer
@ 2013-04-26 8:31 ` Jan Lübbe
1 sibling, 0 replies; 13+ messages in thread
From: Jan Lübbe @ 2013-04-26 8:31 UTC (permalink / raw)
To: Barebox List
On Thu, 2013-04-25 at 15:42 +0300, Uladzimir Bely wrote:
> 25.04.2013 14:58, Jan Lübbe пишет:
> > On Thu, 2013-04-25 at 12:09 +0300, Uladzimir Bely wrote:
> >> 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 "
> >
> > Please use defaultenv-2.
> >
>
> I'm not too familiar with barebox's defaultenv/defaultenv-2. Our work on
> omap5 was based mostly on omap5 code from U-Boot and omap4 code from barebox.
> Mostly, I used pcm049 as an example of omap4-based board in barebox. So
> arch/arm/boards/omap5_sevm/env/config looks like this one, but includes
> only most necessary thinks to load to barebox prompt.
>
> Please, give me a hint, which board can be used as an example of using
> defaultenv-2, maybe I'll do something.
Take a look at arch/arm/boards/beagle (omap3) or arch/arm/boards/panda
(omap4).
> >> 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
> >
> > Isn't the OMAP5 sEVM from TI?
> >
>
> We worked with OMAP5-based board, produced by Phytec (Phytec phyCORE-OMAP5),
> but, as I have mentioned above, code was partially ported from U-Boot's
> OMAP5-sevm board. I'll correct it.
The names should be consistent and match the hardware the new code you
are adding in this patch is intended for.
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] ARM: OMAP5 processors support
[not found] ` <517A57F8.8020805@sam-solutions.net>
@ 2013-04-26 10:54 ` Jan Lübbe
2013-04-26 10:59 ` Uladzimir Bely
0 siblings, 1 reply; 13+ messages in thread
From: Jan Lübbe @ 2013-04-26 10:54 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: Barebox List
On Fri, 2013-04-26 at 13:33 +0300, Uladzimir Bely wrote:
> >> 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 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
> >
> > Isn't the OMAP5 sEVM from TI?
> >
>
> This question is more complicated. We use Phytec phyCORE OMAP4 board, but
> with OMAP5 SOC installed. We used omap5_sevm with number 3777 which already
> exists in arch/arm/tools. Kernel also was compiled for this mach-type.
So the board which you use for development is not generally available.
Maybe you could call it something like "MACH_PCM049_OMAP5" or
"MACH_PHYCORE_OMAP5_EVAL"...?
> As I understand, new board (Phytec phyCORE OMAP5) must be added to this file
> (http://www.arm.linux.org.uk/developer/machines/download.php) first, and barebox
> will use this updated file for this board too. Am I right? How can I add new
> board here correctly?
To request a new machine ID, use
http://www.arm.linux.org.uk/developer/machines/?action=new
Note that new legacy (non-Device-Tree) boards are no longer accepted
into the kernel! For DT-only boards no machine ID is needed at all.
Regards,
Jan Lübbe
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Re: [PATCH] ARM: OMAP5 processors support
2013-04-26 10:54 ` Jan Lübbe
@ 2013-04-26 10:59 ` Uladzimir Bely
2013-04-26 21:58 ` Sascha Hauer
0 siblings, 1 reply; 13+ messages in thread
From: Uladzimir Bely @ 2013-04-26 10:59 UTC (permalink / raw)
To: barebox, Jan Lübbe
As an example, are there any DT-only (without machine ID) boards in barebox?
--
With regards,
Uladzimir Bely.
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Re: [PATCH] ARM: OMAP5 processors support
2013-04-26 10:59 ` Uladzimir Bely
@ 2013-04-26 21:58 ` Sascha Hauer
0 siblings, 0 replies; 13+ messages in thread
From: Sascha Hauer @ 2013-04-26 21:58 UTC (permalink / raw)
To: Uladzimir Bely; +Cc: barebox
On Fri, Apr 26, 2013 at 01:59:22PM +0300, Uladzimir Bely wrote:
> As an example, are there any DT-only (without machine ID) boards in barebox?
basically you just don't have to call armlinux_set_architecture()
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2013-04-26 21:58 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <014261>
2013-04-24 10:33 ` [PATCH] ARM: OMAP5 processors support Uladzimir Bely
2013-04-24 10:51 ` Uladzimir Bely
2013-04-24 20:11 ` Sascha Hauer
2013-04-25 9:09 ` Uladzimir Bely
2013-04-25 11:05 ` Jean-Christophe PLAGNIOL-VILLARD
2013-04-25 11:58 ` Jan Lübbe
2013-04-25 12:42 ` Uladzimir Bely
2013-04-25 20:47 ` Sascha Hauer
2013-04-26 8:31 ` Jan Lübbe
[not found] ` <517A57F8.8020805@sam-solutions.net>
2013-04-26 10:54 ` Jan Lübbe
2013-04-26 10:59 ` Uladzimir Bely
2013-04-26 21:58 ` Sascha Hauer
2013-04-25 13:31 ` menon.nishanth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox