[PATCH v5 1/2] memory: ti-aemif: introduce AEMIF driver

2014-02-19 Thread Ivan Khoronzhuk
Add new AEMIF driver for EMIF16 Texas Instruments controller.
The EMIF16 module is intended to provide a glue-less interface to
a variety of asynchronous memory devices like ASRA M, NOR and NAND
memory. A total of 256M bytes of any of these memories can be
accessed at any given time via 4 chip selects with 64M byte access
per chip select.

Synchronous memories such as DDR1 SD RAM, SDR SDRAM and Mobile SDR
are not supported.

This controller is used on SoCs like Davinci, Keysone2

Acked-by: Santosh Shilimkar 
Signed-off-by: Ivan Khoronzhuk 
---
 drivers/memory/Kconfig|  11 ++
 drivers/memory/Makefile   |   1 +
 drivers/memory/ti-aemif.c | 427 ++
 3 files changed, 439 insertions(+)
 create mode 100644 drivers/memory/ti-aemif.c

diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig
index 29a11db..7bc3982 100644
--- a/drivers/memory/Kconfig
+++ b/drivers/memory/Kconfig
@@ -7,6 +7,17 @@ menuconfig MEMORY
 
 if MEMORY
 
+config TI_AEMIF
+   tristate "Texas Instruments AEMIF driver"
+   depends on (ARCH_DAVINCI || ARCH_KEYSTONE) && OF
+   help
+ This driver is for the AEMIF module available in Texas Instruments
+ SoCs. AEMIF stands for Asynchronous External Memory Interface and
+ is intended to provide a glue-less interface to a variety of
+ asynchronuous memory devices like ASRAM, NOR and NAND memory. A total
+ of 256M bytes of any of these memories can be accessed at a given
+ time via four chip selects with 64M byte access per chip select.
+
 config TI_EMIF
tristate "Texas Instruments EMIF driver"
depends on ARCH_OMAP2PLUS
diff --git a/drivers/memory/Makefile b/drivers/memory/Makefile
index 969d923..d4e150c 100644
--- a/drivers/memory/Makefile
+++ b/drivers/memory/Makefile
@@ -5,6 +5,7 @@
 ifeq ($(CONFIG_DDR),y)
 obj-$(CONFIG_OF)   += of_memory.o
 endif
+obj-$(CONFIG_TI_AEMIF) += ti-aemif.o
 obj-$(CONFIG_TI_EMIF)  += emif.o
 obj-$(CONFIG_MVEBU_DEVBUS) += mvebu-devbus.o
 obj-$(CONFIG_TEGRA20_MC)   += tegra20-mc.o
diff --git a/drivers/memory/ti-aemif.c b/drivers/memory/ti-aemif.c
new file mode 100644
index 000..fcc25a1
--- /dev/null
+++ b/drivers/memory/ti-aemif.c
@@ -0,0 +1,427 @@
+/*
+ * TI AEMIF driver
+ *
+ * Copyright (C) 2010 - 2013 Texas Instruments Incorporated. http://www.ti.com/
+ *
+ * Authors:
+ * Murali Karicheri 
+ * Ivan Khoronzhuk 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define TA_SHIFT   2
+#define RHOLD_SHIFT4
+#define RSTROBE_SHIFT  7
+#define RSETUP_SHIFT   13
+#define WHOLD_SHIFT17
+#define WSTROBE_SHIFT  20
+#define WSETUP_SHIFT   26
+#define EW_SHIFT   30
+#define SS_SHIFT   31
+
+#define TA(x)  ((x) << TA_SHIFT)
+#define RHOLD(x)   ((x) << RHOLD_SHIFT)
+#define RSTROBE(x) ((x) << RSTROBE_SHIFT)
+#define RSETUP(x)  ((x) << RSETUP_SHIFT)
+#define WHOLD(x)   ((x) << WHOLD_SHIFT)
+#define WSTROBE(x) ((x) << WSTROBE_SHIFT)
+#define WSETUP(x)  ((x) << WSETUP_SHIFT)
+#define EW(x)  ((x) << EW_SHIFT)
+#define SS(x)  ((x) << SS_SHIFT)
+
+#define ASIZE_MAX  0x1
+#define TA_MAX 0x3
+#define RHOLD_MAX  0x7
+#define RSTROBE_MAX0x3f
+#define RSETUP_MAX 0xf
+#define WHOLD_MAX  0x7
+#define WSTROBE_MAX0x3f
+#define WSETUP_MAX 0xf
+#define EW_MAX 0x1
+#define SS_MAX 0x1
+#define NUM_CS 4
+
+#define TA_VAL(x)  (((x) & TA(TA_MAX)) >> TA_SHIFT)
+#define RHOLD_VAL(x)   (((x) & RHOLD(RHOLD_MAX)) >> RHOLD_SHIFT)
+#define RSTROBE_VAL(x) (((x) & RSTROBE(RSTROBE_MAX)) >> RSTROBE_SHIFT)
+#define RSETUP_VAL(x)  (((x) & RSETUP(RSETUP_MAX)) >> RSETUP_SHIFT)
+#define WHOLD_VAL(x)   (((x) & WHOLD(WHOLD_MAX)) >> WHOLD_SHIFT)
+#define WSTROBE_VAL(x) (((x) & WSTROBE(WSTROBE_MAX)) >> WSTROBE_SHIFT)
+#define WSETUP_VAL(x)  (((x) & WSETUP(WSETUP_MAX)) >> WSETUP_SHIFT)
+#define EW_VAL(x)  (((x) & EW(EW_MAX)) >> EW_SHIFT)
+#define SS_VAL(x)  (((x) & SS(SS_MAX)) >> SS_SHIFT)
+
+#define NRCSR_OFFSET   0x00
+#define AWCCR_OFFSET   0x04
+#define A1CR_OFFSET0x10
+
+#define ACR_ASIZE_MASK 0x3
+#define ACR_EW_MASKBIT(30)
+#define ACR_SS_MASKBIT(31)
+#define ASIZE_16BIT1
+
+#define CONFIG_MASK(TA(TA_MAX) | \
+   RHOLD(RHOLD_MAX) | \
+   RSTROBE(RSTROBE_MAX) |  \
+   RSETUP(RSETUP_MAX) | \
+   WHOLD(WHOLD_MAX) | \
+   WSTROBE(WSTROBE_MAX) | \
+   WSETUP(WSETUP_MAX) | \
+   EW(EW_MAX) | SS(SS_MAX) | \
+   ASIZE_MAX)
+
+/**
+ * struct 

[PATCH v5 1/2] memory: ti-aemif: introduce AEMIF driver

2014-02-19 Thread Ivan Khoronzhuk
Add new AEMIF driver for EMIF16 Texas Instruments controller.
The EMIF16 module is intended to provide a glue-less interface to
a variety of asynchronous memory devices like ASRA M, NOR and NAND
memory. A total of 256M bytes of any of these memories can be
accessed at any given time via 4 chip selects with 64M byte access
per chip select.

Synchronous memories such as DDR1 SD RAM, SDR SDRAM and Mobile SDR
are not supported.

This controller is used on SoCs like Davinci, Keysone2

Acked-by: Santosh Shilimkar santosh.shilim...@ti.com
Signed-off-by: Murali Karicheri m-kariche...@ti.com
Signed-off-by: Ivan Khoronzhuk ivan.khoronz...@ti.com
---
 drivers/memory/Kconfig|  11 ++
 drivers/memory/Makefile   |   1 +
 drivers/memory/ti-aemif.c | 427 ++
 3 files changed, 439 insertions(+)
 create mode 100644 drivers/memory/ti-aemif.c

diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig
index 29a11db..7bc3982 100644
--- a/drivers/memory/Kconfig
+++ b/drivers/memory/Kconfig
@@ -7,6 +7,17 @@ menuconfig MEMORY
 
 if MEMORY
 
+config TI_AEMIF
+   tristate Texas Instruments AEMIF driver
+   depends on (ARCH_DAVINCI || ARCH_KEYSTONE)  OF
+   help
+ This driver is for the AEMIF module available in Texas Instruments
+ SoCs. AEMIF stands for Asynchronous External Memory Interface and
+ is intended to provide a glue-less interface to a variety of
+ asynchronuous memory devices like ASRAM, NOR and NAND memory. A total
+ of 256M bytes of any of these memories can be accessed at a given
+ time via four chip selects with 64M byte access per chip select.
+
 config TI_EMIF
tristate Texas Instruments EMIF driver
depends on ARCH_OMAP2PLUS
diff --git a/drivers/memory/Makefile b/drivers/memory/Makefile
index 969d923..d4e150c 100644
--- a/drivers/memory/Makefile
+++ b/drivers/memory/Makefile
@@ -5,6 +5,7 @@
 ifeq ($(CONFIG_DDR),y)
 obj-$(CONFIG_OF)   += of_memory.o
 endif
+obj-$(CONFIG_TI_AEMIF) += ti-aemif.o
 obj-$(CONFIG_TI_EMIF)  += emif.o
 obj-$(CONFIG_MVEBU_DEVBUS) += mvebu-devbus.o
 obj-$(CONFIG_TEGRA20_MC)   += tegra20-mc.o
diff --git a/drivers/memory/ti-aemif.c b/drivers/memory/ti-aemif.c
new file mode 100644
index 000..fcc25a1
--- /dev/null
+++ b/drivers/memory/ti-aemif.c
@@ -0,0 +1,427 @@
+/*
+ * TI AEMIF driver
+ *
+ * Copyright (C) 2010 - 2013 Texas Instruments Incorporated. http://www.ti.com/
+ *
+ * Authors:
+ * Murali Karicheri m-kariche...@ti.com
+ * Ivan Khoronzhuk ivan.khoronz...@ti.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include linux/clk.h
+#include linux/err.h
+#include linux/io.h
+#include linux/kernel.h
+#include linux/module.h
+#include linux/of.h
+#include linux/of_platform.h
+#include linux/platform_device.h
+
+#define TA_SHIFT   2
+#define RHOLD_SHIFT4
+#define RSTROBE_SHIFT  7
+#define RSETUP_SHIFT   13
+#define WHOLD_SHIFT17
+#define WSTROBE_SHIFT  20
+#define WSETUP_SHIFT   26
+#define EW_SHIFT   30
+#define SS_SHIFT   31
+
+#define TA(x)  ((x)  TA_SHIFT)
+#define RHOLD(x)   ((x)  RHOLD_SHIFT)
+#define RSTROBE(x) ((x)  RSTROBE_SHIFT)
+#define RSETUP(x)  ((x)  RSETUP_SHIFT)
+#define WHOLD(x)   ((x)  WHOLD_SHIFT)
+#define WSTROBE(x) ((x)  WSTROBE_SHIFT)
+#define WSETUP(x)  ((x)  WSETUP_SHIFT)
+#define EW(x)  ((x)  EW_SHIFT)
+#define SS(x)  ((x)  SS_SHIFT)
+
+#define ASIZE_MAX  0x1
+#define TA_MAX 0x3
+#define RHOLD_MAX  0x7
+#define RSTROBE_MAX0x3f
+#define RSETUP_MAX 0xf
+#define WHOLD_MAX  0x7
+#define WSTROBE_MAX0x3f
+#define WSETUP_MAX 0xf
+#define EW_MAX 0x1
+#define SS_MAX 0x1
+#define NUM_CS 4
+
+#define TA_VAL(x)  (((x)  TA(TA_MAX))  TA_SHIFT)
+#define RHOLD_VAL(x)   (((x)  RHOLD(RHOLD_MAX))  RHOLD_SHIFT)
+#define RSTROBE_VAL(x) (((x)  RSTROBE(RSTROBE_MAX))  RSTROBE_SHIFT)
+#define RSETUP_VAL(x)  (((x)  RSETUP(RSETUP_MAX))  RSETUP_SHIFT)
+#define WHOLD_VAL(x)   (((x)  WHOLD(WHOLD_MAX))  WHOLD_SHIFT)
+#define WSTROBE_VAL(x) (((x)  WSTROBE(WSTROBE_MAX))  WSTROBE_SHIFT)
+#define WSETUP_VAL(x)  (((x)  WSETUP(WSETUP_MAX))  WSETUP_SHIFT)
+#define EW_VAL(x)  (((x)  EW(EW_MAX))  EW_SHIFT)
+#define SS_VAL(x)  (((x)  SS(SS_MAX))  SS_SHIFT)
+
+#define NRCSR_OFFSET   0x00
+#define AWCCR_OFFSET   0x04
+#define A1CR_OFFSET0x10
+
+#define ACR_ASIZE_MASK 0x3
+#define ACR_EW_MASKBIT(30)
+#define ACR_SS_MASKBIT(31)
+#define ASIZE_16BIT1
+
+#define CONFIG_MASK(TA(TA_MAX) | \
+   RHOLD(RHOLD_MAX) | \
+   RSTROBE(RSTROBE_MAX) |  \
+   RSETUP(RSETUP_MAX) | \
+   WHOLD(WHOLD_MAX) | \
+