xref: /openbsd/sys/arch/armv7/armv7/platform.c (revision f93d18d6)
1*f93d18d6Sjsg /*	$OpenBSD: platform.c,v 1.1 2015/05/19 03:30:54 jsg Exp $	*/
2*f93d18d6Sjsg /*
3*f93d18d6Sjsg  * Copyright (c) 2014 Patrick Wildt <patrick@blueri.se>
4*f93d18d6Sjsg  *
5*f93d18d6Sjsg  * Permission to use, copy, modify, and distribute this software for any
6*f93d18d6Sjsg  * purpose with or without fee is hereby granted, provided that the above
7*f93d18d6Sjsg  * copyright notice and this permission notice appear in all copies.
8*f93d18d6Sjsg  *
9*f93d18d6Sjsg  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*f93d18d6Sjsg  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*f93d18d6Sjsg  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*f93d18d6Sjsg  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*f93d18d6Sjsg  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*f93d18d6Sjsg  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*f93d18d6Sjsg  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*f93d18d6Sjsg  */
17*f93d18d6Sjsg 
18*f93d18d6Sjsg #include <sys/param.h>
19*f93d18d6Sjsg #include <sys/types.h>
20*f93d18d6Sjsg #include <sys/systm.h>
21*f93d18d6Sjsg 
22*f93d18d6Sjsg #include <machine/bus.h>
23*f93d18d6Sjsg 
24*f93d18d6Sjsg #include <armv7/armv7/armv7var.h>
25*f93d18d6Sjsg #include <armv7/armv7/armv7_machdep.h>
26*f93d18d6Sjsg #include <arm/cortex/smc.h>
27*f93d18d6Sjsg 
28*f93d18d6Sjsg #include "imx.h"
29*f93d18d6Sjsg #include "omap.h"
30*f93d18d6Sjsg #include "sunxi.h"
31*f93d18d6Sjsg 
32*f93d18d6Sjsg static struct armv7_platform *platform;
33*f93d18d6Sjsg 
34*f93d18d6Sjsg struct armv7_platform *imx_platform_match(void);
35*f93d18d6Sjsg struct armv7_platform *omap_platform_match(void);
36*f93d18d6Sjsg struct armv7_platform *sunxi_platform_match(void);
37*f93d18d6Sjsg 
38*f93d18d6Sjsg struct armv7_platform * (*plat_match[])(void) = {
39*f93d18d6Sjsg #if NIMX > 0
40*f93d18d6Sjsg 	imx_platform_match,
41*f93d18d6Sjsg #endif
42*f93d18d6Sjsg #if NOMAP > 0
43*f93d18d6Sjsg 	omap_platform_match,
44*f93d18d6Sjsg #endif
45*f93d18d6Sjsg #if NSUNXI > 0
46*f93d18d6Sjsg 	sunxi_platform_match,
47*f93d18d6Sjsg #endif
48*f93d18d6Sjsg };
49*f93d18d6Sjsg 
50*f93d18d6Sjsg void
51*f93d18d6Sjsg platform_init(void)
52*f93d18d6Sjsg {
53*f93d18d6Sjsg 	int i;
54*f93d18d6Sjsg 
55*f93d18d6Sjsg 	for (i = 0; i < nitems(plat_match); i++) {
56*f93d18d6Sjsg 		platform = plat_match[i]();
57*f93d18d6Sjsg 		if (platform != NULL)
58*f93d18d6Sjsg 			break;
59*f93d18d6Sjsg 	}
60*f93d18d6Sjsg 	if (platform == NULL)
61*f93d18d6Sjsg 		panic("no matching armv7 platform");
62*f93d18d6Sjsg }
63*f93d18d6Sjsg 
64*f93d18d6Sjsg const char *
65*f93d18d6Sjsg platform_boot_name(void)
66*f93d18d6Sjsg {
67*f93d18d6Sjsg 	return platform->boot_name;
68*f93d18d6Sjsg }
69*f93d18d6Sjsg 
70*f93d18d6Sjsg void
71*f93d18d6Sjsg platform_smc_write(bus_space_tag_t iot, bus_space_handle_t ioh, bus_size_t off,
72*f93d18d6Sjsg     uint32_t op, uint32_t val)
73*f93d18d6Sjsg {
74*f93d18d6Sjsg 	platform->smc_write(iot, ioh, off, op, val);
75*f93d18d6Sjsg }
76*f93d18d6Sjsg 
77*f93d18d6Sjsg void
78*f93d18d6Sjsg platform_init_cons(void)
79*f93d18d6Sjsg {
80*f93d18d6Sjsg 	platform->init_cons();
81*f93d18d6Sjsg }
82*f93d18d6Sjsg 
83*f93d18d6Sjsg void
84*f93d18d6Sjsg platform_watchdog_reset(void)
85*f93d18d6Sjsg {
86*f93d18d6Sjsg 	platform->watchdog_reset();
87*f93d18d6Sjsg }
88*f93d18d6Sjsg 
89*f93d18d6Sjsg void
90*f93d18d6Sjsg platform_powerdown(void)
91*f93d18d6Sjsg {
92*f93d18d6Sjsg 	platform->powerdown();
93*f93d18d6Sjsg }
94*f93d18d6Sjsg 
95*f93d18d6Sjsg const char *
96*f93d18d6Sjsg platform_board_name(void)
97*f93d18d6Sjsg {
98*f93d18d6Sjsg 	return (platform->board_name());
99*f93d18d6Sjsg }
100*f93d18d6Sjsg 
101*f93d18d6Sjsg void
102*f93d18d6Sjsg platform_disable_l2_if_needed(void)
103*f93d18d6Sjsg {
104*f93d18d6Sjsg 	platform->disable_l2_if_needed();
105*f93d18d6Sjsg }
106*f93d18d6Sjsg 
107*f93d18d6Sjsg struct board_dev *
108*f93d18d6Sjsg platform_board_devs()
109*f93d18d6Sjsg {
110*f93d18d6Sjsg 	return (platform->devs);
111*f93d18d6Sjsg }
112*f93d18d6Sjsg 
113*f93d18d6Sjsg void
114*f93d18d6Sjsg platform_board_init()
115*f93d18d6Sjsg {
116*f93d18d6Sjsg 	platform->board_init();
117*f93d18d6Sjsg }
118