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