127521ff8SAndrew Turner /*- 227521ff8SAndrew Turner * Copyright (c) 2005 Peter Grehan 327521ff8SAndrew Turner * All rights reserved. 427521ff8SAndrew Turner * 527521ff8SAndrew Turner * Redistribution and use in source and binary forms, with or without 627521ff8SAndrew Turner * modification, are permitted provided that the following conditions 727521ff8SAndrew Turner * are met: 827521ff8SAndrew Turner * 1. Redistributions of source code must retain the above copyright 927521ff8SAndrew Turner * notice, this list of conditions and the following disclaimer. 1027521ff8SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 1127521ff8SAndrew Turner * notice, this list of conditions and the following disclaimer in the 1227521ff8SAndrew Turner * documentation and/or other materials provided with the distribution. 1327521ff8SAndrew Turner * 1427521ff8SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1527521ff8SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1627521ff8SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1727521ff8SAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1827521ff8SAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1927521ff8SAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2027521ff8SAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2127521ff8SAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2227521ff8SAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2327521ff8SAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2427521ff8SAndrew Turner * SUCH DAMAGE. 2527521ff8SAndrew Turner * 2627521ff8SAndrew Turner * $FreeBSD$ 2727521ff8SAndrew Turner */ 2827521ff8SAndrew Turner 2927521ff8SAndrew Turner #ifndef _MACHINE_PLATFORMVAR_H_ 3027521ff8SAndrew Turner #define _MACHINE_PLATFORMVAR_H_ 3127521ff8SAndrew Turner 3227521ff8SAndrew Turner /* 3327521ff8SAndrew Turner * An ARM platform implementation is declared with a kernel object and 3427521ff8SAndrew Turner * an associated method table, similar to a device driver. 3527521ff8SAndrew Turner * 3627521ff8SAndrew Turner * e.g. 3727521ff8SAndrew Turner * 3827521ff8SAndrew Turner * static platform_method_t bcm2835_methods[] = { 3927521ff8SAndrew Turner * PLATFORMMETHOD(platform_probe, bcm2835_probe), 4027521ff8SAndrew Turner * ... 4127521ff8SAndrew Turner * PLATFORMMETHOD_END 4227521ff8SAndrew Turner * }; 4327521ff8SAndrew Turner * 4427521ff8SAndrew Turner * static platform_def_t bcm3835_platform = { 4527521ff8SAndrew Turner * "bcm2835", 4627521ff8SAndrew Turner * bcm2835_methods, 4727521ff8SAndrew Turner * sizeof(bcm2835_platform_softc), // or 0 if no softc 4827521ff8SAndrew Turner * }; 4927521ff8SAndrew Turner * 5027521ff8SAndrew Turner * PLATFORM_DEF(bcm2835_platform); 5127521ff8SAndrew Turner */ 5227521ff8SAndrew Turner 5327521ff8SAndrew Turner #include <sys/kobj.h> 5427521ff8SAndrew Turner #include <sys/linker_set.h> 5527521ff8SAndrew Turner 56cca48a59SAndrew Turner struct platform_class { 57cca48a59SAndrew Turner KOBJ_CLASS_FIELDS; 58cca48a59SAndrew Turner 59cca48a59SAndrew Turner /* How many times to loop to delay approximately 1us */ 60cca48a59SAndrew Turner int delay_count; 61cca48a59SAndrew Turner }; 62cca48a59SAndrew Turner 6327521ff8SAndrew Turner struct platform_kobj { 6427521ff8SAndrew Turner /* 6527521ff8SAndrew Turner * A platform instance is a kernel object 6627521ff8SAndrew Turner */ 6727521ff8SAndrew Turner KOBJ_FIELDS; 6827521ff8SAndrew Turner 6927521ff8SAndrew Turner /* Platform class, for access to class specific data */ 70cca48a59SAndrew Turner struct platform_class *cls; 71cca48a59SAndrew Turner }; 72cca48a59SAndrew Turner 7327521ff8SAndrew Turner typedef struct platform_kobj *platform_t; 74cca48a59SAndrew Turner typedef struct platform_class platform_def_t; 7527521ff8SAndrew Turner #define platform_method_t kobj_method_t 7627521ff8SAndrew Turner 7727521ff8SAndrew Turner #define PLATFORMMETHOD KOBJMETHOD 7827521ff8SAndrew Turner #define PLATFORMMETHOD_END KOBJMETHOD_END 7927521ff8SAndrew Turner 8027521ff8SAndrew Turner #define PLATFORM_DEF(name) DATA_SET(platform_set, name) 8127521ff8SAndrew Turner 8227521ff8SAndrew Turner #ifdef FDT 8327521ff8SAndrew Turner struct fdt_platform_class { 8427521ff8SAndrew Turner KOBJ_CLASS_FIELDS; 8527521ff8SAndrew Turner 8627521ff8SAndrew Turner const char *fdt_compatible; 8727521ff8SAndrew Turner }; 8827521ff8SAndrew Turner 8927521ff8SAndrew Turner typedef struct fdt_platform_class fdt_platform_def_t; 9027521ff8SAndrew Turner 9127521ff8SAndrew Turner extern platform_method_t fdt_platform_methods[]; 9227521ff8SAndrew Turner 93cca48a59SAndrew Turner #define FDT_PLATFORM_DEF2(NAME, VAR_NAME, NAME_STR, size, compatible, \ 94cca48a59SAndrew Turner delay) \ 959ce763a0SAndrew Turner CTASSERT(delay > 0); \ 9687ff9820SAndrew Turner static fdt_platform_def_t VAR_NAME ## _fdt_platform = { \ 9727521ff8SAndrew Turner .name = NAME_STR, \ 9827521ff8SAndrew Turner .methods = fdt_platform_methods, \ 9927521ff8SAndrew Turner .fdt_compatible = compatible, \ 10027521ff8SAndrew Turner }; \ 10187ff9820SAndrew Turner static kobj_class_t VAR_NAME ## _baseclasses[] = \ 10287ff9820SAndrew Turner { (kobj_class_t)&VAR_NAME ## _fdt_platform, NULL }; \ 10387ff9820SAndrew Turner static platform_def_t VAR_NAME ## _platform = { \ 10427521ff8SAndrew Turner NAME_STR, \ 10527521ff8SAndrew Turner NAME ## _methods, \ 10627521ff8SAndrew Turner size, \ 10787ff9820SAndrew Turner VAR_NAME ## _baseclasses, \ 108cca48a59SAndrew Turner delay, \ 10927521ff8SAndrew Turner }; \ 11087ff9820SAndrew Turner DATA_SET(platform_set, VAR_NAME ## _platform) 11187ff9820SAndrew Turner 112cca48a59SAndrew Turner #define FDT_PLATFORM_DEF(NAME, NAME_STR, size, compatible, delay) \ 113cca48a59SAndrew Turner FDT_PLATFORM_DEF2(NAME, NAME, NAME_STR, size, compatible, delay) 11427521ff8SAndrew Turner 11527521ff8SAndrew Turner #endif 11627521ff8SAndrew Turner 117*75f48c23SAndrew Turner /* 118*75f48c23SAndrew Turner * Helper to get the platform object 119*75f48c23SAndrew Turner */ 120*75f48c23SAndrew Turner platform_t platform_obj(void); 121*75f48c23SAndrew Turner 122cca48a59SAndrew Turner bool arm_tmr_timed_wait(platform_t, int); 123cca48a59SAndrew Turner 12427521ff8SAndrew Turner #endif /* _MACHINE_PLATFORMVAR_H_ */ 125