blob: 72734a7d358164b2143df0d9e7c6ae5f19760ac7 [file] [log] [blame]
/*
* Copyright (c) 2020 Linaro Ltd.
* Copyright (c) 2021 Nordic Semiconductor ASA
* Copyright (c) 2021 Microchip Technology Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* Microchip XEC SoC specific helpers for pinctrl driver
*/
#ifndef ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_
#define ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_
#include <zephyr/devicetree.h>
#include <zephyr/types.h>
#include <zephyr/dt-bindings/pinctrl/mchp-xec-pinctrl.h>
#ifdef __cplusplus
extern "C" {
#endif
/** @cond INTERNAL_HIDDEN */
/* Type for MCHP XEC pin. */
typedef struct {
/** Pinmux settings (port, pin and function). */
uint16_t pinmux;
/** Pin configuration (bias, drive and slew rate). */
uint16_t pincfg;
} pinctrl_soc_pin_t;
/* initialize pinmux member fields of pinctrl_pin_t */
#define Z_PINCTRL_MCHP_XEC_PINMUX_INIT(node_id) DT_PROP(node_id, pinmux)
#define MCHP_XEC_BIAS_DIS_VAL(nid) \
(MCHP_XEC_NO_PULL * DT_PROP(nid, bias_disable))
#define MCHP_XEC_BIAS_PU_VAL(nid) \
(MCHP_XEC_PULL_UP * DT_PROP(nid, bias_pull_up))
#define MCHP_XEC_BIAS_PD_VAL(nid) \
(MCHP_XEC_PULL_DOWN * DT_PROP(nid, bias_pull_down))
#define MCHP_XEC_DRV_PP_VAL(nid) \
(MCHP_XEC_PUSH_PULL * DT_PROP(nid, drive_push_pull))
#define MCHP_XEC_DRV_OD_VAL(nid) \
(MCHP_XEC_OPEN_DRAIN * DT_PROP(nid, drive_open_drain))
#define MCHP_XEC_OVAL_DRV_LO(nid) \
(MCHP_XEC_OVAL_LOW * DT_PROP(nid, output_low))
#define MCHP_XEC_OVAL_DRV_HI(nid) \
(MCHP_XEC_OVAL_HIGH * DT_PROP(nid, output_high))
#define MCHP_XEC_LOW_POWER_EN(nid) \
(MCHP_XEC_PIN_LOW_POWER * DT_PROP(nid, low_power_enable))
#define MCHP_XEC_SLEW_VAL(nid) \
(DT_ENUM_IDX_OR(nid, slew_rate, MCHP_XEC_OSPEEDR_NO_CHG) << \
MCHP_XEC_OSPEEDR_POS)
#define MCHP_XEC_DRVSTR_VAL(nid) \
(DT_ENUM_IDX_OR(nid, drive_strength, MCHP_XEC_ODRVSTR_NO_CHG) << \
MCHP_XEC_ODRVSTR_POS)
#define MCHP_XEC_FUNC_INVERT_VAL(nid) \
(MCHP_XEC_FUNC_INVERT * DT_PROP(nid, microchip_output_func_invert))
/* initialize pincfg field in structure pinctrl_pin_t */
#define Z_PINCTRL_MCHP_XEC_PINCFG_INIT(node_id) \
((MCHP_XEC_BIAS_DIS_VAL(node_id) << MCHP_XEC_PUPDR_POS) | \
(MCHP_XEC_BIAS_PU_VAL(node_id) << MCHP_XEC_PUPDR_POS) | \
(MCHP_XEC_BIAS_PD_VAL(node_id) << MCHP_XEC_PUPDR_POS) | \
(MCHP_XEC_DRV_PP_VAL(node_id) << MCHP_XEC_OTYPER_POS) | \
(MCHP_XEC_DRV_OD_VAL(node_id) << MCHP_XEC_OTYPER_POS) | \
(MCHP_XEC_OVAL_DRV_LO(node_id) << MCHP_XEC_OVAL_POS) | \
(MCHP_XEC_OVAL_DRV_HI(node_id) << MCHP_XEC_OVAL_POS) | \
(MCHP_XEC_LOW_POWER_EN(node_id) << MCHP_XEC_PIN_LOW_POWER_POS) | \
(MCHP_XEC_FUNC_INVERT_VAL(node_id) << MCHP_XEC_FUNC_INV_POS) | \
MCHP_XEC_SLEW_VAL(node_id) | \
MCHP_XEC_DRVSTR_VAL(node_id))
/* initialize pin structure members */
#define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \
{ .pinmux = Z_PINCTRL_MCHP_XEC_PINMUX_INIT( \
DT_PROP_BY_IDX(node_id, state_prop, idx)), \
.pincfg = Z_PINCTRL_MCHP_XEC_PINCFG_INIT( \
DT_PROP_BY_IDX(node_id, state_prop, idx)), },
/* Use DT FOREACH macro to initialize each used pin */
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
{DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT)}
/** @endcond */
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_SOC_ARM_MICROCHIP_XEC_COMMON_PINCTRL_SOC_H_ */