at91var.h revision 238403
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: head/sys/arm/at91/at91var.h 238403 2012-07-12 19:11:37Z imp $ */
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 {
110238376Simp	DELAY_t		soc_delay;
111238376Simp	cpu_reset_t	soc_reset;
112238397Simp	clk_init_t      soc_clock_init;
113238389Simp	const int	*soc_irq_prio;
114238390Simp	const struct cpu_devs *soc_children;
115238376Simp};
116238376Simp
117236658Simpstruct at91_soc_info {
118236658Simp	enum at91_soc_type type;
119236658Simp	enum at91_soc_subtype subtype;
120236658Simp	enum at91_soc_family family;
121236658Simp	uint32_t cidr;
122236658Simp	uint32_t exid;
123236658Simp	char name[AT91_SOC_NAME_MAX];
124238403Simp	uint32_t dbgu_base;
125238376Simp	struct at91_soc_data *soc_data;
126236658Simp};
127236658Simp
128238376Simpextern struct at91_soc_info soc_info;
129236658Simp
130213496Scognetstatic inline int at91_is_rm92(void);
131234281Smariusstatic inline int at91_is_sam9(void);
132234291Smariusstatic inline int at91_is_sam9xe(void);
133213496Scognetstatic inline int at91_cpu_is(u_int cpu);
134213496Scognet
135234281Smariusstatic inline int
136234281Smariusat91_is_rm92(void)
137213496Scognet{
138234281Smarius
139238376Simp	return (soc_info.type == AT91_T_RM9200);
140213496Scognet}
141213496Scognet
142234281Smariusstatic inline int
143234281Smariusat91_is_sam9(void)
144213496Scognet{
145234281Smarius
146238376Simp	return (soc_info.family == AT91_FAMILY_SAM9);
147213496Scognet}
148213496Scognet
149234281Smariusstatic inline int
150234291Smariusat91_is_sam9xe(void)
151234291Smarius{
152234291Smarius
153238376Simp	return (soc_info.family == AT91_FAMILY_SAM9XE);
154234291Smarius}
155234291Smarius
156234291Smariusstatic inline int
157213496Scognetat91_cpu_is(u_int cpu)
158213496Scognet{
159234281Smarius
160238376Simp	return (soc_info.type == cpu);
161213496Scognet}
162213496Scognet
163238334Simpvoid at91_add_child(device_t dev, int prio, const char *name, int unit,
164238334Simp    bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2);
165238334Simp
166213496Scognetextern uint32_t at91_irq_system;
167187599Simpextern uint32_t at91_master_clock;
168236215Simpvoid at91_pmc_init_clock(void);
169236215Simp
170155324Simp#endif /* _AT91VAR_H_ */
171