1266301Sandrew/*- 2266301Sandrew * Copyright (c) 2005 Peter Grehan 3266301Sandrew * All rights reserved. 4266301Sandrew * 5266301Sandrew * Redistribution and use in source and binary forms, with or without 6266301Sandrew * modification, are permitted provided that the following conditions 7266301Sandrew * are met: 8266301Sandrew * 1. Redistributions of source code must retain the above copyright 9266301Sandrew * notice, this list of conditions and the following disclaimer. 10266301Sandrew * 2. Redistributions in binary form must reproduce the above copyright 11266301Sandrew * notice, this list of conditions and the following disclaimer in the 12266301Sandrew * documentation and/or other materials provided with the distribution. 13266301Sandrew * 14266301Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15266301Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16266301Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17266301Sandrew * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18266301Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19266301Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20266301Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21266301Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22266301Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23266301Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24266301Sandrew * SUCH DAMAGE. 25266301Sandrew * 26266301Sandrew * $FreeBSD: stable/11/sys/arm/include/platformvar.h 331907 2018-04-03 06:06:39Z gonzo $ 27266301Sandrew */ 28266301Sandrew 29266301Sandrew#ifndef _MACHINE_PLATFORMVAR_H_ 30266301Sandrew#define _MACHINE_PLATFORMVAR_H_ 31266301Sandrew 32266301Sandrew/* 33266301Sandrew * An ARM platform implementation is declared with a kernel object and 34266301Sandrew * an associated method table, similar to a device driver. 35266301Sandrew * 36266301Sandrew * e.g. 37266301Sandrew * 38266301Sandrew * static platform_method_t bcm2835_methods[] = { 39266301Sandrew * PLATFORMMETHOD(platform_probe, bcm2835_probe), 40266301Sandrew * ... 41266301Sandrew * PLATFORMMETHOD_END 42266301Sandrew * }; 43266301Sandrew * 44266301Sandrew * static platform_def_t bcm3835_platform = { 45266301Sandrew * "bcm2835", 46266301Sandrew * bcm2835_methods, 47266301Sandrew * sizeof(bcm2835_platform_softc), // or 0 if no softc 48266301Sandrew * }; 49266301Sandrew * 50266301Sandrew * PLATFORM_DEF(bcm2835_platform); 51266301Sandrew */ 52266301Sandrew 53266301Sandrew#include <sys/kobj.h> 54266301Sandrew#include <sys/linker_set.h> 55266301Sandrew 56298854Sandrewstruct platform_class { 57298854Sandrew KOBJ_CLASS_FIELDS; 58298854Sandrew 59298854Sandrew /* How many times to loop to delay approximately 1us */ 60298854Sandrew int delay_count; 61298854Sandrew}; 62298854Sandrew 63266301Sandrewstruct platform_kobj { 64266301Sandrew /* 65266301Sandrew * A platform instance is a kernel object 66266301Sandrew */ 67266301Sandrew KOBJ_FIELDS; 68266301Sandrew 69266301Sandrew /* Platform class, for access to class specific data */ 70298854Sandrew struct platform_class *cls; 71266301Sandrew}; 72266301Sandrew 73298854Sandrewstruct platform_data { 74298854Sandrew int delay_count; 75298854Sandrew}; 76298854Sandrew 77266301Sandrewtypedef struct platform_kobj *platform_t; 78298854Sandrewtypedef struct platform_class platform_def_t; 79266301Sandrew#define platform_method_t kobj_method_t 80266301Sandrew 81266301Sandrew#define PLATFORMMETHOD KOBJMETHOD 82266301Sandrew#define PLATFORMMETHOD_END KOBJMETHOD_END 83266301Sandrew 84266301Sandrew#define PLATFORM_DEF(name) DATA_SET(platform_set, name) 85266301Sandrew 86266301Sandrew#ifdef FDT 87266301Sandrewstruct fdt_platform_class { 88266301Sandrew KOBJ_CLASS_FIELDS; 89266301Sandrew 90266301Sandrew const char *fdt_compatible; 91266301Sandrew}; 92266301Sandrew 93266301Sandrewtypedef struct fdt_platform_class fdt_platform_def_t; 94266301Sandrew 95266301Sandrewextern platform_method_t fdt_platform_methods[]; 96266301Sandrew 97298854Sandrew#ifdef MULTIDELAY 98298854Sandrew#define FDT_PLATFORM_CTASSERT(delay) CTASSERT(delay > 0) 99298854Sandrew#else 100331907Sgonzo#define FDT_PLATFORM_CTASSERT(delay) 101298854Sandrew#endif 102298854Sandrew 103298854Sandrew#define PLATFORM_DATA(NAME, delay) \ 104298854Sandrewstatic struct platform_data NAME ## _platc = { \ 105298854Sandrew .delay_count = delay; \ 106298854Sandrew}; 107298854Sandrew 108298854Sandrew#define FDT_PLATFORM_DEF2(NAME, VAR_NAME, NAME_STR, size, compatible, \ 109298854Sandrew delay) \ 110298854SandrewFDT_PLATFORM_CTASSERT(delay); \ 111266333Sandrewstatic fdt_platform_def_t VAR_NAME ## _fdt_platform = { \ 112266333Sandrew .name = NAME_STR, \ 113266333Sandrew .methods = fdt_platform_methods, \ 114266333Sandrew .fdt_compatible = compatible, \ 115266333Sandrew}; \ 116266333Sandrewstatic kobj_class_t VAR_NAME ## _baseclasses[] = \ 117266333Sandrew { (kobj_class_t)&VAR_NAME ## _fdt_platform, NULL }; \ 118266333Sandrewstatic platform_def_t VAR_NAME ## _platform = { \ 119266333Sandrew NAME_STR, \ 120266333Sandrew NAME ## _methods, \ 121266333Sandrew size, \ 122266333Sandrew VAR_NAME ## _baseclasses, \ 123298854Sandrew delay, \ 124266333Sandrew}; \ 125266333SandrewDATA_SET(platform_set, VAR_NAME ## _platform) 126266301Sandrew 127298854Sandrew#define FDT_PLATFORM_DEF(NAME, NAME_STR, size, compatible, delay) \ 128298854Sandrew FDT_PLATFORM_DEF2(NAME, NAME, NAME_STR, size, compatible, delay) 129266333Sandrew 130266301Sandrew#endif 131266301Sandrew 132298854Sandrewbool arm_tmr_timed_wait(platform_t, int); 133298854Sandrew 134266301Sandrew#endif /* _MACHINE_PLATFORMVAR_H_ */ 135