| /* -*- mode:c -*- |
| * |
| * Copyright 2014 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| /** |
| * @file gpio.wrap |
| * @brief Include the board specific *gpio.inc* file. |
| * |
| * This file is included in many different contexts. |
| * The macros defined outside of the file (before including) |
| * determine what parts of *gpio.inc* will be emitted. |
| * |
| * The following macros are available: |
| * - GPIO_INT |
| * - GPIO |
| * - IOEX_INT |
| * - IOEX |
| * - UNIMPLEMENTED |
| * - ALTERNATE |
| * - UNUSED |
| * |
| * @note You cannot have dependencies between these macros. For example, |
| * you cannot define GPIO_INT in terms of GPIO. All macros must be |
| * independently evaluable. |
| * This is due to the reorganization mechanism at the bottom of this file. |
| * |
| * @see include/gpio_list.h |
| * @see common/gpio.c |
| * @see include/gpio_signal.h |
| */ |
| |
| #ifndef GPIO_PIN |
| #error "Your architecture must define GPIO_PIN and it did not." |
| #endif |
| |
| #ifndef GPIO_PIN_MASK |
| #error "Your architecture must define GPIO_PIN_MASK and it did not." |
| #endif |
| |
| /** |
| * @def GPIO |
| * @brief The GPIO macro defines a GPIO pin name and function. |
| * |
| * The name is used to populate the gpio_signal enum by first |
| * prepending GPIO_ to the name. It is also used to construct the |
| * string name that is presented in the shell interface. The pin |
| * parameter should use PIN macro and will be expand to GPIO_PIN |
| * defined on each board. The flags parameter is passed on to the |
| * gpio_info directly. |
| */ |
| #ifndef GPIO |
| #define GPIO(name, pin, flags) |
| #endif |
| |
| /** |
| * @def GPIO_INT |
| * @brief The GPIO_INT macro defines a GPIO that has an IRQ handler. |
| * |
| * The IRQ handler pointers are stored as elements in the gpio_irq_handlers |
| * array. |
| */ |
| #ifndef GPIO_INT |
| #define GPIO_INT(name, pin, flags, signal) |
| #endif |
| |
| /** |
| * @def ALTERNATE |
| * @brief The ALTERNATE macro associates a GPIO with an alternate function. |
| * |
| * Alternate functions allow hardware peripherals access to GPIO pins. |
| * Modules use gpio_config_module to enable and disable the alternate functions |
| * of GPIOs assigned to that module. So if the module parameter is MODULE_UART |
| * then when the uart_init function is called the GPIO will be switched to its |
| * alternate function mode. The function parameter is chip/variant specific |
| * and will usually need to be looked up in the datasheet. The flags parameter |
| * has the same meaning as in the GPIO macro above. This macro can assign |
| * multiple pins on the same port to a module, pinmasks should use PIN_MASK |
| * and will be expanded as GPIO_PIN_MASK defined in each config_chip.h. |
| */ |
| #ifndef ALTERNATE |
| #define ALTERNATE(pinmask, function, module, flags) |
| #endif |
| |
| /** |
| * @def UNIMPLEMENTED |
| * @brief The UNIMPLEMENTED macro defines a GPIO that doesn't actually exist. |
| * |
| * Some GPIO names are well known and used by generic code, ENTERING_RW and WP_L |
| * are examples. If a particular board doesn't have a GPIO assigned to such a |
| * function/name then it should specify that that GPIO is not implemented using |
| * the UNIMPLEMENTED macro below in the board gpio.inc file. This macro creates |
| * an entry in the gpio_signal enum and the gpio_list array that is initialized |
| * to use the UNIMPLEMENTED_GPIO_BANK and a bitmask of zero. The chip GPIO |
| * layer is implemented such that writes to and reads from |
| * UNIMPLEMENTED_GPIO_BANK with a bitmask of zero are harmless. |
| * |
| * This allows common code that expects these GPIOs to exist to compile and have |
| * some reduced functionality. |
| */ |
| #ifndef UNIMPLEMENTED |
| #define UNIMPLEMENTED(name) |
| #endif |
| |
| /** |
| * @def UNUSED |
| * @brief The UNUSED macro defines a pin as unused. |
| * |
| * This allows the chip specific code to provision these pins for |
| * the lowest power state. |
| * We don't want to automatically provision all unreferenced pins/ports |
| * as unused, since this may alter the behavior of existing firmwares in |
| * ways that may not be obvious to the developer. |
| */ |
| #ifndef UNUSED |
| #define UNUSED(pin) |
| #endif |
| |
| /** |
| * @def IOEX |
| * @brief The IOEX macro defines an IO Expander GPIO. |
| * |
| * The name is used to populate enum ioex_signal by prepending "IOEX_". |
| */ |
| #ifndef IOEX |
| #define IOEX(name, expin, flags) |
| #endif |
| |
| /** |
| * @def IOEX_INT |
| * @brief The IOEX_INT macro defines an IO Expander GPIO that has an IRQ handler. |
| * |
| * The IRQ handler pointers are stored as elements in the ioex_irq_handlers |
| * array. |
| */ |
| #ifndef IOEX_INT |
| #define IOEX_INT(name, expin, flags, handler) |
| #endif |
| |
| /* |
| * RO/RW pin macro. |
| * |
| * Some boards may have very different pin configurations between RO and RW, and |
| * also may vary from revision to revision. The RO/RW pin macros can ease the |
| * maintenance effort. |
| */ |
| |
| #ifdef SECTION_IS_RO |
| #define GPIO_RO(name, pin, flags) GPIO(name, pin, flags) |
| #define GPIO_RW(name, pin, flags) |
| #define GPIO_INT_RO(name, pin, flags, signal) GPIO_INT(name, pin, flags, signal) |
| #define GPIO_INT_RW(name, pin, flags, signal) |
| #define ALTERNATE_RO(pinmask, function, module, flags) \ |
| ALTERNATE(pinmask, function, module, flags) |
| #define ALTERNATE_RW(pinmask, function, module, flags) |
| #define UNIMPLEMENTED_RO(name) UNIMPLEMENTED(name) |
| #define UNIMPLEMENTED_RW(name) |
| #define UNUSED_RO(name) UNUSED(name) |
| #define UNUSED_RW(name) |
| #elif defined(SECTION_IS_RW) |
| #define GPIO_RO(name, pin, flags) |
| #define GPIO_RW(name, pin, flags) GPIO(name, pin, flags) |
| #define GPIO_INT_RO(name, pin, flags, signal) |
| #define GPIO_INT_RW(name, pin, flags, signal) GPIO_INT(name, pin, flags, signal) |
| #define ALTERNATE_RO(pinmask, function, module, flags) |
| #define ALTERNATE_RW(pinmask, function, module, flags) \ |
| ALTERNATE(pinmask, function, module, flags) |
| #define UNIMPLEMENTED_RO(name) |
| #define UNIMPLEMENTED_RW(name) UNIMPLEMENTED(name) |
| #define UNUSED_RO(name) |
| #define UNUSED_RW(name) UNUSED(name) |
| #else |
| #define GPIO_RO(name, pin, flags) GPIO(name, pin, flags) |
| #define GPIO_RW(name, pin, flags) GPIO(name, pin, flags) |
| #define GPIO_INT_RO(name, pin, flags, signal) GPIO_INT(name, pin, flags, signal) |
| #define GPIO_INT_RW(name, pin, flags, signal) GPIO_INT(name, pin, flags, signal) |
| #define ALTERNATE_RO(pinmask, function, module, flags) \ |
| ALTERNATE(pinmask, function, module, flags) |
| #define ALTERNATE_RW(pinmask, function, module, flags) \ |
| ALTERNATE(pinmask, function, module, flags) |
| #define UNIMPLEMENTED_RO(name) UNIMPLEMENTED(name) |
| #define UNIMPLEMENTED_RW(name) UNIMPLEMENTED(name) |
| #define UNUSED_RO(name) UNUSED(name) |
| #define UNUSED_RW(name) UNUSED(name) |
| #endif |
| |
| |
| /** |
| * Rearrange the gpio.inc declarations, such that we have the following order: |
| * - GPIO_INTs |
| * - GPIOs |
| * - IOEX_INTs |
| * - IOEXs |
| * - UNIMPLEMENTEDs |
| * - ALTERNATEs |
| * - UNUSEDs |
| * |
| * This allows the board to define these declaration in any way that is |
| * makes logical sense, while maintaining the following existing |
| * order invariants: |
| * |
| * - GPIO_INTs must be before GPIOs in gpio.inc. This is because their |
| * enum values from gpio_signal.h are used as the index to the |
| * gpio_irq_handlers table. |
| * See crrev.com/c/263973 (gpio: Refactor IRQ handler pointer out of gpio_list) |
| * - IOEX_INTs must be before IOEXs in gpio.inc. This is because their |
| * enum values from gpio_signal.h are used as the index to the |
| * ioex_irq_handlers table. |
| * |
| * We want to rearrange the entres early in the gpio.inc process to ensure |
| * that all includers (gpio_signal.h and gpio_list.h) see the same ordering, |
| * since there is an implicit dependency. |
| * |
| * Note that this mechanism cannot handle dependencies between the provided |
| * macros. See the file header comment for more information. |
| */ |
| |
| /* Stash away all macros and define to "blank" */ |
| #pragma push_macro("GPIO_INT") |
| #pragma push_macro("GPIO") |
| #pragma push_macro("IOEX_INT") |
| #pragma push_macro("IOEX") |
| #pragma push_macro("UNIMPLEMENTED") |
| #pragma push_macro("ALTERNATE") |
| #pragma push_macro("UNUSED") |
| #undef GPIO_INT |
| #undef GPIO |
| #undef IOEX_INT |
| #undef IOEX |
| #undef UNIMPLEMENTED |
| #undef ALTERNATE |
| #undef UNUSED |
| #define GPIO_INT(...) |
| #define GPIO(...) |
| #define IOEX_INT(...) |
| #define IOEX(...) |
| #define UNIMPLEMENTED(...) |
| #define ALTERNATE(...) |
| #define UNUSED(...) |
| |
| /* Capture GPIO_INTs */ |
| #pragma pop_macro("GPIO_INT") |
| #include "gpio.inc" |
| #undef GPIO_INT |
| #define GPIO_INT(...) |
| |
| /* Capture GPIOs */ |
| #pragma pop_macro("GPIO") |
| #include "gpio.inc" |
| #undef GPIO |
| #define GPIO(...) |
| |
| /* Capture IOEX_INTs */ |
| #pragma pop_macro("IOEX_INT") |
| #include "gpio.inc" |
| #undef IOEX_INT |
| #define IOEX_INT(...) |
| |
| /* Capture IOEXs */ |
| #pragma pop_macro("IOEX") |
| #include "gpio.inc" |
| #undef IOEX |
| #define IOEX(...) |
| |
| /* Capture UNIMPLEMENTEDs */ |
| #pragma pop_macro("UNIMPLEMENTED") |
| #include "gpio.inc" |
| #undef UNIMPLEMENTED |
| #define UNIMPLEMENTED(...) |
| |
| /* Capture ALTERNATEs */ |
| #pragma pop_macro("ALTERNATE") |
| #include "gpio.inc" |
| #undef ALTERNATE |
| #define ALTERNATE(...) |
| |
| /* Capture UNUSEDs */ |
| #pragma pop_macro("UNUSED") |
| #include "gpio.inc" |
| #undef UNUSED |
| #define UNUSED(...) |
| |
| |
| /* |
| * Once the gpio.inc file has been included these macros are no longer needed. |
| * This allows the includer to redefine these macros and include this file |
| * again, within the same file. |
| */ |
| #undef GPIO |
| #undef GPIO_RO |
| #undef GPIO_RW |
| #undef GPIO_INT |
| #undef GPIO_INT_RO |
| #undef GPIO_INT_RW |
| #undef IOEX |
| #undef IOEX_INT |
| #undef ALTERNATE |
| #undef ALTERNATE_RO |
| #undef ALTERNATE_RW |
| #undef UNIMPLEMENTED |
| #undef UNIMPLEMENTED_RO |
| #undef UNIMPLEMENTED_RW |
| #undef UNUSED |
| #undef UNUSED_RO |
| #undef UNUSED_RW |