/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2007 Dave Chapman
 *
 * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/
#ifndef __TCC77X_H__
#define __TCC77X_H__

/* General-purpose IO */

#define GPIOA      (*(volatile unsigned long *)0x80000300)
#define GPIOB      (*(volatile unsigned long *)0x80000310)
#define GPIOC      (*(volatile unsigned long *)0x80000320)
#define GPIOD      (*(volatile unsigned long *)0x80000330)
#define GPIOE      (*(volatile unsigned long *)0x80000340)

#define GPIOA_DIR  (*(volatile unsigned long *)0x80000304)
#define GPIOB_DIR  (*(volatile unsigned long *)0x80000314)
#define GPIOC_DIR  (*(volatile unsigned long *)0x80000324)
#define GPIOD_DIR  (*(volatile unsigned long *)0x80000334)
#define GPIOE_DIR  (*(volatile unsigned long *)0x80000344)

#define GPIOA_FUNC (*(volatile unsigned long *)0x80000308)
#define GPIOB_FUNC (*(volatile unsigned long *)0x80000318)
#define GPIOC_FUNC (*(volatile unsigned long *)0x80000328)
#define GPIOD_FUNC (*(volatile unsigned long *)0x80000338)
#define GPIOE_FUNC (*(volatile unsigned long *)0x80000348)

#define BMI        (*(volatile unsigned long *)0x80000364)

/* Clock Generator */

#define CLKCTRL    (*(volatile unsigned long *)0x80000400)
#define PLL0CFG    (*(volatile unsigned long *)0x80000404)
#define CLKDIVC    (*(volatile unsigned long *)0x8000040c)
#define MODECTR    (*(volatile unsigned long *)0x80000410)
#define BCLKCTR    (*(volatile unsigned long *)0x80000414)
#define SWRESET    (*(volatile unsigned long *)0x80000418)
#define PCLKCFG0   (*(volatile unsigned long *)0x8000041c)
#define PCLKCFG1   (*(volatile unsigned long *)0x80000420)
#define PCLKCFG2   (*(volatile unsigned long *)0x80000424)
#define PCLKCFG3   (*(volatile unsigned long *)0x80000428)
#define PCLKCFG4   (*(volatile unsigned long *)0x8000042c)
#define PCLKCFG5   (*(volatile unsigned long *)0x80000430)
#define PCLKCFG6   (*(volatile unsigned long *)0x80000434)

#define PCLK_DAI   PCLKCFG6

/* Device bits for SWRESET & BCLKCTR */

#define DEV_DAI  (1<<0)
#define DEV_USBD (1<<4)
#define DEV_ECC  (1<<9)
#define DEV_NAND (1<<16)

/* ADC */

#define ADCCON     (*(volatile unsigned long *)0x80000a00)
#define ADCDATA    (*(volatile unsigned long *)0x80000a04)
#define ADCCONA    (*(volatile unsigned long *)0x80000a80)
#define ADCSTATUS  (*(volatile unsigned long *)0x80000a84)
#define ADCCFG     (*(volatile unsigned long *)0x80000a88)


/* Memory Controller */
#define SDCFG      (*(volatile unsigned long *)0xf0000000)
#define SDFSM      (*(volatile unsigned long *)0xf0000004)
#define MCFG       (*(volatile unsigned long *)0xf0000008)
#define TST        (*(volatile unsigned long *)0xf000000c)
#define CSCFG0     (*(volatile unsigned long *)0xf0000010)
#define CSCFG1     (*(volatile unsigned long *)0xf0000014)
#define CSCFG2     (*(volatile unsigned long *)0xf0000018)
#define CSCFG3     (*(volatile unsigned long *)0xf000001c)
#define CLKCFG     (*(volatile unsigned long *)0xf0000020)
#define SDCMD      (*(volatile unsigned long *)0xf0000024)


/* IRQ Controller */
#define EXT0_IRQ_MASK    (1<<0)
#define EXT1_IRQ_MASK    (1<<1)
#define EXT2_IRQ_MASK    (1<<2)
#define EXT3_IRQ_MASK    (1<<3)
#define I2SR_IRQ_MASK    (1<<4)
#define I2ST_IRQ_MASK    (1<<5)
#define TIMER0_IRQ_MASK  (1<<6)
#define USBD_IRQ_MASK    (1<<8)  /* USB 2.0 device */
#define USBH_IRQ_MASK    (1<<10) /* USB 1.1 host */
#define ADC_IRQ_MASK     (1<<16)
#define USB_DMA_IRQ_MASK (1<<26) /* USB DMA */
#define ECC_IRQ_MASK     (1<<27)

#define DAI_RX_IRQ_MASK  I2SR_IRQ_MASK
#define DAI_TX_IRQ_MASK  I2ST_IRQ_MASK

#define USB_DMA_IRQ_MASK (1<<26) /* USB DMA */

#define IEN      (*(volatile unsigned long *)0x80000100)
#define CREQ     (*(volatile unsigned long *)0x80000104)
#define IREQ     (*(volatile unsigned long *)0x80000108)
#define IRQSEL   (*(volatile unsigned long *)0x8000010c)
#define ICFG     (*(volatile unsigned long *)0x80000110)
#define MREQ     (*(volatile unsigned long *)0x80000114)
#define TSTREQ   (*(volatile unsigned long *)0x80000118)
#define IRQ      (*(volatile unsigned long *)0x80000120)
#define FIQ      (*(volatile unsigned long *)0x80000124)
#define MIRQ     (*(volatile unsigned long *)0x80000128)
#define MFIQ     (*(volatile unsigned long *)0x8000012c)
#define TMODE    (*(volatile unsigned long *)0x80000130)
#define SYNC     (*(volatile unsigned long *)0x80000134)
#define WKUP     (*(volatile unsigned long *)0x80000138)

/* Timer Controller */

#define TCFG0    (*(volatile unsigned long *)0x80000200)
#define TCNT0    (*(volatile unsigned long *)0x80000204)
#define TREF0    (*(volatile unsigned long *)0x80000208)
#define TMREF0   (*(volatile unsigned long *)0x8000020c)
#define TCFG1    (*(volatile unsigned long *)0x80000210)
#define TCNT1    (*(volatile unsigned long *)0x80000214)
#define TREF1    (*(volatile unsigned long *)0x80000218)
#define TMREF1   (*(volatile unsigned long *)0x8000021c)
#define TCFG2    (*(volatile unsigned long *)0x80000220)
#define TCNT2    (*(volatile unsigned long *)0x80000224)
#define TREF2    (*(volatile unsigned long *)0x80000228)
#define TMREF2   (*(volatile unsigned long *)0x8000022c)
#define TCFG3    (*(volatile unsigned long *)0x80000230)
#define TCNT3    (*(volatile unsigned long *)0x80000234)
#define TREF3    (*(volatile unsigned long *)0x80000238)
#define TMREF3   (*(volatile unsigned long *)0x8000023c)
#define TCFG4    (*(volatile unsigned long *)0x80000240)
#define TCNT4    (*(volatile unsigned long *)0x80000244)
#define TREF4    (*(volatile unsigned long *)0x80000248)
#define TCFG5    (*(volatile unsigned long *)0x80000250)
#define TCNT5    (*(volatile unsigned long *)0x80000254)
#define TREF5    (*(volatile unsigned long *)0x80000258)
#define TIREQ    (*(volatile unsigned long *)0x80000260)
#define TWDCFG   (*(volatile unsigned long *)0x80000270)
#define TWDCLR   (*(volatile unsigned long *)0x80000274)
#define TC32EN   (*(volatile unsigned long *)0x80000280)
#define TC32LDV  (*(volatile unsigned long *)0x80000284)
#define TC32CMP0 (*(volatile unsigned long *)0x80000288)
#define TC32CMP1 (*(volatile unsigned long *)0x8000028c)
#define TC32PCNT (*(volatile unsigned long *)0x80000290)
#define TC32MCNT (*(volatile unsigned long *)0x80000294)
#define TC32IRQ  (*(volatile unsigned long *)0x80000298)

/* TIREQ flags */
#define TF0 (1<<8) /* Timer 0 reference value reached */
#define TF1 (1<<9) /* Timer 1 reference value reached */
#define TI0 (1<<0) /* Timer 0 IRQ flag */
#define TI1 (1<<1) /* Timer 1 IRQ flag */

/* NAND Flash Controller */

#define NFC_CMD    (*(volatile unsigned long *)0x90000000)
#define NFC_SADDR  (*(volatile unsigned long *)0x9000000C)
#define NFC_SDATA  (*(volatile unsigned long *)0x90000040)
#define NFC_WDATA  (*(volatile unsigned long *)0x90000010)
#define NFC_CTRL   (*(volatile unsigned long *)0x90000050)
    #define NFC_16BIT (1<<26)
    #define NFC_CS0   (1<<23)
    #define NFC_CS1   (1<<22)
    #define NFC_READY (1<<20)
#define NFC_IREQ   (*(volatile unsigned long *)0x90000060)
#define NFC_RST    (*(volatile unsigned long *)0x90000064)


/* ECC controller */

#define ECC_CTRL       (*(volatile unsigned long *)0x80000900)
    #define ECC_DMA_REQ   (1<<28)
    #define ECC_ENC       (1<<27) /* MLC ECC3/4 */
    #define ECC_READY     (1<<26)
    #define ECC_IEN       (1<<25)
    #define ECC_MANUAL    (1<<22)
    #define ECC_WCNT      (1<<12) /* [21:12] */
    #define ECC_HOLD      (1<<7)
    #define ECC_M4EN      (1<<6)
    #define ECC_ZERO      (1<<5)
    #define ECC_M3EN      (1<<4)
    #define ECC_CNT_MASK  (7<<1)
    #define ECC_CNT       (1<<1)
    #define ECC_SLC       (1<<0)
    
#define ECC_BASE       (*(volatile unsigned long *)0x80000904)
#define ECC_MASK       (*(volatile unsigned long *)0x80000908)
#define ECC_CLR        (*(volatile unsigned long *)0x8000090c)
#define SLC_ECC0       (*(volatile unsigned long *)0x80000910)
#define SLC_ECC1       (*(volatile unsigned long *)0x80000914)
#define SLC_ECC2       (*(volatile unsigned long *)0x80000918)
#define SLC_ECC3       (*(volatile unsigned long *)0x8000091c)
#define SLC_ECC4       (*(volatile unsigned long *)0x80000920)
#define SLC_ECC5       (*(volatile unsigned long *)0x80000924)
#define SLC_ECC6       (*(volatile unsigned long *)0x80000928)
#define SLC_ECC7       (*(volatile unsigned long *)0x8000092c)
#define MLC_ECC0W      (*(volatile unsigned long *)0x80000930)
#define MLC_ECC1W      (*(volatile unsigned long *)0x80000934)
#define MLC_ECC2W      (*(volatile unsigned long *)0x80000938)
#define MLC_ECC0R      (*(volatile unsigned long *)0x80000940)
#define MLC_ECC1R      (*(volatile unsigned long *)0x80000944)
#define MLC_ECC2R      (*(volatile unsigned long *)0x80000948)
#define ECC_CORR_START (*(volatile unsigned long *)0x8000094c)
#define ECC_ERRADDR(x) (*(volatile unsigned long *)(0x80000950+4*(x)))
#define ECC_ERRDATA(x) (*(volatile unsigned long *)(0x80000960+4*(x)))
#define ECC_ERR_NUM    (*(volatile unsigned long *)0x80000970)


/* Digital Audio Interface */
#define DADI_L0    (*(volatile unsigned long *)0x80000000)
#define DADI_R0    (*(volatile unsigned long *)0x80000004)
#define DADI_L1    (*(volatile unsigned long *)0x80000008)
#define DADI_R1    (*(volatile unsigned long *)0x8000000C)
#define DADI_L2    (*(volatile unsigned long *)0x80000010)
#define DADI_R2    (*(volatile unsigned long *)0x80000014)
#define DADI_L3    (*(volatile unsigned long *)0x80000018)
#define DADI_R3    (*(volatile unsigned long *)0x8000001c)

#define DADO_L0    (*(volatile unsigned long *)0x80000020)
#define DADO_R0    (*(volatile unsigned long *)0x80000024)
#define DADO_L1    (*(volatile unsigned long *)0x80000028)
#define DADO_R1    (*(volatile unsigned long *)0x8000002C)
#define DADO_L2    (*(volatile unsigned long *)0x80000030)
#define DADO_R2    (*(volatile unsigned long *)0x80000034)
#define DADO_L3    (*(volatile unsigned long *)0x80000038)
#define DADO_R3    (*(volatile unsigned long *)0x8000003c)

#define DAMR       (*(volatile unsigned long *)0x80000040)
#define DAVC       (*(volatile unsigned long *)0x80000044)

#define DADI_L(x)  (*(volatile unsigned long *)(0x80000000 + (x) * 8))
#define DADI_R(x)  (*(volatile unsigned long *)(0x80000004 + (x) * 8))
#define DADO_L(x)  (*(volatile unsigned long *)(0x80000020 + (x) * 8))
#define DADO_R(x)  (*(volatile unsigned long *)(0x80000024 + (x) * 8))

/* USB 2.0 device system MMR base address */
#define USB_BASE 0x90000b00

#define USB_NUM_ENDPOINTS 3
#define USB_DEVBSS_ATTR   IBSS_ATTR

/* Timer frequency */
/* timers are based on XIN (12Mhz) */
#define TIMER_FREQ (12000000)

#endif
