Adds support for AT24 I2C EEPROM on DM646X
Signed-off-by: Chaithrika U.S <[EMAIL PROTECTED]>
---
arch/arm/mach-davinci/board-dm646x-evm.c | 59 ++++++++++++++++++++++++++++++
1 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c
b/arch/arm/mach-davinci/board-dm646x-evm.c
index 818a676..b6a2b22 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -40,6 +40,12 @@
#include <mach/serial.h>
#include <mach/i2c.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+#include <linux/i2c/at24.h>
+#include <linux/etherdevice.h>
+#include <mach/emac.h>
+
static struct davinci_uart_config davinci_evm_uart_config __initdata = {
.enabled_uarts = (1 << 0),
};
@@ -48,6 +54,58 @@ static struct davinci_board_config_kernel
davinci_evm_config[] __initdata = {
{ DAVINCI_TAG_UART, &davinci_evm_uart_config },
};
+/* Most of this EEPROM is unused, but U-Boot uses some data:
+ * - 0x7f00, 6 bytes Ethernet Address
+ * - ... newer boards may have more
+ */
+static struct at24_iface *at24_if;
+
+static int at24_setup(struct at24_iface *iface, void *context)
+{
+ DECLARE_MAC_BUF(mac_str);
+ char mac_addr[6];
+
+ at24_if = iface;
+
+ /* Read MAC addr from EEPROM */
+ if (at24_if->read(at24_if, mac_addr, 0x7f00, 6) == 6) {
+ printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
+ print_mac(mac_str, mac_addr));
+
+ davinci_init_emac(mac_addr);
+ }
+ return 0;
+}
+static struct at24_platform_data eeprom_info = {
+ .byte_len = (256*1024) / 8,
+ .page_size = 64,
+ .flags = AT24_FLAG_ADDR16,
+ .setup = at24_setup,
+};
+
+int dm646xevm_eeprom_read(void *buf, off_t off, size_t count)
+{
+ if (at24_if)
+ return at24_if->read(at24_if, buf, off, count);
+ return -ENODEV;
+}
+EXPORT_SYMBOL(dm646xevm_eeprom_read);
+
+int dm646xevm_eeprom_write(void *buf, off_t off, size_t count)
+{
+ if (at24_if)
+ return at24_if->write(at24_if, buf, off, count);
+ return -ENODEV;
+}
+EXPORT_SYMBOL(dm646xevm_eeprom_write);
+
+static struct i2c_board_info __initdata i2c_info[] = {
+ {
+ I2C_BOARD_INFO("24c256", 0x50),
+ .platform_data = &eeprom_info,
+ },
+};
+
static struct davinci_i2c_platform_data i2c_pdata = {
.bus_freq = 100 /* kHz */,
.bus_delay = 0 /* usec */,
@@ -56,6 +114,7 @@ static struct davinci_i2c_platform_data i2c_pdata = {
static void __init evm_init_i2c(void)
{
davinci_init_i2c(&i2c_pdata);
+ i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
}
#define UART_DM646X_SCR (DAVINCI_UART0_BASE + 0x40)
--
1.5.4.1
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source