1*282e735eSvisa /* $OpenBSD: platform.c,v 1.26 2021/04/24 07:49:11 visa Exp $ */ 2f93d18d6Sjsg /* 3f93d18d6Sjsg * Copyright (c) 2014 Patrick Wildt <patrick@blueri.se> 4f93d18d6Sjsg * 5f93d18d6Sjsg * Permission to use, copy, modify, and distribute this software for any 6f93d18d6Sjsg * purpose with or without fee is hereby granted, provided that the above 7f93d18d6Sjsg * copyright notice and this permission notice appear in all copies. 8f93d18d6Sjsg * 9f93d18d6Sjsg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10f93d18d6Sjsg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11f93d18d6Sjsg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12f93d18d6Sjsg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13f93d18d6Sjsg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14f93d18d6Sjsg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15f93d18d6Sjsg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16f93d18d6Sjsg */ 17f93d18d6Sjsg 18f93d18d6Sjsg #include <sys/param.h> 19f93d18d6Sjsg 20f93d18d6Sjsg #include <machine/bus.h> 21f93d18d6Sjsg 22eeb18b9dSjsg #include <arm/mainbus/mainbus.h> 23f93d18d6Sjsg #include <armv7/armv7/armv7var.h> 24f93d18d6Sjsg #include <armv7/armv7/armv7_machdep.h> 25f93d18d6Sjsg #include <arm/cortex/smc.h> 26f93d18d6Sjsg 27f93d18d6Sjsg #include "omap.h" 28f93d18d6Sjsg 29f93d18d6Sjsg static struct armv7_platform *platform; 30f93d18d6Sjsg 3124e5cb75Skettenis void agtimer_init(void); 3224e5cb75Skettenis 33*282e735eSvisa extern void cduart_init_cons(void); 34917650c7Skettenis extern void exuart_init_cons(void); 35917650c7Skettenis extern void imxuart_init_cons(void); 36917650c7Skettenis extern void com_fdt_init_cons(void); 37917650c7Skettenis extern void pluart_init_cons(void); 38917650c7Skettenis extern void simplefb_init_cons(bus_space_tag_t); 39557e6971Sjsg 40f93d18d6Sjsg struct armv7_platform *omap_platform_match(void); 41f93d18d6Sjsg 42f93d18d6Sjsg struct armv7_platform * (*plat_match[])(void) = { 43f93d18d6Sjsg #if NOMAP > 0 44f93d18d6Sjsg omap_platform_match, 45f93d18d6Sjsg #endif 46f93d18d6Sjsg }; 47f93d18d6Sjsg 48eeb18b9dSjsg struct board_dev no_devs[] = { 49eeb18b9dSjsg { NULL, 0 } 50eeb18b9dSjsg }; 51eeb18b9dSjsg 52f93d18d6Sjsg void 53f93d18d6Sjsg platform_init(void) 54f93d18d6Sjsg { 55f93d18d6Sjsg int i; 56f93d18d6Sjsg 5724e5cb75Skettenis agtimer_init(); 5824e5cb75Skettenis 59f93d18d6Sjsg for (i = 0; i < nitems(plat_match); i++) { 60f93d18d6Sjsg platform = plat_match[i](); 61f93d18d6Sjsg if (platform != NULL) 62f93d18d6Sjsg break; 63f93d18d6Sjsg } 648f9e784cSpatrick 658f9e784cSpatrick if (platform == NULL) 668f9e784cSpatrick return; 678f9e784cSpatrick 688f9e784cSpatrick cpuresetfn = platform_watchdog_reset; 6903a61905Sjsg powerdownfn = platform_powerdown; 708f9e784cSpatrick if (platform->board_init) 71a6e67600Sjsg platform->board_init(); 72f93d18d6Sjsg } 73f93d18d6Sjsg 74f93d18d6Sjsg void 75f93d18d6Sjsg platform_smc_write(bus_space_tag_t iot, bus_space_handle_t ioh, bus_size_t off, 76f93d18d6Sjsg uint32_t op, uint32_t val) 77f93d18d6Sjsg { 78eeb18b9dSjsg if (platform && platform->smc_write) 79f93d18d6Sjsg platform->smc_write(iot, ioh, off, op, val); 80eeb18b9dSjsg else 81eeb18b9dSjsg bus_space_write_4(iot, ioh, off, val); 82f93d18d6Sjsg } 83f93d18d6Sjsg 84f93d18d6Sjsg void 85f93d18d6Sjsg platform_init_cons(void) 86f93d18d6Sjsg { 87557e6971Sjsg if (platform && platform->init_cons) { 88f93d18d6Sjsg platform->init_cons(); 89557e6971Sjsg return; 90557e6971Sjsg } 91*282e735eSvisa cduart_init_cons(); 92557e6971Sjsg exuart_init_cons(); 93557e6971Sjsg imxuart_init_cons(); 94769dc45fSpatrick com_fdt_init_cons(); 95360d91c8Sjsg pluart_init_cons(); 96917650c7Skettenis simplefb_init_cons(&armv7_bs_tag); 97f93d18d6Sjsg } 98f93d18d6Sjsg 99f93d18d6Sjsg void 1004a91dee8Skettenis platform_init_mainbus(struct device *self) 1014a91dee8Skettenis { 102eeb18b9dSjsg if (platform && platform->init_mainbus) 1034a91dee8Skettenis platform->init_mainbus(self); 104eeb18b9dSjsg else 105eeb18b9dSjsg mainbus_legacy_found(self, "cortex"); 1064a91dee8Skettenis } 1074a91dee8Skettenis 1084a91dee8Skettenis void 109f93d18d6Sjsg platform_watchdog_reset(void) 110f93d18d6Sjsg { 111eeb18b9dSjsg if (platform && platform->watchdog_reset) 112f93d18d6Sjsg platform->watchdog_reset(); 113f93d18d6Sjsg } 114f93d18d6Sjsg 115f93d18d6Sjsg void 116f93d18d6Sjsg platform_powerdown(void) 117f93d18d6Sjsg { 118eeb18b9dSjsg if (platform && platform->powerdown) 119f93d18d6Sjsg platform->powerdown(); 120f93d18d6Sjsg } 121f93d18d6Sjsg 122f93d18d6Sjsg struct board_dev * 123f93d18d6Sjsg platform_board_devs() 124f93d18d6Sjsg { 125eeb18b9dSjsg if (platform && platform->devs) 126f93d18d6Sjsg return (platform->devs); 127eeb18b9dSjsg else 128eeb18b9dSjsg return (no_devs); 129f93d18d6Sjsg } 130