summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-01-09 10:29:08 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-01-09 10:29:08 +0100
commitfca2d7947016af0fb9b1daf9d4c037c83ec9aea9 (patch)
treef058fbeaaed1987809cb31ce4291315ccc60d8b1 /arch
parentb0ab3c220fad2b60272209649e738ed72a487b5f (diff)
parent2c8272e8f3ba80e6b292ee6a640487468b95716b (diff)
downloadbarebox-fca2d7947016af0fb9b1daf9d4c037c83ec9aea9.tar.gz
barebox-fca2d7947016af0fb9b1daf9d4c037c83ec9aea9.tar.xz
Merge branch 'for-next/mxs'
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/Makefile2
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/cfa10036.c27
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/env/boot/mmc-ext34
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/hwdetect.c96
-rw-r--r--arch/arm/boards/crystalfontz-cfa10036/hwdetect.h22
-rw-r--r--arch/arm/configs/cfa10036_defconfig3
-rw-r--r--arch/arm/mach-mxs/Kconfig3
7 files changed, 153 insertions, 4 deletions
diff --git a/arch/arm/boards/crystalfontz-cfa10036/Makefile b/arch/arm/boards/crystalfontz-cfa10036/Makefile
index 75f0020c09..7e8d5e246e 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/Makefile
+++ b/arch/arm/boards/crystalfontz-cfa10036/Makefile
@@ -1 +1 @@
-obj-y += cfa10036.o
+obj-y += cfa10036.o hwdetect.o
diff --git a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
index 522d2d783d..b59dbab4a6 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
+++ b/arch/arm/boards/crystalfontz-cfa10036/cfa10036.c
@@ -26,6 +26,10 @@
#include <net.h>
#include <sizes.h>
+#include <i2c/i2c.h>
+#include <i2c/i2c-gpio.h>
+#include <i2c/at24.h>
+
#include <mach/clock.h>
#include <mach/imx-regs.h>
#include <mach/iomux-imx28.h>
@@ -38,6 +42,8 @@
#include <generated/mach-types.h>
+#include "hwdetect.h"
+
/* setup the CPU card internal signals */
static const uint32_t cfa10036_pads[] = {
/* duart */
@@ -58,6 +64,10 @@ static const uint32_t cfa10036_pads[] = {
SSP0_SCK | VE_3_3V | BITKEEPER(0),
/* MCI slot power control 1 = off */
PWM3_GPIO | VE_3_3V | GPIO_OUT | GPIO_VALUE(0),
+
+ /* i2c0 */
+ AUART0_TX_GPIO | VE_3_3V | PULLUP(1),
+ AUART0_RX_GPIO | VE_3_3V | PULLUP(1),
};
static struct mxs_mci_platform_data mci_pdata = {
@@ -67,6 +77,18 @@ static struct mxs_mci_platform_data mci_pdata = {
.f_max = 25000000,
};
+static struct i2c_board_info cfa10036_i2c_devices[] = {
+ {
+ I2C_BOARD_INFO("24c02", 0x50)
+ },
+};
+
+static struct i2c_gpio_platform_data i2c_gpio_pdata = {
+ .sda_pin = 3 * 32 + 1,
+ .scl_pin = 3 * 32 + 0,
+ .udelay = 5, /* ~100 kHz */
+};
+
static int cfa10036_mem_init(void)
{
arm_add_mem_device("ram0", IMX_MEMORY_BASE, 128 * 1024 * 1024);
@@ -97,6 +119,11 @@ static int cfa10036_devices_init(void)
add_generic_device("ocotp", 0, NULL, IMX_OCOTP_BASE, SZ_8K,
IORESOURCE_MEM, NULL);
+ i2c_register_board_info(0, cfa10036_i2c_devices, ARRAY_SIZE(cfa10036_i2c_devices));
+ add_generic_device_res("i2c-gpio", 0, NULL, 0, &i2c_gpio_pdata);
+
+ cfa10036_detect_hw();
+
return 0;
}
device_initcall(cfa10036_devices_init);
diff --git a/arch/arm/boards/crystalfontz-cfa10036/env/boot/mmc-ext3 b/arch/arm/boards/crystalfontz-cfa10036/env/boot/mmc-ext3
index b2325af1aa..5e508f95f6 100644
--- a/arch/arm/boards/crystalfontz-cfa10036/env/boot/mmc-ext3
+++ b/arch/arm/boards/crystalfontz-cfa10036/env/boot/mmc-ext3
@@ -5,6 +5,6 @@ if [ "$1" = menu ]; then
exit
fi
-global.bootm.image="/mnt/disk0.1/zImage-cfa10036"
-global.bootm.oftree="/mnt/disk0.1/oftree-cfa10036"
+global.bootm.image="/mnt/disk0.1/zImage-${global.hostname}"
+global.bootm.oftree="/mnt/disk0.1/oftree-${global.board.variant}"
global.linux.bootargs.dyn.root="root=/dev/mmcblk0p3 rootfstype=ext3 rootwait"
diff --git a/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c
new file mode 100644
index 0000000000..5eb3ca4cf7
--- /dev/null
+++ b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012 Free Electrons
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ *
+ */
+
+#include <common.h>
+
+#include <environment.h>
+#include <fcntl.h>
+#include <fs.h>
+#include <globalvar.h>
+#include <libbb.h>
+#include <magicvar.h>
+
+#include <asm/armlinux.h>
+
+enum board_type {
+ BOARD_ID_CFA10036 = 0,
+ BOARD_ID_CFA10037 = 1,
+ BOARD_ID_CFA10049 = 2,
+};
+
+struct cfa_eeprom_info {
+ u8 board_id;
+}__attribute__ ((packed));
+
+static int cfa10036_read_eeprom(const char *file, struct cfa_eeprom_info *info)
+{
+ int fd;
+ int ret;
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0) {
+ ret = fd;
+ goto err;
+ }
+
+ ret = read_full(fd, info, sizeof(*info));
+ if (ret < 0)
+ goto err_open;
+
+ ret = 0;
+
+err_open:
+ close(fd);
+err:
+ if (ret)
+ pr_err("can not read eeprom %s (%s)\n", file, strerror(ret));
+ return ret;
+}
+
+void cfa10036_detect_hw(void)
+{
+ enum board_type cfa_type;
+ struct cfa_eeprom_info info;
+ char *board_name;
+ int ret;
+
+ ret = cfa10036_read_eeprom("/dev/eeprom0", &info);
+ if (ret)
+ cfa_type = BOARD_ID_CFA10036;
+ else
+ cfa_type = info.board_id;
+
+ switch (cfa_type) {
+ case BOARD_ID_CFA10036:
+ board_name = "cfa10036";
+ break;
+ case BOARD_ID_CFA10037:
+ board_name = "cfa10037";
+ break;
+ case BOARD_ID_CFA10049:
+ board_name = "cfa10049";
+ break;
+ default:
+ pr_err("Board ID not supported\n");
+ return;
+ }
+
+ globalvar_add_simple("board.variant");
+ setenv("global.board.variant", board_name);
+ pr_info("Booting on a CFA10036 with %s\n", board_name);
+}
+
+BAREBOX_MAGICVAR_NAMED(global_board_variant, global.board.variant, "The board variant");
diff --git a/arch/arm/boards/crystalfontz-cfa10036/hwdetect.h b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.h
new file mode 100644
index 0000000000..2a5330ea17
--- /dev/null
+++ b/arch/arm/boards/crystalfontz-cfa10036/hwdetect.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 Free Electrons
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ *
+ */
+
+#ifndef __HWDETECT_H__
+#define __HWDETECT_H__
+
+void cfa10036_detect_hw(void);
+
+#endif /* __HWDETECT_H__ */
diff --git a/arch/arm/configs/cfa10036_defconfig b/arch/arm/configs/cfa10036_defconfig
index 67a0e8f290..c55d50dcd2 100644
--- a/arch/arm/configs/cfa10036_defconfig
+++ b/arch/arm/configs/cfa10036_defconfig
@@ -11,7 +11,7 @@ CONFIG_LONGHELP=y
CONFIG_HUSH_FANCY_PROMPT=y
CONFIG_CMDLINE_EDITING=y
CONFIG_AUTO_COMPLETE=y
-CONFIG_MENU=y
+CONFIG_CONSOLE_ACTIVATE_ALL=y
CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/crystalfontz-cfa10036/env"
CONFIG_DEBUG_INFO=y
@@ -35,6 +35,7 @@ CONFIG_CMD_TIMEOUT=y
CONFIG_CMD_PARTITION=y
CONFIG_CMD_GPIO=y
# CONFIG_SPI is not set
+CONFIG_I2C=y
CONFIG_MCI=y
CONFIG_MCI_STARTUP=y
CONFIG_MCI_MXS=y
diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig
index 853d81a0c4..d1bf8fcbe6 100644
--- a/arch/arm/mach-mxs/Kconfig
+++ b/arch/arm/mach-mxs/Kconfig
@@ -77,6 +77,9 @@ config MACH_MX28EVK
config MACH_CFA10036
bool "cfa-10036"
select HAVE_DEFAULT_ENVIRONMENT_NEW
+ select MXS_OCOTP
+ select I2C_GPIO
+ select EEPROM_AT24
help
Say Y here if you are using the Crystalfontz CFA-10036 module