zephyr/include/devicetree/gpio.h
Martí Bolívar 884d6e6941 devicetree: gpio: make flags default to 0
The vast majority of devicetree bindings for GPIO controllers are
expected to have "flags" cells in their respective GPIO specifiers,
but that's not required by the specification and we want to make sure
to support that.

However, so many drivers and applications initialize gpio_dt_flags_t
values that it's silly to require each and every one of them to check
for the flags value and fall back to the sensible default flags value
of 0 when it does not exist.

Make the API easier to use correctly by returning 0 in the devicetree
core API for accessing flags, whenever there are no flags defined.

Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
2020-08-04 07:35:26 -05:00

264 lines
7.6 KiB
C

/**
* @file
* @brief GPIO Devicetree macro public API header file.
*/
/*
* Copyright (c) 2020, Linaro Ltd.
* Copyright (c) 2020 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DEVICETREE_GPIO_H_
#define ZEPHYR_INCLUDE_DEVICETREE_GPIO_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup devicetree-gpio Devicetree GPIO API
* @ingroup devicetree
* @{
*/
/**
* @brief Get a label property from a gpio phandle-array property
* at an index
*
* It's an error if the GPIO controller node referenced by the phandle
* in node_id's "gpio_pha" property at index "idx" has no label
* property.
*
* Example devicetree fragment:
*
* gpio1: gpio@... {
* label = "GPIO_1";
* };
*
* gpio2: gpio@... {
* label = "GPIO_2";
* };
*
* n: node {
* gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
* <&gpio2 30 GPIO_ACTIVE_HIGH>;
* };
*
* Example usage:
*
* DT_GPIO_LABEL_BY_IDX(DT_NODELABEL(n), gpios, 1) // "GPIO_2"
*
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the label property of the node referenced at index "idx"
* @see DT_PHANDLE_BY_IDX()
*/
#define DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, idx) \
DT_PROP_BY_PHANDLE_IDX(node_id, gpio_pha, idx, label)
/**
* @brief Equivalent to DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0)
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the label property of the node referenced at index 0
* @see DT_GPIO_LABEL_BY_IDX()
*/
#define DT_GPIO_LABEL(node_id, gpio_pha) \
DT_GPIO_LABEL_BY_IDX(node_id, gpio_pha, 0)
/**
* @brief Get a GPIO specifier's pin cell at an index
*
* This macro only works for GPIO specifiers with cells named "pin".
* Refer to the node's binding to check if necessary.
*
* Example devicetree fragment:
*
* gpio1: gpio@... {
* compatible = "vnd,gpio";
* #gpio-cells = <2>;
* };
*
* gpio2: gpio@... {
* compatible = "vnd,gpio";
* #gpio-cells = <2>;
* };
*
* n: node {
* gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
* <&gpio2 30 GPIO_ACTIVE_HIGH>;
* };
*
* Bindings fragment for the vnd,gpio compatible:
*
* gpio-cells:
* - pin
* - flags
*
* Example usage:
*
* DT_GPIO_PIN_BY_IDX(DT_NODELABEL(n), gpios, 0) // 10
* DT_GPIO_PIN_BY_IDX(DT_NODELABEL(n), gpios, 1) // 30
*
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the pin cell value at index "idx"
* @see DT_PHA_BY_IDX()
*/
#define DT_GPIO_PIN_BY_IDX(node_id, gpio_pha, idx) \
DT_PHA_BY_IDX(node_id, gpio_pha, idx, pin)
/**
* @brief Equivalent to DT_GPIO_PIN_BY_IDX(node_id, gpio_pha, 0)
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the pin cell value at index 0
* @see DT_GPIO_PIN_BY_IDX()
*/
#define DT_GPIO_PIN(node_id, gpio_pha) \
DT_GPIO_PIN_BY_IDX(node_id, gpio_pha, 0)
/**
* @brief Get a GPIO specifier's flags cell at an index
*
* This macro expects GPIO specifiers with cells named "flags".
* If there is no "flags" cell in the GPIO specifier, zero is returned.
* Refer to the node's binding to check specifier cell names if necessary.
*
* Example devicetree fragment:
*
* gpio1: gpio@... {
* compatible = "vnd,gpio";
* #gpio-cells = <2>;
* };
*
* gpio2: gpio@... {
* compatible = "vnd,gpio";
* #gpio-cells = <2>;
* };
*
* n: node {
* gpios = <&gpio1 10 GPIO_ACTIVE_LOW>,
* <&gpio2 30 GPIO_ACTIVE_HIGH>;
* };
*
* Bindings fragment for the vnd,gpio compatible:
*
* gpio-cells:
* - pin
* - flags
*
* Example usage:
*
* DT_GPIO_FLAGS_BY_IDX(DT_NODELABEL(n), gpios, 0) // GPIO_ACTIVE_LOW
* DT_GPIO_FLAGS_BY_IDX(DT_NODELABEL(n), gpios, 1) // GPIO_ACTIVE_HIGH
*
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the flags cell value at index "idx", or zero if there is none
* @see DT_PHA_BY_IDX()
*/
#define DT_GPIO_FLAGS_BY_IDX(node_id, gpio_pha, idx) \
DT_PHA_BY_IDX_OR(node_id, gpio_pha, idx, flags, 0)
/**
* @brief Equivalent to DT_GPIO_FLAGS_BY_IDX(node_id, gpio_pha, 0)
* @param node_id node identifier
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the flags cell value at index 0, or zero if there is none
* @see DT_GPIO_FLAGS_BY_IDX()
*/
#define DT_GPIO_FLAGS(node_id, gpio_pha) \
DT_GPIO_FLAGS_BY_IDX(node_id, gpio_pha, 0)
/**
* @brief Get a label property from a DT_DRV_COMPAT instance's GPIO
* property at an index
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the label property of the node referenced at index "idx"
*/
#define DT_INST_GPIO_LABEL_BY_IDX(inst, gpio_pha, idx) \
DT_GPIO_LABEL_BY_IDX(DT_DRV_INST(inst), gpio_pha, idx)
/**
* @brief Equivalent to DT_INST_GPIO_LABEL_BY_IDX(inst, gpio_pha, 0)
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the label property of the node referenced at index 0
*/
#define DT_INST_GPIO_LABEL(inst, gpio_pha) \
DT_INST_GPIO_LABEL_BY_IDX(inst, gpio_pha, 0)
/**
* @brief Get a DT_DRV_COMPAT instance's GPIO specifier's pin cell value
* at an index
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the pin cell value at index "idx"
* @see DT_GPIO_PIN_BY_IDX()
*/
#define DT_INST_GPIO_PIN_BY_IDX(inst, gpio_pha, idx) \
DT_GPIO_PIN_BY_IDX(DT_DRV_INST(inst), gpio_pha, idx)
/**
* @brief Equivalent to DT_INST_GPIO_PIN_BY_IDX(inst, gpio_pha, 0)
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the pin cell value at index 0
* @see DT_INST_GPIO_PIN_BY_IDX()
*/
#define DT_INST_GPIO_PIN(inst, gpio_pha) \
DT_INST_GPIO_PIN_BY_IDX(inst, gpio_pha, 0)
/**
* @brief Get a DT_DRV_COMPAT instance's GPIO specifier's flags cell
* at an index
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @param idx logical index into "gpio_pha"
* @return the flags cell value at index "idx", or zero if there is none
* @see DT_GPIO_FLAGS_BY_IDX()
*/
#define DT_INST_GPIO_FLAGS_BY_IDX(inst, gpio_pha, idx) \
DT_GPIO_FLAGS_BY_IDX(DT_DRV_INST(inst), gpio_pha, idx)
/**
* @brief Equivalent to DT_INST_GPIO_FLAGS_BY_IDX(inst, gpio_pha, 0)
* @param inst DT_DRV_COMPAT instance number
* @param gpio_pha lowercase-and-underscores GPIO property with
* type "phandle-array"
* @return the flags cell value at index 0, or zero if there is none
* @see DT_INST_GPIO_FLAGS_BY_IDX()
*/
#define DT_INST_GPIO_FLAGS(inst, gpio_pha) \
DT_INST_GPIO_FLAGS_BY_IDX(inst, gpio_pha, 0)
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_DEVICETREE_GPIO_H_ */