blob: d1c35bc93901e8f387fab036d63d372a5fb636cf [file] [log] [blame]
/* 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