zephyr/soc/arm/gigadevice/common/pinctrl_soc.h
Gerard Marull-Paretas 543a3843ff drivers: pinctrl: gd32: initial support for AF based SoCs
Add a pin control driver for GD32 SoCs using the AF model.

Signed-off-by: Gerard Marull-Paretas <gerard@teslabs.com>
2021-11-22 16:30:28 -05:00

162 lines
3.5 KiB
C

/*
* Copyright (c) 2021 Teslabs Engineering S.L.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* Gigadevice SoC specific helpers for pinctrl driver
*/
#ifndef ZEPHYR_SOC_ARM_GIGADEVICE_COMMON_PINCTRL_SOC_H_
#define ZEPHYR_SOC_ARM_GIGADEVICE_COMMON_PINCTRL_SOC_H_
#include <devicetree.h>
#include <dt-bindings/pinctrl/gd32-af.h>
#include <zephyr/types.h>
#ifdef __cplusplus
extern "C" {
#endif
/** @cond INTERNAL_HIDDEN */
/** @brief Type for GD32 pin.
*
* Bits:
* - 0-12: GD32_PINMUX_AF bit field.
* - 13-25: Reserved.
* - 26-31: Pin configuration bit field (@ref GD32_PINCFG).
*/
typedef uint32_t pinctrl_soc_pin_t;
/**
* @brief Utility macro to initialize each pin.
*
* @param node_id Node identifier.
* @param prop Property name.
* @param idx Property entry index.
*/
#define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \
(DT_PROP_BY_IDX(node_id, prop, idx) | \
((GD32_PUPD_PULLUP * DT_PROP(node_id, bias_pull_up)) \
<< GD32_PUPD_POS) | \
((GD32_PUPD_PULLDOWN * DT_PROP(node_id, bias_pull_down)) \
<< GD32_PUPD_POS) | \
((GD32_OTYPE_OD * DT_PROP(node_id, drive_open_drain)) \
<< GD32_OTYPE_POS) | \
(DT_ENUM_IDX(node_id, slew_rate) << GD32_OSPEED_POS)),
/**
* @brief Utility macro to initialize state pins contained in a given property.
*
* @param node_id Node identifier.
* @param prop Property name describing state pins.
*/
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
{DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \
DT_FOREACH_PROP_ELEM, pinmux, \
Z_PINCTRL_STATE_PIN_INIT)}
/** @endcond */
/**
* @name GD32 PUPD (values match the ones in the HAL).
* @{
*/
/** No pull-up/down */
#define GD32_PUPD_NONE 0U
/** Pull-up */
#define GD32_PUPD_PULLUP 1U
/** Pull-down */
#define GD32_PUPD_PULLDOWN 2U
/** @} */
/**
* @name GD32 OTYPE (values match the ones in the HAL).
* @{
*/
/** Push-pull */
#define GD32_OTYPE_PP 0U
/** Open-drain */
#define GD32_OTYPE_OD 1U
/** @} */
/**
* @name GD32 OSPEED (values match the ones in the HAL).
* @{
*/
/** Maximum 2MHz */
#define GD32_OSPEED_2MHZ 0U
/** Maximum 25MHz */
#define GD32_OSPEED_25MHZ 1U
/** Maximum 50MHz */
#define GD32_OSPEED_50MHZ 2U
/** Maximum 200MHz */
#define GD32_OSPEED_200MHZ 3U
/** @} */
/**
* @name GD32 pin configuration bit field mask and positions.
* @anchor GD32_PINCFG
*
* Fields:
*
* - 31..29: Pull-up/down
* - 28: Output type
* - 27..26: Output speed
*
* @{
*/
/** PUPD field mask. */
#define GD32_PUPD_MSK 0x3U
/** PUPD field position. */
#define GD32_PUPD_POS 29U
/** OTYPE field mask. */
#define GD32_OTYPE_MSK 0x1U
/** OTYPE field position. */
#define GD32_OTYPE_POS 28U
/** OSPEED field mask. */
#define GD32_OSPEED_MSK 0x3U
/** OSPEED field position. */
#define GD32_OSPEED_POS 26U
/** @} */
/**
* Obtain PUPD field from pinctrl_soc_pin_t configuration.
*
* @param pincfg pinctrl_soc_pin_t bit field value.
*/
#define GD32_PUPD_GET(pincfg) \
(((pincfg) >> GD32_PUPD_POS) & GD32_PUPD_MSK)
/**
* Obtain OTYPE field from pinctrl_soc_pin_t configuration.
*
* @param pincfg pinctrl_soc_pin_t bit field value.
*/
#define GD32_OTYPE_GET(pincfg) \
(((pincfg) >> GD32_OTYPE_POS) & GD32_OTYPE_MSK)
/**
* Obtain OSPEED field from pinctrl_soc_pin_t configuration.
*
* @param pincfg pinctrl_soc_pin_t bit field value.
*/
#define GD32_OSPEED_GET(pincfg) \
(((pincfg) >> GD32_OSPEED_POS) & GD32_OSPEED_MSK)
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_SOC_ARM_GIGADEVICE_COMMON_PINCTRL_SOC_H_ */