1155324Simp/*-
2155324Simp * Copyright (c) 2005 Olivier Houchard.  All rights reserved.
3155324Simp *
4155324Simp * Redistribution and use in source and binary forms, with or without
5155324Simp * modification, are permitted provided that the following conditions
6155324Simp * are met:
7155324Simp * 1. Redistributions of source code must retain the above copyright
8155324Simp *    notice, this list of conditions and the following disclaimer.
9155324Simp * 2. Redistributions in binary form must reproduce the above copyright
10155324Simp *    notice, this list of conditions and the following disclaimer in the
11155324Simp *    documentation and/or other materials provided with the distribution.
12155324Simp *
13185265Simp * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14185265Simp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15185265Simp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16185265Simp * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17185265Simp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18185265Simp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19185265Simp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20185265Simp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21185265Simp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22185265Simp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23185265Simp * SUCH DAMAGE.
24155324Simp */
25155324Simp
26155324Simp/* $FreeBSD$ */
27155324Simp
28155324Simp#ifndef _AT91VAR_H_
29155324Simp#define _AT91VAR_H_
30155324Simp
31213496Scognet#include <sys/bus.h>
32155324Simp#include <sys/rman.h>
33155324Simp
34213496Scognet#include <arm/at91/at91reg.h>
35213496Scognet
36155324Simpstruct at91_softc {
37155324Simp	device_t dev;
38155324Simp	bus_space_tag_t sc_st;
39155324Simp	bus_space_handle_t sc_sh;
40213496Scognet	bus_space_handle_t sc_aic_sh;
41155324Simp	struct rman sc_irq_rman;
42155324Simp	struct rman sc_mem_rman;
43155324Simp};
44155324Simp
45155324Simpstruct at91_ivar {
46155324Simp	struct resource_list resources;
47155324Simp};
48155324Simp
49213496Scognetstruct cpu_devs
50213496Scognet{
51213496Scognet	const char *name;
52213496Scognet	int unit;
53213496Scognet	bus_addr_t mem_base;
54213496Scognet	bus_size_t mem_len;
55213496Scognet	int irq0;
56213496Scognet	int irq1;
57213496Scognet	int irq2;
58213496Scognet	const char *parent_clk;
59213496Scognet};
60213496Scognet
61236658Simpenum at91_soc_type {
62236658Simp	AT91_T_NONE = 0,
63236658Simp	AT91_T_CAP9,
64236658Simp	AT91_T_RM9200,
65236658Simp	AT91_T_SAM9260,
66236658Simp	AT91_T_SAM9261,
67236658Simp	AT91_T_SAM9263,
68236658Simp	AT91_T_SAM9G10,
69236658Simp	AT91_T_SAM9G20,
70236658Simp	AT91_T_SAM9G45,
71236658Simp	AT91_T_SAM9N12,
72236658Simp	AT91_T_SAM9RL,
73236658Simp	AT91_T_SAM9X5,
74236658Simp};
75213496Scognet
76236658Simpenum at91_soc_subtype {
77238376Simp	AT91_ST_ANY = -1,	/* Match any type */
78236658Simp	AT91_ST_NONE = 0,
79236658Simp	/* AT91RM9200 */
80236658Simp	AT91_ST_RM9200_BGA,
81236658Simp	AT91_ST_RM9200_PQFP,
82236658Simp	/* AT91SAM9260 */
83236658Simp	AT91_ST_SAM9XE,
84236658Simp	/* AT91SAM9G45 */
85236658Simp	AT91_ST_SAM9G45,
86236658Simp	AT91_ST_SAM9M10,
87236658Simp	AT91_ST_SAM9G46,
88236658Simp	AT91_ST_SAM9M11,
89236658Simp	/* AT91SAM9X5 */
90236658Simp	AT91_ST_SAM9G15,
91236658Simp	AT91_ST_SAM9G25,
92236658Simp	AT91_ST_SAM9G35,
93236658Simp	AT91_ST_SAM9X25,
94236658Simp	AT91_ST_SAM9X35,
95236658Simp};
96236658Simp
97236658Simpenum at91_soc_family {
98236658Simp	AT91_FAMILY_SAM9 = 0x19,
99236658Simp	AT91_FAMILY_SAM9XE = 0x29,
100236658Simp	AT91_FAMILY_RM92 = 0x92,
101236658Simp};
102236658Simp
103236658Simp#define AT91_SOC_NAME_MAX 50
104236658Simp
105237130Simptypedef void (*DELAY_t)(int);
106237130Simptypedef void (*cpu_reset_t)(void);
107238397Simptypedef void (*clk_init_t)(void);
108237130Simp
109238376Simpstruct at91_soc_data {
110260696Simp	DELAY_t		soc_delay;		/* SoC specific delay function */
111260696Simp	cpu_reset_t	soc_reset;		/* SoC specific reset function */
112260696Simp	clk_init_t      soc_clock_init;		/* SoC specific clock init function */
113260696Simp	const int	*soc_irq_prio;		/* SoC specific IRQ priorities */
114260696Simp	const struct cpu_devs *soc_children;	/* SoC specific children list */
115260696Simp	const uint32_t  *soc_pio_base;		/* SoC specific PIO base registers */
116260696Simp	size_t          soc_pio_count;		/* Count of PIO units (not pins) in SoC */
117238376Simp};
118238376Simp
119236658Simpstruct at91_soc_info {
120236658Simp	enum at91_soc_type type;
121236658Simp	enum at91_soc_subtype subtype;
122236658Simp	enum at91_soc_family family;
123236658Simp	uint32_t cidr;
124236658Simp	uint32_t exid;
125236658Simp	char name[AT91_SOC_NAME_MAX];
126238403Simp	uint32_t dbgu_base;
127238376Simp	struct at91_soc_data *soc_data;
128236658Simp};
129236658Simp
130238376Simpextern struct at91_soc_info soc_info;
131236658Simp
132213496Scognetstatic inline int at91_is_rm92(void);
133234281Smariusstatic inline int at91_is_sam9(void);
134234291Smariusstatic inline int at91_is_sam9xe(void);
135213496Scognetstatic inline int at91_cpu_is(u_int cpu);
136213496Scognet
137234281Smariusstatic inline int
138234281Smariusat91_is_rm92(void)
139213496Scognet{
140234281Smarius
141238376Simp	return (soc_info.type == AT91_T_RM9200);
142213496Scognet}
143213496Scognet
144234281Smariusstatic inline int
145234281Smariusat91_is_sam9(void)
146213496Scognet{
147234281Smarius
148238376Simp	return (soc_info.family == AT91_FAMILY_SAM9);
149213496Scognet}
150213496Scognet
151234281Smariusstatic inline int
152234291Smariusat91_is_sam9xe(void)
153234291Smarius{
154234291Smarius
155238376Simp	return (soc_info.family == AT91_FAMILY_SAM9XE);
156234291Smarius}
157234291Smarius
158234291Smariusstatic inline int
159213496Scognetat91_cpu_is(u_int cpu)
160213496Scognet{
161234281Smarius
162238376Simp	return (soc_info.type == cpu);
163213496Scognet}
164213496Scognet
165238334Simpvoid at91_add_child(device_t dev, int prio, const char *name, int unit,
166238334Simp    bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2);
167238334Simp
168213496Scognetextern uint32_t at91_irq_system;
169187599Simpextern uint32_t at91_master_clock;
170236215Simpvoid at91_pmc_init_clock(void);
171262923Simpvoid at91_soc_id(void);
172236215Simp
173155324Simp#endif /* _AT91VAR_H_ */
174