summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-06-02 16:28:34 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2013-06-02 16:28:34 +0200
commite57a8119d11bd1c835945cb4090d036003f8d2f9 (patch)
treec58501e4c3b9a2c0c87e520c3311f72f6df2f0fd /arch
parent08f2dda59fbf1be33f45e307cdd5c98e2a4ed3c2 (diff)
parent631063fb44c10ea971ac7b4919b528634dde4b2e (diff)
downloadbarebox-e57a8119d11bd1c835945cb4090d036003f8d2f9.tar.gz
barebox-e57a8119d11bd1c835945cb4090d036003f8d2f9.tar.xz
Merge branch 'for-next/mxs'
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/hwdetect.c16
-rw-r--r--arch/arm/mach-mxs/imx.c44
2 files changed, 59 insertions, 1 deletions
diff --git a/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c
index 5eb3ca4cf7..21199d6433 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c
+++ b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c
@@ -29,6 +29,10 @@ enum board_type {
BOARD_ID_CFA10036 = 0,
BOARD_ID_CFA10037 = 1,
BOARD_ID_CFA10049 = 2,
+ BOARD_ID_CFA10055 = 3,
+ BOARD_ID_CFA10056 = 4,
+ BOARD_ID_CFA10057 = 5,
+ BOARD_ID_CFA10058 = 6,
};
struct cfa_eeprom_info {
@@ -83,6 +87,18 @@ void cfa10036_detect_hw(void)
case BOARD_ID_CFA10049:
board_name = "cfa10049";
break;
+ case BOARD_ID_CFA10055:
+ board_name = "cfa10055";
+ break;
+ case BOARD_ID_CFA10056:
+ board_name = "cfa10056";
+ break;
+ case BOARD_ID_CFA10057:
+ board_name = "cfa10057";
+ break;
+ case BOARD_ID_CFA10058:
+ board_name = "cfa10058";
+ break;
default:
pr_err("Board ID not supported\n");
return;
diff --git a/arch/arm/mach-mxs/imx.c b/arch/arm/mach-mxs/imx.c
index fcb26f73b3..5acce9376a 100644
--- a/arch/arm/mach-mxs/imx.c
+++ b/arch/arm/mach-mxs/imx.c
@@ -112,6 +112,48 @@ static void mxs_silicon_revision(void)
silicon_revision_set(product, revision);
}
+#define HW_PINCTRL_MUXSEL2 0x120
+#define HW_PINCTRL_MUXSEL3 0x130
+#define HW_PINCTRL_DOE1 0x710
+#define HW_PINCTRL_DIN1 0x610
+
+/*
+ * we are interested in the setting of:
+ * - GPIO BANK1/19: 1 = the ROM has used the following pins for boot source selection
+ * - GPIO BANK1/5: ETM enable
+ * - GPIO BANK1/3: BM3
+ * - GPIO BANK1/2: BM2
+ * - GPIO BANK1/1: BM1
+ * - GPIO BANK1/0: BM0
+ */
+static uint32_t mx23_detect_bootsource(void)
+{
+ uint32_t mux2, mux3, dir, mode;
+
+ mux3 = readl(IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL3);
+ mux2 = readl(IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL2);
+ dir = readl(IMX_IOMUXC_BASE + HW_PINCTRL_DOE1);
+
+ /* force the GPIO lines of interest to input */
+ writel(0x0008002f, IMX_IOMUXC_BASE + HW_PINCTRL_DOE1 + 8);
+ /* force the GPIO lines of interest to act as GPIO */
+ writel(0x00000cff, IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL2 + 4);
+ writel(0x000000c0, IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL3 + 4);
+
+ /* read the bootstrapping */
+ mode = readl(IMX_IOMUXC_BASE + HW_PINCTRL_DIN1) & 0x8002f;
+
+ /* restore previous settings */
+ writel(mux3, IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL3);
+ writel(mux2, IMX_IOMUXC_BASE + HW_PINCTRL_MUXSEL2);
+ writel(dir, IMX_IOMUXC_BASE + HW_PINCTRL_DOE1);
+
+ if (!(mode & (1 << 19)))
+ return 0xff; /* invalid marker */
+
+ return (mode & 0xf) | ((mode & 0x20) >> 1);
+}
+
#define MX28_REV_1_0_MODE (0x0001a7f0)
#define MX28_REV_1_2_MODE (0x00019bf0)
@@ -122,7 +164,7 @@ static void mxs_boot_save_loc(void)
uint32_t mode = 0xff;
if (cpu_is_mx23()) {
- /* not implemented yet */
+ mode = mx23_detect_bootsource();
} else if (cpu_is_mx28()) {
enum silicon_revision rev = silicon_revision_get();