at91var.h revision 238397
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 238397 2012-07-12 13:45:58Z 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];
124238376Simp	struct at91_soc_data *soc_data;
125236658Simp};
126236658Simp
127238376Simpextern struct at91_soc_info soc_info;
128236658Simp
129213496Scognetstatic inline int at91_is_rm92(void);
130234281Smariusstatic inline int at91_is_sam9(void);
131234291Smariusstatic inline int at91_is_sam9xe(void);
132213496Scognetstatic inline int at91_cpu_is(u_int cpu);
133213496Scognet
134234281Smariusstatic inline int
135234281Smariusat91_is_rm92(void)
136213496Scognet{
137234281Smarius
138238376Simp	return (soc_info.type == AT91_T_RM9200);
139213496Scognet}
140213496Scognet
141234281Smariusstatic inline int
142234281Smariusat91_is_sam9(void)
143213496Scognet{
144234281Smarius
145238376Simp	return (soc_info.family == AT91_FAMILY_SAM9);
146213496Scognet}
147213496Scognet
148234281Smariusstatic inline int
149234291Smariusat91_is_sam9xe(void)
150234291Smarius{
151234291Smarius
152238376Simp	return (soc_info.family == AT91_FAMILY_SAM9XE);
153234291Smarius}
154234291Smarius
155234291Smariusstatic inline int
156213496Scognetat91_cpu_is(u_int cpu)
157213496Scognet{
158234281Smarius
159238376Simp	return (soc_info.type == cpu);
160213496Scognet}
161213496Scognet
162238334Simpvoid at91_add_child(device_t dev, int prio, const char *name, int unit,
163238334Simp    bus_addr_t addr, bus_size_t size, int irq0, int irq1, int irq2);
164238334Simp
165213496Scognetextern uint32_t at91_irq_system;
166187599Simpextern uint32_t at91_master_clock;
167236215Simpvoid at91_pmc_init_clock(void);
168236215Simp
169155324Simp#endif /* _AT91VAR_H_ */
170