| /* Copyright 2018 SiFive, Inc */ |
| /* SPDX-License-Identifier: Apache-2.0 */ |
| |
| #ifndef METAL__SWITCH_H |
| #define METAL__SWITCH_H |
| |
| /*! |
| * @file switch.h |
| * @brief API for reading toggle switches |
| */ |
| |
| #include <metal/interrupt.h> |
| |
| struct metal_switch; |
| |
| struct metal_switch_vtable { |
| int (*switch_exist)(struct metal_switch *sw, char *label); |
| struct metal_interrupt* (*interrupt_controller)(struct metal_switch *sw); |
| int (*get_interrupt_id)(struct metal_switch *sw); |
| }; |
| |
| /*! |
| * @brief A handle for a switch |
| */ |
| struct metal_switch { |
| const struct metal_switch_vtable *vtable; |
| }; |
| |
| /*! |
| * @brief Get a handle for a switch |
| * @param label The DeviceTree label for the desired switch |
| * @return A handle to the switch, or NULL if none is found for the requested label |
| */ |
| struct metal_switch* metal_switch_get(char *label); |
| |
| /*! |
| * @brief Get the interrupt controller for a switch |
| * @param sw The handle for the switch |
| * @return The interrupt controller handle |
| */ |
| inline struct metal_interrupt* |
| metal_switch_interrupt_controller(struct metal_switch *sw) { return sw->vtable->interrupt_controller(sw); } |
| |
| /*! |
| * @brief Get the interrupt id for a switch |
| * @param sw The handle for the switch |
| * @return The interrupt ID for the switch |
| */ |
| inline int metal_switch_get_interrupt_id(struct metal_switch *sw) { return sw->vtable->get_interrupt_id(sw); } |
| |
| #endif |