Home | History | Annotate | Line # | Download | only in ingenic
ingenic_regs.h revision 1.10
      1  1.10  macallan /*	$NetBSD: ingenic_regs.h,v 1.10 2015/03/17 07:22:40 macallan Exp $ */
      2   1.1  macallan 
      3   1.1  macallan /*-
      4   1.1  macallan  * Copyright (c) 2014 Michael Lorenz
      5   1.1  macallan  * All rights reserved.
      6   1.1  macallan  *
      7   1.1  macallan  * Redistribution and use in source and binary forms, with or without
      8   1.1  macallan  * modification, are permitted provided that the following conditions
      9   1.1  macallan  * are met:
     10   1.1  macallan  * 1. Redistributions of source code must retain the above copyright
     11   1.1  macallan  *    notice, this list of conditions and the following disclaimer.
     12   1.1  macallan  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1  macallan  *    notice, this list of conditions and the following disclaimer in the
     14   1.1  macallan  *    documentation and/or other materials provided with the distribution.
     15   1.1  macallan  *
     16   1.1  macallan  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17   1.1  macallan  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18   1.1  macallan  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19   1.1  macallan  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20   1.1  macallan  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21   1.1  macallan  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22   1.1  macallan  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23   1.1  macallan  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24   1.1  macallan  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25   1.1  macallan  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26   1.1  macallan  * POSSIBILITY OF SUCH DAMAGE.
     27   1.1  macallan  */
     28   1.1  macallan 
     29   1.1  macallan #include <mips/locore.h>
     30   1.1  macallan 
     31   1.1  macallan #ifndef INGENIC_REGS_H
     32   1.1  macallan #define INGENIC_REGS_H
     33   1.1  macallan 
     34   1.1  macallan /* UARTs, mostly 16550 compatible with 32bit spaced registers */
     35   1.1  macallan #define JZ_UART0 0x10030000
     36   1.1  macallan #define JZ_UART1 0x10031000
     37   1.1  macallan #define JZ_UART2 0x10032000
     38   1.1  macallan #define JZ_UART3 0x10033000
     39   1.1  macallan #define JZ_UART4 0x10034000
     40   1.1  macallan 
     41   1.1  macallan /* watchdog */
     42   1.1  macallan #define JZ_WDOG_TDR	0x10002000	/* compare */
     43   1.1  macallan #define JZ_WDOG_TCER	0x10002004
     44   1.1  macallan 	#define TCER_ENABLE	0x01	/* enable counter */
     45   1.1  macallan #define JZ_WDOG_TCNT	0x10002008	/* 16bit up count */
     46   1.1  macallan #define JZ_WDOG_TCSR	0x1000200c
     47   1.1  macallan 	#define TCSR_PCK_EN	0x01	/* PCLK */
     48   1.1  macallan 	#define TCSR_RTC_EN	0x02	/* RTCCLK - 32.768kHz */
     49   1.2  macallan 	#define TCSR_EXT_EN	0x04	/* EXTCLK - 48MHz */
     50   1.1  macallan 	#define TCSR_PRESCALE_M	0x38
     51   1.1  macallan 	#define TCSR_DIV_1	0x00
     52   1.1  macallan 	#define TCSR_DIV_4	0x08
     53   1.1  macallan 	#define TCSR_DIV_16	0x10
     54   1.1  macallan 	#define TCSR_DIV_64	0x18
     55   1.1  macallan 	#define TCSR_DIV_256	0x20
     56   1.1  macallan 	#define TCSR_DIV_1024	0x28
     57   1.1  macallan 
     58   1.1  macallan /* timers and PWMs */
     59   1.1  macallan #define JZ_TC_TER	0x10002010	/* TC enable reg, ro */
     60   1.1  macallan #define JZ_TC_TESR	0x10002014	/* TC enable set reg. */
     61   1.1  macallan 	#define TESR_TCST0	0x0001	/* enable counter 0 */
     62   1.1  macallan 	#define TESR_TCST1	0x0002	/* enable counter 1 */
     63   1.1  macallan 	#define TESR_TCST2	0x0004	/* enable counter 2 */
     64   1.1  macallan 	#define TESR_TCST3	0x0008	/* enable counter 3 */
     65   1.1  macallan 	#define TESR_TCST4	0x0010	/* enable counter 4 */
     66   1.2  macallan 	#define TESR_TCST5	0x0020	/* enable counter 5 */
     67   1.2  macallan 	#define TESR_TCST6	0x0040	/* enable counter 6 */
     68   1.2  macallan 	#define TESR_TCST7	0x0080	/* enable counter 7 */
     69   1.1  macallan 	#define TESR_OST	0x8000	/* enable OST */
     70   1.1  macallan #define JZ_TC_TECR	0x10002018	/* TC enable clear reg. */
     71   1.2  macallan #define JZ_TC_TFR	0x10002020
     72   1.2  macallan 	#define TFR_FFLAG0	0x00000001	/* channel 0 */
     73   1.2  macallan 	#define TFR_FFLAG1	0x00000002	/* channel 1 */
     74   1.2  macallan 	#define TFR_FFLAG2	0x00000004	/* channel 2 */
     75   1.2  macallan 	#define TFR_FFLAG3	0x00000008	/* channel 3 */
     76   1.2  macallan 	#define TFR_FFLAG4	0x00000010	/* channel 4 */
     77   1.2  macallan 	#define TFR_FFLAG5	0x00000020	/* channel 5 */
     78   1.2  macallan 	#define TFR_FFLAG6	0x00000040	/* channel 6 */
     79   1.2  macallan 	#define TFR_FFLAG7	0x00000080	/* channel 7 */
     80   1.2  macallan 	#define TFR_OSTFLAG	0x00008000	/* OS timer */
     81   1.2  macallan #define JZ_TC_TFSR	0x10002024	/* timer flag set */
     82   1.2  macallan #define JZ_TC_TFCR	0x10002028	/* timer flag clear */
     83   1.2  macallan #define JZ_TC_TMR	0x10002030	/* timer flag mask */
     84   1.2  macallan #define JZ_TC_TMSR	0x10002034	/* timer flag mask set */
     85   1.2  macallan #define JZ_TC_TMCR	0x10002038	/* timer flag mask clear*/
     86   1.2  macallan 
     87   1.2  macallan #define JZ_TC_TDFR(n)	(0x10002040 + (n * 0x10))	/* FULL compare */
     88   1.2  macallan #define JZ_TC_TDHR(n)	(0x10002044 + (n * 0x10))	/* HALF compare */
     89   1.2  macallan #define JZ_TC_TCNT(n)	(0x10002048 + (n * 0x10))	/* count */
     90   1.2  macallan 
     91   1.2  macallan #define JZ_TC_TCSR(n)	(0x1000204c + (n * 0x10))
     92   1.2  macallan /* same bits as in JZ_WDOG_TCSR	*/
     93   1.1  macallan 
     94   1.1  macallan /* operating system timer */
     95   1.1  macallan #define JZ_OST_DATA	0x100020e0	/* compare */
     96   1.1  macallan #define JZ_OST_CNT_LO	0x100020e4
     97   1.1  macallan #define JZ_OST_CNT_HI	0x100020e8
     98   1.1  macallan #define JZ_OST_CTRL	0x100020ec
     99   1.1  macallan 	#define OSTC_PCK_EN	0x0001	/* use PCLK */
    100   1.1  macallan 	#define OSTC_RTC_EN	0x0002	/* use RTCCLK */
    101   1.1  macallan 	#define OSTC_EXT_EN	0x0004	/* use EXTCLK */
    102   1.1  macallan 	#define OSTC_PRESCALE_M	0x0038
    103   1.1  macallan 	#define OSTC_DIV_1	0x0000
    104   1.1  macallan 	#define OSTC_DIV_4	0x0008
    105   1.1  macallan 	#define OSTC_DIV_16	0x0010
    106   1.1  macallan 	#define OSTC_DIV_64	0x0018
    107   1.1  macallan 	#define OSTC_DIV_256	0x0020
    108   1.1  macallan 	#define OSTC_DIV_1024	0x0028
    109   1.1  macallan 	#define OSTC_SHUTDOWN	0x0200
    110   1.1  macallan 	#define OSTC_MODE	0x8000	/* 0 - reset to 0 when = OST_DATA */
    111   1.1  macallan #define JZ_OST_CNT_U32	0x100020fc	/* copy of CNT_HI when reading CNT_LO */
    112   1.1  macallan 
    113   1.1  macallan static inline void
    114   1.1  macallan writereg(uint32_t reg, uint32_t val)
    115   1.1  macallan {
    116   1.1  macallan 	*(int32_t *)MIPS_PHYS_TO_KSEG1(reg) = val;
    117   1.1  macallan 	wbflush();
    118   1.1  macallan }
    119   1.1  macallan 
    120   1.1  macallan static inline uint32_t
    121   1.1  macallan readreg(uint32_t reg)
    122   1.1  macallan {
    123   1.1  macallan 	wbflush();
    124   1.1  macallan 	return *(int32_t *)MIPS_PHYS_TO_KSEG1(reg);
    125   1.1  macallan }
    126   1.1  macallan 
    127   1.2  macallan /* extra CP0 registers */
    128   1.2  macallan static inline uint32_t
    129   1.2  macallan MFC0(uint32_t r, uint32_t s)
    130   1.2  macallan {
    131   1.2  macallan 	uint32_t ret = 0x12345678;
    132   1.2  macallan 
    133   1.2  macallan 	__asm volatile("mfc0 %0, $%1, %2; nop;" : "=r"(ret) : "i"(r), "i"(s));
    134   1.2  macallan 	return ret;
    135   1.2  macallan }
    136   1.2  macallan 
    137   1.2  macallan #define MTC0(v, r, s) __asm volatile("mtc0 %0, $%1, %2; nop;" :: "r"(v), "i"(r), "i"(s))
    138   1.2  macallan 
    139   1.2  macallan #define CP0_CORE_CTRL	12	/* select 2 */
    140   1.2  macallan 	#define CC_SW_RST0	1	/* reset core 0 */
    141   1.2  macallan 	#define CC_SW_RST1	2	/* reset core 1 */
    142   1.2  macallan 	#define CC_RPC0		0x100	/* dedicater reset entry core 0 */
    143   1.2  macallan 	#define CC_RPC1		0x200	/* -- || -- core 1 */
    144   1.2  macallan 	#define CC_SLEEP0M	0x10000	/* mask sleep core 0 */
    145   1.2  macallan 	#define CC_SLEEP1M	0x20000	/* mask sleep core 1 */
    146   1.2  macallan 
    147   1.2  macallan /* cores status, 12 select 3 */
    148   1.2  macallan #define CS_MIRQ0_P	0x00001	/* mailbox IRQ for 0 pending */
    149   1.2  macallan #define CS_MIRQ1_P	0x00002	/* || core 1 */
    150   1.2  macallan #define CS_IRQ0_P	0x00100	/* peripheral IRQ for core 0 */
    151   1.2  macallan #define CS_IRQ1_P	0x00200	/* || core 1 */
    152   1.2  macallan #define CS_SLEEP0	0x10000	/* core 0 sleeping */
    153   1.2  macallan #define CS_SLEEP1	0x20000	/* core 1 sleeping */
    154   1.2  macallan 
    155   1.2  macallan /* cores reset entry & IRQ masks - 12 select 4 */
    156   1.2  macallan #define REIM_MIRQ0_M	0x00001	/* allow mailbox IRQ for core 0 */
    157   1.2  macallan #define REIM_MIRQ1_M	0x00002	/* allow mailbox IRQ for core 1 */
    158   1.2  macallan #define REIM_IRQ0_M	0x00100	/* allow peripheral IRQ for core 0 */
    159   1.2  macallan #define REIM_IRQ1_M	0x00200	/* allow peripheral IRQ for core 1 */
    160   1.2  macallan #define REIM_ENTRY_M	0xffff0000	/* reset exception entry if RPCn=1 */
    161   1.2  macallan 
    162   1.2  macallan #define CP0_CORE_MBOX	20	/* select 0 for core 0, 1 for 1 */
    163   1.2  macallan 
    164   1.3  macallan /* power management */
    165   1.3  macallan #define JZ_CLKGR0	0x10000020	/* CLocK Gating Registers */
    166   1.3  macallan #define JZ_OPCR		0x10000024	/* Oscillator Power Control Reg. */
    167   1.5  macallan 	#define OPCR_IDLE_DIS	0x80000000	/* don't stop CPU clk on idle */
    168   1.5  macallan 	#define OPCR_GPU_CLK_ST	0x40000000	/* stop GPU clock */
    169   1.5  macallan 	#define OPCR_L2CM_M	0x0c000000
    170   1.5  macallan 	#define OPCR_L2CM_ON	0x00000000	/* L2 stays on in sleep */
    171   1.5  macallan 	#define OPCR_L2CM_RET	0x04000000	/* L2 retention mode in sleep */
    172   1.5  macallan 	#define OPCR_L2CM_OFF	0x08000000	/* L2 powers down in sleep */
    173   1.5  macallan 	#define OPCR_SPENDN0	0x00000080	/* OTG port forced down */
    174   1.5  macallan 	#define OPCR_SPENDN1	0x00000040	/* UHC port forced down */
    175   1.5  macallan 	#define OPCR_BUS_MODE	0x00000020	/* 1 - bursts */
    176   1.5  macallan 	#define OPCR_O1SE	0x00000010	/* EXTCLK on in sleep */
    177   1.5  macallan 	#define OPCR_PD		0x00000008	/* P0 down in sleep */
    178   1.5  macallan 	#define OPCR_ERCS	0x00000004	/* 1 RTCCLK, 0 EXTCLK/512 */
    179   1.5  macallan 	#define OPCR_CPU_MODE	0x00000002	/* 1 access 'accelerated' */
    180   1.5  macallan 	#define OPCR_OSE	0x00000001	/* disable EXTCLK */
    181   1.3  macallan #define JZ_CLKGR1	0x10000028	/* CLocK Gating Registers */
    182   1.3  macallan #define JZ_USBPCR	0x1000003c
    183   1.5  macallan 	#define PCR_USB_MODE		0x80000000	/* 1 - otg */
    184   1.5  macallan 	#define PCR_AVLD_REG		0x40000000
    185   1.5  macallan 	#define PCR_IDPULLUP_MASK	0x30000000
    186   1.5  macallan 	#define PCR_INCR_MASK		0x08000000
    187   1.5  macallan 	#define PCR_TCRISETUNE		0x04000000
    188   1.5  macallan 	#define PCR_COMMONONN		0x02000000
    189   1.5  macallan 	#define PCR_VBUSVLDEXT		0x01000000
    190   1.5  macallan 	#define PCR_VBUSVLDEXTSEL	0x00800000
    191   1.5  macallan 	#define PCR_POR			0x00400000
    192   1.5  macallan 	#define PCR_SIDDQ		0x00200000
    193   1.5  macallan 	#define PCR_OTG_DISABLE		0x00100000
    194   1.5  macallan 	#define PCR_COMPDISTN_M		0x000e0000
    195   1.5  macallan 	#define PCR_OTGTUNE		0x0001c000
    196   1.5  macallan 	#define PCR_SQRXTUNE		0x00003800
    197   1.5  macallan 	#define PCR_TXFSLSTUNE		0x00000780
    198   1.5  macallan 	#define PCR_TXPREEMPHTUNE	0x00000040
    199   1.5  macallan 	#define PCR_TXHSXVTUNE		0x00000030
    200   1.5  macallan 	#define PCR_TXVREFTUNE		0x0000000f
    201   1.6  macallan #define JZ_USBRDT	0x10000040	/* Reset Detect Timer Register */
    202   1.3  macallan #define JZ_USBPCR1	0x10000048
    203   1.3  macallan 	#define PCR_SYNOPSYS	0x10000000	/* Mentor mode otherwise */
    204   1.3  macallan 	#define PCR_REFCLK_CORE	0x0c000000
    205   1.3  macallan 	#define PCR_REFCLK_XO25	0x04000000
    206   1.3  macallan 	#define PCR_REFCLK_CO	0x00000000
    207   1.3  macallan 	#define PCR_CLK_M	0x03000000	/* clock */
    208   1.3  macallan 	#define PCR_CLK_192	0x03000000	/* 19.2MHz */
    209   1.3  macallan 	#define PCR_CLK_48	0x02000000	/* 48MHz */
    210   1.3  macallan 	#define PCR_CLK_24	0x01000000	/* 24MHz */
    211   1.3  macallan 	#define PCR_CLK_12	0x00000000	/* 12MHz */
    212   1.3  macallan 	#define PCR_DMPD1	0x00800000	/* pull down D- on port 1 */
    213   1.3  macallan 	#define PCR_DPPD1	0x00400000	/* pull down D+ on port 1 */
    214   1.3  macallan 	#define PCR_PORT0_RST	0x00200000	/* port 0 reset */
    215   1.3  macallan 	#define PCR_PORT1_RST	0x00100000	/* port 1 reset */
    216   1.3  macallan 	#define PCR_WORD_I_F0	0x00080000	/* 1: 16bit/30M, 8/60 otherw. */
    217   1.3  macallan 	#define PCR_WORD_I_F1	0x00040000	/* same for port 1 */
    218   1.3  macallan 	#define PCR_COMPDISTUNE	0x00038000	/* disconnect threshold */
    219   1.3  macallan 	#define PCR_SQRXTUNE1	0x00007000	/* squelch threshold */
    220   1.3  macallan 	#define PCR_TXFSLSTUNE1	0x00000f00	/* FS/LS impedance adj. */
    221   1.3  macallan 	#define PCR_TXPREEMPH	0x00000080	/* HS transm. pre-emphasis */
    222   1.3  macallan 	#define PCR_TXHSXVTUNE1	0x00000060	/* dp/dm voltage adj. */
    223   1.3  macallan 	#define PCR_TXVREFTUNE1	0x00000017	/* HS DC voltage adj. */
    224   1.8  macallan 	#define PCR_TXRISETUNE1	0x00000001	/* rise/fall wave adj. */
    225   1.6  macallan 
    226   1.6  macallan #define JZ_UHCCDR	0x1000006c	/* UHC Clock Divider Register */
    227   1.3  macallan #define JZ_SPCR0	0x100000b8	/* SRAM Power Control Registers */
    228   1.3  macallan #define JZ_SPCR1	0x100000bc
    229   1.3  macallan #define JZ_SRBC		0x100000c4	/* Soft Reset & Bus Control */
    230   1.3  macallan 
    231   1.2  macallan /* interrupt controller */
    232   1.2  macallan #define JZ_ICSR0	0x10001000	/* raw IRQ line status */
    233   1.2  macallan #define JZ_ICMR0	0x10001004	/* IRQ mask, 1 masks IRQ */
    234   1.2  macallan #define JZ_ICMSR0	0x10001008	/* sets bits in mask register */
    235   1.9  macallan #define JZ_ICMCR0	0x1000100c	/* clears bits in mask register */
    236   1.2  macallan #define JZ_ICPR0	0x10001010	/* line status after masking */
    237   1.2  macallan 
    238   1.2  macallan #define JZ_ICSR1	0x10001020	/* raw IRQ line status */
    239   1.2  macallan #define JZ_ICMR1	0x10001024	/* IRQ mask, 1 masks IRQ */
    240   1.2  macallan #define JZ_ICMSR1	0x10001028	/* sets bits in mask register */
    241   1.2  macallan #define JZ_ICMCR1	0x1000102c	/* clears bits in maks register */
    242   1.2  macallan #define JZ_ICPR1	0x10001030	/* line status after masking */
    243   1.2  macallan 
    244   1.2  macallan #define JZ_DSR0		0x10001034	/* source for PDMA */
    245   1.2  macallan #define JZ_DMR0		0x10001038	/* mask for PDMA */
    246   1.2  macallan #define JZ_DPR0		0x1000103c	/* pending for PDMA */
    247   1.2  macallan 
    248   1.2  macallan #define JZ_DSR1		0x10001040	/* source for PDMA */
    249   1.2  macallan #define JZ_DMR1		0x10001044	/* mask for PDMA */
    250   1.2  macallan #define JZ_DPR1		0x10001048	/* pending for PDMA */
    251   1.2  macallan 
    252   1.7  macallan /* memory controller */
    253   1.7  macallan #define JZ_DMMAP0	0x13010024
    254   1.7  macallan #define JZ_DMMAP1	0x13010028
    255   1.7  macallan 	#define	DMMAP_BASE	0x0000ff00	/* base PADDR of memory chunk */
    256   1.7  macallan 	#define DMMAP_MASK	0x000000ff	/* mask which bits of PADDR are
    257   1.7  macallan 						 * constant */
    258   1.8  macallan /* USB controllers */
    259   1.8  macallan #define JZ_EHCI_BASE	0x13490000
    260   1.8  macallan #define JZ_OHCI_BASE	0x134a0000
    261   1.8  macallan #define JZ_DWC2_BASE	0x13500000
    262   1.8  macallan 
    263   1.8  macallan /* Ethernet */
    264   1.8  macallan #define JZ_DME_BASE	0x16000000
    265   1.9  macallan #define JZ_DME_IO	0
    266   1.9  macallan #define JZ_DME_DATA	2
    267   1.7  macallan 
    268   1.9  macallan /* GPIO */
    269   1.9  macallan #define JZ_GPIO_A_BASE	0x10010000
    270   1.9  macallan #define JZ_GPIO_B_BASE	0x10010100
    271   1.9  macallan #define JZ_GPIO_C_BASE	0x10010200
    272   1.9  macallan #define JZ_GPIO_D_BASE	0x10010300
    273   1.9  macallan #define JZ_GPIO_E_BASE	0x10010400
    274   1.9  macallan #define JZ_GPIO_F_BASE	0x10010500
    275   1.9  macallan 
    276   1.9  macallan /* GPIO registers per port */
    277   1.9  macallan #define JZ_GPIO_PIN	0x00000000	/* pin level register */
    278   1.9  macallan /* 0 - normal gpio, 1 - interrupt */
    279   1.9  macallan #define JZ_GPIO_INT	0x00000010	/* interrupt register */
    280   1.9  macallan #define JZ_GPIO_INTS	0x00000014	/* interrupt set register */
    281   1.9  macallan #define JZ_GPIO_INTC	0x00000018	/* interrupt clear register */
    282   1.9  macallan /*
    283   1.9  macallan  * INT == 1: 1 disables interrupt
    284   1.9  macallan  * INT == 0: device select, see below
    285   1.9  macallan  */
    286   1.9  macallan #define JZ_GPIO_MASK	0x00000020	/* port mask register */
    287   1.9  macallan #define JZ_GPIO_MASKS	0x00000024	/* port mask set register */
    288   1.9  macallan #define JZ_GPIO_MASKC	0x00000028	/* port mask clear register */
    289   1.9  macallan /*
    290   1.9  macallan  * INT == 1: 0 - level triggered, 1 - edge triggered
    291   1.9  macallan  * INT == 0: 0 - device select, see below
    292   1.9  macallan  */
    293   1.9  macallan #define JZ_GPIO_PAT1	0x00000030	/* pattern 1 register */
    294   1.9  macallan #define JZ_GPIO_PAT1S	0x00000034	/* pattern 1 set register */
    295   1.9  macallan #define JZ_GPIO_PAT1C	0x00000038	/* pattern 1 clear register */
    296   1.9  macallan /*
    297   1.9  macallan  * INT == 1:
    298   1.9  macallan  *   PAT1 == 0: 0 - trigger on low, 1 - trigger on high
    299   1.9  macallan  *   PAT1 == 1: 0 - trigger on falling edge, 1 - trigger on rising edge
    300   1.9  macallan  * INT == 0:
    301   1.9  macallan  *   MASK == 0:
    302   1.9  macallan  *     PAT1 == 0: 0 - device 0, 1 - device 1
    303   1.9  macallan  *     PAT1 == 1: 0 - device 2, 1 - device 3
    304   1.9  macallan  *   MASK == 1:
    305   1.9  macallan  *     PAT1 == 0: set gpio output
    306   1.9  macallan  *     PAT1 == 1: pin is input
    307   1.9  macallan  */
    308   1.9  macallan #define JZ_GPIO_PAT0	0x00000040	/* pattern 0 register */
    309   1.9  macallan #define JZ_GPIO_PAT0S	0x00000044	/* pattern 0 set register */
    310   1.9  macallan #define JZ_GPIO_PAT0C	0x00000048	/* pattern 0 clear register */
    311   1.9  macallan /* 1 - interrupt happened */
    312   1.9  macallan #define JZ_GPIO_FLAG	0x00000050	/* flag register */
    313   1.9  macallan #define JZ_GPIO_FLAGC	0x00000058	/* flag clear register */
    314   1.9  macallan /* 1 - disable pull up/down resistors */
    315   1.9  macallan #define JZ_GPIO_DPULL	0x00000070	/* pull disable register */
    316   1.9  macallan #define JZ_GPIO_DPULLS	0x00000074	/* pull disable set register */
    317   1.9  macallan #define JZ_GPIO_DPULLC	0x00000078	/* pull disable clear register */
    318   1.9  macallan /* the following are uncommented in the manual */
    319   1.9  macallan #define JZ_GPIO_DRVL	0x00000080	/* drive low register */
    320   1.9  macallan #define JZ_GPIO_DRVLS	0x00000084	/* drive low set register */
    321   1.9  macallan #define JZ_GPIO_DRVLC	0x00000088	/* drive low clear register */
    322   1.9  macallan #define JZ_GPIO_DIR	0x00000090	/* direction register */
    323   1.9  macallan #define JZ_GPIO_DIRS	0x00000094	/* direction register */
    324   1.9  macallan #define JZ_GPIO_DIRC	0x00000098	/* direction register */
    325   1.9  macallan #define JZ_GPIO_DRVH	0x000000a0	/* drive high register */
    326   1.9  macallan #define JZ_GPIO_DRVHS	0x000000a4	/* drive high set register */
    327   1.9  macallan #define JZ_GPIO_DRVHC	0x000000a8	/* drive high clear register */
    328   1.9  macallan 
    329   1.9  macallan static inline void
    330   1.9  macallan gpio_as_output(uint32_t g, int pin)
    331   1.9  macallan {
    332   1.9  macallan 	uint32_t mask = 1 << pin;
    333   1.9  macallan 	uint32_t reg = JZ_GPIO_A_BASE + (g << 8);
    334   1.9  macallan 
    335   1.9  macallan 	writereg(reg + JZ_GPIO_INTC, mask);	/* use as gpio */
    336   1.9  macallan 	writereg(reg + JZ_GPIO_MASKS, mask);
    337   1.9  macallan 	writereg(reg + JZ_GPIO_PAT1C, mask);	/* make output */
    338   1.9  macallan }
    339   1.9  macallan 
    340   1.9  macallan static inline void
    341   1.9  macallan gpio_set(uint32_t g, int pin, int level)
    342   1.9  macallan {
    343   1.9  macallan 	uint32_t mask = 1 << pin;
    344   1.9  macallan 	uint32_t reg = JZ_GPIO_A_BASE + (g << 8);
    345   1.9  macallan 
    346   1.9  macallan 	reg += (level == 0) ? JZ_GPIO_PAT0C : JZ_GPIO_PAT0S;
    347   1.9  macallan 	writereg(reg, mask);
    348   1.9  macallan }
    349   1.9  macallan 
    350   1.9  macallan static inline void
    351   1.9  macallan gpio_as_dev0(uint32_t g, int pin)
    352   1.9  macallan {
    353   1.9  macallan 	uint32_t mask = 1 << pin;
    354   1.9  macallan 	uint32_t reg = JZ_GPIO_A_BASE + (g << 8);
    355   1.9  macallan 
    356   1.9  macallan 	writereg(reg + JZ_GPIO_INTC, mask);	/* use as gpio */
    357   1.9  macallan 	writereg(reg + JZ_GPIO_MASKC, mask);	/* device mode */
    358   1.9  macallan 	writereg(reg + JZ_GPIO_PAT1C, mask);	/* select 0 */
    359   1.9  macallan 	writereg(reg + JZ_GPIO_PAT0C, mask);
    360   1.9  macallan }
    361   1.9  macallan 
    362   1.9  macallan static inline void
    363   1.9  macallan gpio_as_intr_level(uint32_t g, int pin)
    364   1.9  macallan {
    365   1.9  macallan 	uint32_t mask = 1 << pin;
    366   1.9  macallan 	uint32_t reg = JZ_GPIO_A_BASE + (g << 8);
    367   1.9  macallan 
    368   1.9  macallan 	writereg(reg + JZ_GPIO_MASKS, mask);	/* mask it */
    369   1.9  macallan 	writereg(reg + JZ_GPIO_INTS, mask);	/* use as interrupt */
    370   1.9  macallan 	writereg(reg + JZ_GPIO_PAT1C, mask);	/* level trigger */
    371   1.9  macallan 	writereg(reg + JZ_GPIO_PAT0S, mask);	/* trigger on high */
    372   1.9  macallan 	writereg(reg + JZ_GPIO_FLAGC, mask);	/* clear it */
    373   1.9  macallan 	writereg(reg + JZ_GPIO_MASKC, mask);	/* enable it */
    374   1.9  macallan }
    375  1.10  macallan 
    376  1.10  macallan /* I2C / SMBus */
    377  1.10  macallan #define JZ_SMB0_BASE	0x10050000
    378  1.10  macallan #define JZ_SMB1_BASE	0x10051000
    379  1.10  macallan #define JZ_SMB2_BASE	0x10052000
    380  1.10  macallan #define JZ_SMB3_BASE	0x10053000
    381  1.10  macallan #define JZ_SMB4_BASE	0x10054000
    382  1.10  macallan 
    383   1.2  macallan #endif /* INGENIC_REGS_H */
    384