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 2727521ff8SAndrew Turner #ifndef _MACHINE_PLATFORMVAR_H_ 2827521ff8SAndrew Turner #define _MACHINE_PLATFORMVAR_H_ 2927521ff8SAndrew Turner 3027521ff8SAndrew Turner /* 3127521ff8SAndrew Turner * An ARM platform implementation is declared with a kernel object and 3227521ff8SAndrew Turner * an associated method table, similar to a device driver. 3327521ff8SAndrew Turner * 3427521ff8SAndrew Turner * e.g. 3527521ff8SAndrew Turner * 3627521ff8SAndrew Turner * static platform_method_t bcm2835_methods[] = { 3727521ff8SAndrew Turner * PLATFORMMETHOD(platform_probe, bcm2835_probe), 3827521ff8SAndrew Turner * ... 3927521ff8SAndrew Turner * PLATFORMMETHOD_END 4027521ff8SAndrew Turner * }; 4127521ff8SAndrew Turner * 4227521ff8SAndrew Turner * static platform_def_t bcm3835_platform = { 4327521ff8SAndrew Turner * "bcm2835", 4427521ff8SAndrew Turner * bcm2835_methods, 4527521ff8SAndrew Turner * sizeof(bcm2835_platform_softc), // or 0 if no softc 4627521ff8SAndrew Turner * }; 4727521ff8SAndrew Turner * 4827521ff8SAndrew Turner * PLATFORM_DEF(bcm2835_platform); 4927521ff8SAndrew Turner */ 5027521ff8SAndrew Turner 5127521ff8SAndrew Turner #include <sys/kobj.h> 5227521ff8SAndrew Turner #include <sys/linker_set.h> 5327521ff8SAndrew Turner 54cca48a59SAndrew Turner struct platform_class { 55cca48a59SAndrew Turner KOBJ_CLASS_FIELDS; 56cca48a59SAndrew Turner 57cca48a59SAndrew Turner /* How many times to loop to delay approximately 1us */ 58cca48a59SAndrew Turner int delay_count; 59cca48a59SAndrew Turner }; 60cca48a59SAndrew Turner 6127521ff8SAndrew Turner struct platform_kobj { 6227521ff8SAndrew Turner /* 6327521ff8SAndrew Turner * A platform instance is a kernel object 6427521ff8SAndrew Turner */ 6527521ff8SAndrew Turner KOBJ_FIELDS; 6627521ff8SAndrew Turner 6727521ff8SAndrew Turner /* Platform class, for access to class specific data */ 68cca48a59SAndrew Turner struct platform_class *cls; 69cca48a59SAndrew Turner }; 70cca48a59SAndrew Turner 7127521ff8SAndrew Turner typedef struct platform_kobj *platform_t; 72cca48a59SAndrew Turner typedef struct platform_class platform_def_t; 7327521ff8SAndrew Turner #define platform_method_t kobj_method_t 7427521ff8SAndrew Turner 7527521ff8SAndrew Turner #define PLATFORMMETHOD KOBJMETHOD 7627521ff8SAndrew Turner #define PLATFORMMETHOD_END KOBJMETHOD_END 7727521ff8SAndrew Turner 7827521ff8SAndrew Turner #define PLATFORM_DEF(name) DATA_SET(platform_set, name) 7927521ff8SAndrew Turner 8027521ff8SAndrew Turner #ifdef FDT 8127521ff8SAndrew Turner struct fdt_platform_class { 8227521ff8SAndrew Turner KOBJ_CLASS_FIELDS; 8327521ff8SAndrew Turner 8427521ff8SAndrew Turner const char *fdt_compatible; 8527521ff8SAndrew Turner }; 8627521ff8SAndrew Turner 8727521ff8SAndrew Turner typedef struct fdt_platform_class fdt_platform_def_t; 8827521ff8SAndrew Turner 8927521ff8SAndrew Turner extern platform_method_t fdt_platform_methods[]; 9027521ff8SAndrew Turner 91*966e7b05SMichal Meloun #define FDT_PLATFORM_DEF2(NAME, VAR_NAME, NAME_STR, _size, _compatible, \ 92*966e7b05SMichal Meloun _delay) \ 93*966e7b05SMichal Meloun CTASSERT(_delay > 0); \ 9487ff9820SAndrew Turner static fdt_platform_def_t VAR_NAME ## _fdt_platform = { \ 9527521ff8SAndrew Turner .name = NAME_STR, \ 9627521ff8SAndrew Turner .methods = fdt_platform_methods, \ 97*966e7b05SMichal Meloun .fdt_compatible = _compatible, \ 9827521ff8SAndrew Turner }; \ 9987ff9820SAndrew Turner static kobj_class_t VAR_NAME ## _baseclasses[] = \ 10087ff9820SAndrew Turner { (kobj_class_t)&VAR_NAME ## _fdt_platform, NULL }; \ 10187ff9820SAndrew Turner static platform_def_t VAR_NAME ## _platform = { \ 102*966e7b05SMichal Meloun .name = NAME_STR, \ 103*966e7b05SMichal Meloun .methods = NAME ## _methods, \ 104*966e7b05SMichal Meloun .size = _size, \ 105*966e7b05SMichal Meloun .baseclasses = VAR_NAME ## _baseclasses, \ 106*966e7b05SMichal Meloun .delay_count = _delay, \ 10727521ff8SAndrew Turner }; \ 10887ff9820SAndrew Turner DATA_SET(platform_set, VAR_NAME ## _platform) 10987ff9820SAndrew Turner 110cca48a59SAndrew Turner #define FDT_PLATFORM_DEF(NAME, NAME_STR, size, compatible, delay) \ 111cca48a59SAndrew Turner FDT_PLATFORM_DEF2(NAME, NAME, NAME_STR, size, compatible, delay) 11227521ff8SAndrew Turner 11327521ff8SAndrew Turner #endif 11427521ff8SAndrew Turner 11575f48c23SAndrew Turner /* 11675f48c23SAndrew Turner * Helper to get the platform object 11775f48c23SAndrew Turner */ 11875f48c23SAndrew Turner platform_t platform_obj(void); 11975f48c23SAndrew Turner 120cca48a59SAndrew Turner bool arm_tmr_timed_wait(platform_t, int); 121cca48a59SAndrew Turner 12227521ff8SAndrew Turner #endif /* _MACHINE_PLATFORMVAR_H_ */ 123