/*
 OMAP3430 ZOOM MDK astoria interface defs(cyasmemmap.h)
## ===========================
## Copyright (C) 2010  Cypress Semiconductor
##
## 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.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor
## Boston, MA  02110-1301, USA.
## ===========================
*/
/* include does not seem to work
 * moving for patch submission
#include <mach/gpmc.h>
#include <mach/mux.h>
*/
#include <linux/../../arch/arm/plat-omap/include/plat/gpmc.h>
#include <linux/../../arch/arm/plat-omap/include/plat/mux.h>

#ifndef _INCLUDED_CYASMEMMAP_H_
#define _INCLUDED_CYASMEMMAP_H_

/* defines copied from OMAP kernel branch */

#define OMAP2_PULL_UP		(1 << 4)
#define OMAP2_PULL_ENA		(1 << 3)
#define	OMAP34XX_MUX_MODE0	0
#define	OMAP34XX_MUX_MODE4	4
#define OMAP3_INPUT_EN		(1 << 8)
#define OMAP34XX_PIN_INPUT_PULLUP	(OMAP2_PULL_ENA | OMAP3_INPUT_EN \
						| OMAP2_PULL_UP)

/*
 * for OMAP3430 <-> astoria :   ADmux mode, 8 bit data path
 * WB Signal-	OMAP3430 signal	    COMMENTS
 *  --------------------------- --------------------
 * CS_L	 -GPMC_nCS4_GPIO_53	ZOOM I SOM board
 *								signal: up_nCS_A_EXT
 * AD[7:0]-upD[7:0]		  	buffered on the
 *								transposer board
 * 							GPMC_ADDR
 *							[A8:A1]->upD[7:0]
 * INT#	-GPMC_nWP_GPIO_62
 * DACK	-N/C				 not conected
 * WAKEUP-GPIO_167
 * RESET-GPIO_126
 * R/B	-GPMC_WAIT2_GPIO_64
 * -------------------------------------------
 * The address range for nCS1B is 0x06000000 - 0x07FF FFFF.
*/

/*
 *OMAP_ZOOM LEDS
 */
#define LED_0 156
#define LED_1 128
#define LED_2 64
#define LED_3 60

#define HIGH 1
#define LOW  1

/*
 *omap GPIO number
 */
#define AST_WAKEUP	 167
#define AST_RESET	 126
#define AST__rn_b	 64

/*
 * NOTE THIS PIN IS USED AS WP for OMAP NAND
 */
#define AST_INT	 62

/*
 * as an I/O, it is actually controlled by GPMC
 */
#define AST_CS	55


/*
 *GPMC prefetch engine
 */

/* register and its bit fields */
#define GPMC_PREFETCH_CONFIG1 0x01E0

	/*32 bytes for 16 bit pnand mode*/
	#define PFE_THRESHOLD 31

	/*
	 * bit fields
	 * PF_ACCESSMODE  - 0 - read mode, 1 - write mode
	 * PF_DMAMODE - 0 - default only intr line signal will be generated
	 * PF_SYNCHROMODE - default 0 - engin will start access as soon as
	 *					ctrl re STARTENGINE is set
	 * PF_WAITPINSEL - FOR synchro mode  selects WAIT pin whch edge
	 *					will be monitored
	 * PF_EN_ENGINE - 1- ENABLES ENGINE, but it needs to be started after
	 *					that C ctrl reg bit 0
	 * PF_FIFO_THRESHOLD - FIFO threshhold in number of BUS(8 or 16) words
	 * PF_WEIGHTED_PRIO  - NUM of cycles granted to PFE if RND_ROBIN
	 *					prioritization is enabled
	 * PF_ROUND_ROBIN  - if enabled, gives priority to other CS, but
	 *					reserves NUM of cycles for PFE's turn
	 * PF_ENGIN_CS_SEL  - GPMC CS assotiated with PFE function
	 */
	#define PF_ACCESSMODE  (0 << 0)
	#define PF_DMAMODE	 (0 << 2)
	#define PF_SYNCHROMODE (0 << 3)
	#define PF_WAITPINSEL  (0x0 << 4)
	#define PF_EN_ENGINE   (1 << 7)
	#define PF_FIFO_THRESHOLD (PFE_THRESHOLD << 8)
	#define PF_WEIGHTED_PRIO (0x0 << 16)
	#define PF_ROUND_ROBIN   (0 << 23)
	#define PF_ENGIN_CS_SEL (AST_GPMC_CS << 24)
	#define PF_EN_OPTIM_ACC (0 << 27)
	#define PF_CYCLEOPTIM   (0x0 << 28)

#define GPMC_PREFETCH_CONFIG1_VAL (PF_ACCESSMODE | \
				PF_DMAMODE | PF_SYNCHROMODE | \
				PF_WAITPINSEL | PF_EN_ENGINE | \
				PF_FIFO_THRESHOLD | PF_FIFO_THRESHOLD | \
				PF_WEIGHTED_PRIO | PF_ROUND_ROBIN | \
				PF_ENGIN_CS_SEL | PF_EN_OPTIM_ACC | \
				PF_CYCLEOPTIM)

/* register and its bit fields */
#define GPMC_PREFETCH_CONFIG2 0x01E4
	/*
	 * bit fields
	 * 14 bit field NOTE this counts is also
	 * is in number of BUS(8 or 16) words
	 */
	#define PF_TRANSFERCOUNT (0x000)


/* register and its bit fields */
#define GPMC_PREFETCH_CONTROL 0x01EC
	/*
	 * bit fields , ONLY BIT 0 is implemented
	 * PFWE engin must be programmed with this bit = 0
	 */
	#define PFPW_STARTENGINE (1 << 0)

/* register and its bit fields */
#define GPMC_PREFETCH_STATUS  0x01F0

	/* */
	#define PFE_FIFO_THRESHOLD (1 << 16)

/*
 * GPMC posted write/prefetch engine end
 */


/*
 * chip select number on GPMC ( 0..7 )
 */
#define AST_GPMC_CS 4

/*
 * not connected
 */
#define AST_DACK	00


/*
 * Physical address above the NAND flash
 * we use CS For mapping in OMAP3430 RAM space use 0x0600 0000
 */
#define CYAS_DEV_BASE_ADDR  (0x20000000)

#define CYAS_DEV_MAX_ADDR   (0xFF)
#define CYAS_DEV_ADDR_RANGE (CYAS_DEV_MAX_ADDR << 1)

#ifdef p_s_r_a_m_INTERFACE
 /* in CRAM or PSRAM mode OMAP A1..An wires-> Astoria, there is no A0 line */
 #define CYAS_DEV_CALC_ADDR(cyas_addr) (cyas_addr << 1)
 #define CYAS_DEV_CALC_EP_ADDR(ep) (ep << 1)
#else
 /*
  * For pNAND interface it depends on NAND emulation mode
  * SBD/LBD etc we use NON-LNA_LBD  mode, so it goes like this:
  * forlbd   <CMD><CA0,CA1,RA0,RA1,RA2> <CMD>,
  * where CA1 address must have bits 2,3 = "11"
  * ep is mapped into RA1 bits {4:0}
  */
 #define CYAS_DEV_CALC_ADDR(cyas_addr) (cyas_addr | 0x0c00)
 #define CYAS_DEV_CALC_EP_ADDR(ep) ep
#endif

/*
 *OMAP3430 i/o access macros
 */
#define IORD32(addr) (*(volatile u32  *)(addr))
#define IOWR32(addr, val) (*(volatile u32 *)(addr) = val)

#define IORD16(addr) (*(volatile u16  *)(addr))
#define IOWR16(addr, val) (*(volatile u16 *)(addr) = val)

#define IORD8(addr) (*(volatile u8  *)(addr))
#define IOWR8(addr, val) (*(volatile u8 *)(addr) = val)

/*
 * local defines for accessing to OMAP GPIO ***
 */
#define CTLPADCONF_BASE_ADDR 0x48002000
#define CTLPADCONF_SIZE 0x1000

#define GPIO1_BASE_ADDR 0x48310000
#define GPIO2_BASE_ADDR 0x49050000
#define GPIO3_BASE_ADDR 0x49052000
#define GPIO4_BASE_ADDR 0x49054000
#define GPIO5_BASE_ADDR 0x49056000
#define GPIO6_BASE_ADDR 0x49058000
#define GPIO_SPACE_SIZE 0x1000


/*
 * OMAP3430 GPMC timing for pNAND interface
 */
#define GPMC_BASE 0x6E000000
#define GPMC_REGION_SIZE 0x1000
#define GPMC_CONFIG_REG (0x50)

/*
 * bit 0 in the GPMC_CONFIG_REG
 */
#define NAND_FORCE_POSTED_WRITE_B 1

/*
 * WAIT2STATUS, must be (1 << 10)
 */
#define AS_WAIT_PIN_MASK (1 << 10)


/*
 * GPMC_CONFIG(reg number [1..7] [for chip sel CS[0..7])
 */
#define GPMC_CFG_REG(N, CS) ((0x60 + (4*(N-1))) + (0x30*CS))

/*
 *gpmc nand registers for CS4
 */
#define AST_GPMC_NAND_CMD		(0x7c + (0x30*AST_GPMC_CS))
#define AST_GPMC_NAND_ADDR		(0x80 + (0x30*AST_GPMC_CS))
#define AST_GPMC_NAND_DATA		(0x84 + (0x30*AST_GPMC_CS))

#define GPMC_STAT_REG		(0x54)
#define GPMC_ERR_TYPE	   (0x48)

/*
 * we get "gpmc_base" from kernel
 */
#define GPMC_VMA(offset) (gpmc_base + offset)

/*
 * GPMC CS space VMA start address
 */
#define GPMC_CS_VMA(offset) (gpmc_data_vma + offset)

/*
 * PAD_CFG mux space VMA
 */
#define PADCFG_VMA(offset) (iomux_vma + offset)

/*
 * CONFIG1: by default, sngle access, async r/w RD_MULTIPLE[30]
 * WR_MULTIPLE[28]; GPMC_FCL_DIV[1:0]
 */
#define GPMC_FCLK_DIV ((0) << 0)

/*
 * ADDITIONAL DIVIDER FOR ALL TIMING PARAMS
 */
#define TIME_GRAN_SCALE ((0) << 4)

/*
 * for use by gpmc_set_timings api, measured in ns, not clocks
 */
#define WB_GPMC_BUSCYC_t  (7 * 6)
#define WB_GPMC_CS_t_o_n	(0)
#define WB_GPMC_ADV_t_o_n   (0)
#define WB_GPMC_OE_t_o_n	(0)
#define WB_GPMC_OE_t_o_f_f   (5 * 6)
#define WB_GPMC_WE_t_o_n	(1 * 6)
#define WB_GPMC_WE_t_o_f_f   (5 * 6)
#define WB_GPMC_RDS_ADJ   (2 * 6)
#define WB_GPMC_RD_t_a_c_c   (WB_GPMC_OE_t_o_f_f + WB_GPMC_RDS_ADJ)
#define WB_GPMC_WR_t_a_c_c  (WB_GPMC_BUSCYC_t)

#define DIR_OUT	0
#define DIR_INP	1
#define DRV_HI	1
#define DRV_LO	0

/*
 * GPMC_CONFIG7[cs] register bit fields
 * AS_CS_MASK - 3 bit mask for  A26,A25,A24,
 * AS_CS_BADDR - 6 BIT VALUE  A29 ...A24
 * CSVALID_B - CSVALID bit on GPMC_CONFIG7[cs] register
 */
#define AS_CS_MASK	(0X7 << 8)
#define AS_CS_BADDR	 0x02
#define CSVALID_B (1 << 6)

/*
 * DEFINE OMAP34XX GPIO OFFSETS (should have been defined in kernel /arch
 * these are offsets from the BASE_ADDRESS of the GPIO BLOCK
 */
#define GPIO_REVISION		0x000
#define GPIO_SYSCONFIG		0x010
#define GPIO_SYSSTATUS1		0x014
#define GPIO_IRQSTATUS1		0x018
#define GPIO_IRQENABLE1		0x01C
#define GPIO_IRQSTATUS2		0x028
#define GPIO_CTRL		0x030
#define GPIO_OE			0x034
#define GPIO_DATA_IN		0x038
#define GPIO_DATA_OUT		0x03C
#define GPIO_LEVELDETECT0	   0x040
#define GPIO_LEVELDETECT1	   0x044
#define GPIO_RISINGDETECT	   0x048
#define GPIO_FALLINGDETECT	  0x04c
#define GPIO_CLEAR_DATAOUT	0x090
#define GPIO_SET_DATAOUT	0x094

typedef struct  {
	char	*name;
	u32		phy_addr;
	u32		virt_addr;
	u32		size;
} io2vma_tab_t;

/*
 * GPIO phy to translation VMA table
 */
static  io2vma_tab_t gpio_vma_tab[6] = {
		{"GPIO1_BASE_ADDR", GPIO1_BASE_ADDR , 0 , GPIO_SPACE_SIZE},
		{"GPIO2_BASE_ADDR", GPIO2_BASE_ADDR , 0 , GPIO_SPACE_SIZE},
		{"GPIO3_BASE_ADDR", GPIO3_BASE_ADDR , 0 , GPIO_SPACE_SIZE},
		{"GPIO4_BASE_ADDR", GPIO4_BASE_ADDR , 0 , GPIO_SPACE_SIZE},
		{"GPIO5_BASE_ADDR", GPIO5_BASE_ADDR , 0 , GPIO_SPACE_SIZE},
		{"GPIO6_BASE_ADDR", GPIO6_BASE_ADDR , 0 , GPIO_SPACE_SIZE}
};
/*
 * name - USER signal name assigned to the pin ( for printks)
 * mux_func -  enum index NAME for the pad_cfg function
 * pin_num - pin_number if mux_func is GPIO, if not a GPIO it is -1
 * mux_ptr - pointer to the corresponding pad_cfg_reg
 *			(used for pad release )
 * mux_save - preserve here original PAD_CNF value for this
 *			pin (used for pad release)
 * dir - if GPIO: 0 - OUT , 1 - IN
 * dir_save - save original pin direction
 * drv - initial drive level "0" or "1"
 * drv_save - save original pin drive level
 * valid - 1 if successfuly configured
*/
typedef struct  {
	char *name;
	u32 mux_func;
	int pin_num;
	u16 *mux_ptr;
	u16 mux_save;
	u8 dir;
	u8 dir_save;
	u8 drv;
	u8 drv_save;
	u8 valid;
} user_pad_cfg_t;

/*
 * need to ensure that enums are in sync with the
 * omap_mux_pin_cfg table, these enums designate
 * functions that OMAP pads can be configured to
 */
enum {
	B23_OMAP3430_GPIO_167,
	D23_OMAP3430_GPIO_126,
	H1_OMAP3430_GPIO_62,
	H1_OMAP3430_GPMC_n_w_p,
	T8_OMAP3430_GPMC_n_c_s4,
	T8_OMAP3430_GPIO_55,
	R25_OMAP3430_GPIO_156,
	R27_OMAP3430_GPIO_128,
	K8_OMAP3430_GPIO_64,
	K8_GPMC_WAIT2,
	G3_OMAP3430_GPIO_60,
	G3_OMAP3430_n_b_e0_CLE,
	C6_GPMC_WAIT3,
	J1_OMAP3430_GPIO_61,
	C6_OMAP3430_GPIO_65,

	END_OF_TABLE
};

/*
 * number of GPIOS we plan to grab
 */
#define GPIO_SLOTS 8

/*
 *  user_pads_init() reads(and saves) from/to this table
 *  used in conjunction with omap_3430_mux_t table in .h file
 *  because the way it's done in the kernel code
 *  TODO: implement restore of the the original cfg and i/o regs
 */

static user_pad_cfg_t user_pad_cfg[] = {
		 /*
		 * name,pad_func,pin_num, mux_ptr, mux_sav, dir,
		 *    dir_sav, drv, drv_save, valid
		 */
		{"AST_WAKEUP", B23_OMAP3430_GPIO_167, 167, NULL, 0,
				DIR_OUT, 0, DRV_HI, 0, 0},
		{"AST_RESET", D23_OMAP3430_GPIO_126, 126, NULL,	0,
				DIR_OUT, 0, DRV_HI, 0, 0},
		{"AST__rn_b", K8_GPMC_WAIT2, 64, NULL, 0,
				DIR_INP, 0,	0, 0, 0},
		{"AST_INTR", H1_OMAP3430_GPIO_62, 62, NULL, 0,
				DIR_INP, 0,	DRV_HI, 0, 0},
		{"AST_CS", T8_OMAP3430_GPMC_n_c_s4, 55, NULL, 0,
				DIR_OUT, 0,	DRV_HI, 0, 0},
		{"LED_0", R25_OMAP3430_GPIO_156, 156, NULL, 0,
				DIR_OUT, 0,	DRV_LO, 0, 0},
		{"LED_1", R27_OMAP3430_GPIO_128, 128, NULL, 0,
				DIR_OUT, 0,	DRV_LO, 0, 0},
		{"AST_CLE", G3_OMAP3430_n_b_e0_CLE , 60, NULL, 0,
				DIR_OUT, 0,	DRV_LO, 0, 0},
		/*
		 * Z terminator, must always be present
		 * for sanity check, don't remove
		 */
		{NULL}
};

#define GPIO_BANK(pin) (pin >> 5)
#define REG_WIDTH 32
#define GPIO_REG_VMA(pin_num, offset) \
	(gpio_vma_tab[GPIO_BANK(pin_num)].virt_addr + offset)

/*
 * OMAP GPIO_REG 32 BIT MASK for a bit or
 * flag in gpio_No[0..191]  apply it to a 32 bit
 * location to set clear or check on a corresponding
 * gpio bit or flag
 */
#define GPIO_REG_MASK(pin_num) (1 << \
		(pin_num - (GPIO_BANK(pin_num) * REG_WIDTH)))

/*
 * OMAP GPIO registers bitwise access macros
 */

#define OMAP_GPIO_BIT(pin_num, reg) \
	((*((u32 *)GPIO_REG_VMA(pin_num, reg)) \
	& GPIO_REG_MASK(pin_num)) ? 1 : 0)

#define RD_OMAP_GPIO_BIT(pin_num, v) OMAP_GPIO_BIT(pin_num, reg)

/*
 *these are superfast set/clr bitbang macro, 48ns cyc tyme
 */
#define OMAP_SET_GPIO(pin_num) \
	(*(u32 *)GPIO_REG_VMA(pin_num, GPIO_SET_DATAOUT) \
	= GPIO_REG_MASK(pin_num))
#define OMAP_CLR_GPIO(pin_num) \
	(*(u32 *)GPIO_REG_VMA(pin_num, GPIO_CLEAR_DATAOUT) \
	= GPIO_REG_MASK(pin_num))

#define WR_OMAP_GPIO_BIT(pin_num, v) \
	(v ? (*(u32 *)GPIO_REG_VMA(pin_num, \
	GPIO_SET_DATAOUT) = GPIO_REG_MASK(pin_num)) \
	: (*(u32 *)GPIO_REG_VMA(pin_num, \
	GPIO_CLEAR_DATAOUT) = GPIO_REG_MASK(pin_num)))

/*
 * Note this pin cfg mimicks similar implementation
 * in linux kernel, which unfortunately doesn't allow
 * us to dynamically insert new custom GPIO mux
 * configurations all REG definitions used in this
 * applications. to add a new pad_cfg function, insert
 * a new ENUM and new pin_cfg entry in omap_mux_pin_cfg[]
 * table below
 *
 * offset - note this is a word offset since the
 *		SCM regs are 16 bit packed in one 32 bit word
 * mux_val - just enough to describe pins used
 */
typedef struct  {
	char	*name;
	u16		offset;
	u16	 mux_val;
} omap_3430_mux_t;

/*
 * "OUTIN" is configuration when DATA reg drives the
 * pin but the level at the pin can be sensed
 */
#define PAD_AS_OUTIN (OMAP34XX_MUX_MODE4 | \
		OMAP34XX_PIN_OUTPUT | OMAP34XX_PIN_INPUT)

omap_3430_mux_t omap_mux_pin_cfg[] = {
	/*
	 * B23_OMAP3430_GPIO_167 - GPIO func to PAD 167 WB wakeup
	 * D23_OMAP3430_GPIO_126 - drive GPIO_126 ( AST RESET)
	 * H1_OMAP3430_GPIO_62 - need a pullup on this pin
	 * H1_OMAP3430_GPMC_n_w_p -  GPMC NAND CTRL n_w_p out
	 * T8_OMAP3430_GPMC_n_c_s4" - T8 is controlled b_y GPMC NAND ctrl
	 * R25_OMAP3430_GPIO_156 - OMAPZOOM drive LED_0
	 * R27_OMAP3430_GPIO_128 - OMAPZOOM drive LED_1
	 * K8_OMAP3430_GPIO_64 - OMAPZOOM drive LED_2
	 * K8_GPMC_WAIT2 - GPMC WAIT2 function on PAD K8
	 * G3_OMAP3430_GPIO_60 - OMAPZOOM drive LED_3
	 * G3_OMAP3430_n_b_e0_CLE -GPMC NAND ctrl CLE signal
	*/

	{"B23_OMAP3430_GPIO_167", 0x0130, (OMAP34XX_MUX_MODE4)},
	{"D23_OMAP3430_GPIO_126", 0x0132, (OMAP34XX_MUX_MODE4)},
	{"H1_OMAP3430_GPIO_62",   0x00CA, (OMAP34XX_MUX_MODE4 |
				OMAP3_INPUT_EN | OMAP34XX_PIN_INPUT_PULLUP) },
	{"H1_OMAP3430_GPMC_n_w_p",  0x00CA, (OMAP34XX_MUX_MODE0)},
	{"T8_OMAP3430_GPMC_n_c_s4", 0x00B6, (OMAP34XX_MUX_MODE0) },
	{"T8_OMAP3430_GPIO_55",   0x00B6, (OMAP34XX_MUX_MODE4) },
	{"R25_OMAP3430_GPIO_156", 0x018C, (OMAP34XX_MUX_MODE4) },
	{"R27_OMAP3430_GPIO_128", 0x0154, (OMAP34XX_MUX_MODE4) },
	{"K8_OMAP3430_GPIO_64",   0x00d0, (OMAP34XX_MUX_MODE4) },
	{"K8_GPMC_WAIT2",		  0x00d0, (OMAP34XX_MUX_MODE0) },
	{"G3_OMAP3430_GPIO_60",   0x00C6, (OMAP34XX_MUX_MODE4 |
				OMAP3_INPUT_EN)},
	{"G3_OMAP3430_n_b_e0_CLE",  0x00C6, (OMAP34XX_MUX_MODE0)},
	{"C6_GPMC_WAIT3", 0x00d2, (OMAP34XX_MUX_MODE0)},
	{"C6_OMAP3430_GPIO_65", 0x00d2, (OMAP34XX_MUX_MODE4 |
				OMAP3_INPUT_EN)},
	{"J1_OMAP3430_GPIO_61", 0x00C8, (OMAP34XX_MUX_MODE4 |
				OMAP3_INPUT_EN | OMAP34XX_PIN_INPUT_PULLUP)},
	/*
	 * don't remove, used for sanity check.
	 */
	{"END_OF_TABLE"}
};


#endif /* _INCLUDED_CYASMEMMAP_H_ */

/*[]*/
