/*
 * Copyright (c) 2020 Linaro Ltd.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file
 * @brief ST STM32 MCU family devicetree helper macros
 */

#ifndef _ST_STM32_DT_H_
#define _ST_STM32_DT_H_

#include <zephyr/devicetree.h>

/* Devicetree related macros to construct pinctrl config data */

#if !defined(CONFIG_PINCTRL_STM32)
#define STM32_NO_PULL    0x0
#define STM32_PULL_UP    0x1
#define STM32_PULL_DOWN  0x2
#define STM32_PUSH_PULL  0x0
#define STM32_OPEN_DRAIN 0x1
#endif /* CONFIG_PINCTRL_STM32 */


/**
 * @brief Internal: Get a node identifier for an element in a
 *        pinctrl-x property for a given device instance inst
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @return elements's node identifier
 */
#define ST_STM32_DT_INST_NODE_ID_FROM_PINCTRL(inst, x, i) \
	DT_INST_PINCTRL_BY_IDX(inst, x, i)

/**
 * @brief Internal: Get a node identifier for an element in a
 *        pinctrl-x property for a given device
 *
 * @param name device node label identifier
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @return elements's node identifier
 */
#define ST_STM32_DT_NODE_ID_FROM_PINCTRL(name, x, i) \
	DT_PINCTRL_BY_IDX(DT_NODELABEL(name), x, i)

/**
 * @brief Internal: Get pinmux property of a node identifier for an element
 *        in a pinctrl-x property for a given device instance inst
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @return pinmux property value
 */
#define ST_STM32_DT_INST_PINMUX(inst, x, i) \
	DT_PROP(ST_STM32_DT_INST_NODE_ID_FROM_PINCTRL(inst, x, i), pinmux)

/**
 * @brief Internal: Get pinmux property of a node identifier for an element
 *        in a pinctrl-x property for a given device
 *
 * @param name device node label identifier
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @return pinmux property value
 */
#define ST_STM32_DT_PINMUX(name, x, i) \
	DT_PROP(ST_STM32_DT_NODE_ID_FROM_PINCTRL(name, x, i), pinmux)

/**
 * @brief Internal: Get <function> property of a node identifier for an element
 *        in a pinctrl-x property for a given device instance inst
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @param function property of a targeted element
 * @return <function> property value
 */
#define ST_STM32_DT_INST_FUNC(inst, x, i, function) \
	DT_PROP(ST_STM32_DT_INST_NODE_ID_FROM_PINCTRL(inst, x, i), function)

/**
 * @brief Internal: Get <function> property of a node identifier for an element
 *        in a pinctrl-x property for a given device
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param name device node label identifier
 * @param function property of a targeted element
 * @return <function> property value
 */
#define ST_STM32_DT_FUNC(name, x, i, function) \
	DT_PROP(ST_STM32_DT_NODE_ID_FROM_PINCTRL(name, x, i), function)

/**
 * @brief Internal: Provide slew-rate value for a pin with index i of a
 *        pinctrl-x property for a given device instance inst
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param i index of soc_gpio_pinctrl element
 * @return slew rate value
 */
#define ST_STM32_DT_INST_SLEW_RATE(inst, x, i) \
	DT_ENUM_IDX(ST_STM32_DT_INST_NODE_ID_FROM_PINCTRL(inst, x, i), \
								slew_rate)

/**
 * @brief Internal: Provide slew-rate value for a pin with index i of a
 *        pinctrl-x property for a given device
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param name device node label identifier
 * @return slew rate value
 */
#define ST_STM32_DT_SLEW_RATE(name, x, i) \
	DT_ENUM_IDX(ST_STM32_DT_NODE_ID_FROM_PINCTRL(name, x, i), slew_rate)

/**
 * @brief Internal: Construct a pincfg field of a soc_gpio_pinctrl element
 *        with index i of a pinctrl-x property for a given device instance inst
 *
 * @param i index of soc_gpio_pinctrl element
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param inst device instance number
 * @return pincfg field
 */
#ifndef CONFIG_SOC_SERIES_STM32F1X
#define ST_STM32_DT_INST_PINCFG(inst, x, i)				       \
	(((STM32_NO_PULL * ST_STM32_DT_INST_FUNC(inst, x, i, bias_disable))    \
						<< STM32_PUPDR_SHIFT) |	       \
	((STM32_PULL_UP * ST_STM32_DT_INST_FUNC(inst, x, i, bias_pull_up))     \
						<< STM32_PUPDR_SHIFT) |        \
	((STM32_PULL_DOWN * ST_STM32_DT_INST_FUNC(inst, x, i, bias_pull_down)) \
						<< STM32_PUPDR_SHIFT) |        \
	((STM32_PUSH_PULL * ST_STM32_DT_INST_FUNC(inst, x, i, drive_push_pull))\
						<< STM32_OTYPER_SHIFT) |       \
	((STM32_OPEN_DRAIN * ST_STM32_DT_INST_FUNC(inst, x, i,		       \
							drive_open_drain))     \
						<< STM32_OTYPER_SHIFT) |       \
	(ST_STM32_DT_INST_SLEW_RATE(inst, x, i) << STM32_OSPEEDR_SHIFT))
#else
#define ST_STM32_DT_INST_PINCFG(inst, x, i)				       \
	(((STM32_NO_PULL * ST_STM32_DT_INST_FUNC(inst, x, i, bias_disable))    \
						<< STM32_PUPD_SHIFT) |         \
	((STM32_PULL_UP * ST_STM32_DT_INST_FUNC(inst, x, i, bias_pull_up))     \
						<< STM32_PUPD_SHIFT) |         \
	((STM32_PULL_DOWN * ST_STM32_DT_INST_FUNC(inst, x, i, bias_pull_down)) \
						<< STM32_PUPD_SHIFT) |         \
	((STM32_PUSH_PULL * ST_STM32_DT_INST_FUNC(inst, x, i, drive_push_pull))\
						<< STM32_CNF_OUT_0_SHIFT) |    \
	((STM32_OPEN_DRAIN * ST_STM32_DT_INST_FUNC(inst, x, i,		       \
							drive_open_drain))     \
						<< STM32_CNF_OUT_0_SHIFT) |    \
	(ST_STM32_DT_INST_SLEW_RATE(inst, x, i) << STM32_MODE_OSPEED_SHIFT))
#endif /* CONFIG_SOC_SERIES_STM32F1X */

/**
 * @brief Internal: Construct a pincfg field of a soc_gpio_pinctrl element
 *        with index i of a pinctrl-x property for a given device
 *
 * @param i index of soc_gpio_pinctrl element
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param name device node label identifier
 * @return pincfg field
 */
#ifndef CONFIG_SOC_SERIES_STM32F1X
#define ST_STM32_DT_PINCFG(name, x, i)					    \
	(((STM32_NO_PULL * ST_STM32_DT_FUNC(name, x, i, bias_disable))      \
						<< STM32_PUPDR_SHIFT) |     \
	((STM32_PULL_UP * ST_STM32_DT_FUNC(name, x, i, bias_pull_up))       \
						<< STM32_PUPDR_SHIFT) |     \
	((STM32_PULL_DOWN * ST_STM32_DT_FUNC(name, x, i, bias_pull_down))   \
						<< STM32_PUPDR_SHIFT) |     \
	((STM32_PUSH_PULL * ST_STM32_DT_FUNC(name, x, i, drive_push_pull))  \
						<< STM32_OTYPER_SHIFT) |    \
	((STM32_OPEN_DRAIN * ST_STM32_DT_FUNC(name, x, i, drive_open_drain))\
						<< STM32_OTYPER_SHIFT) |    \
	(ST_STM32_DT_SLEW_RATE(name, x, i) << STM32_OSPEEDR_SHIFT))
#else
#define ST_STM32_DT_PINCFG(name, x, i)				            \
	(((STM32_NO_PULL * ST_STM32_DT_FUNC(name, x, i, bias_disable))      \
						<< STM32_PUPD_SHIFT) |      \
	((STM32_PULL_UP * ST_STM32_DT_FUNC(name, x, i, bias_pull_up))       \
						<< STM32_PUPD_SHIFT) |      \
	((STM32_PULL_DOWN * ST_STM32_DT_FUNC(name, x, i, bias_pull_down))   \
						<< STM32_PUPD_SHIFT) |      \
	((STM32_PUSH_PULL * ST_STM32_DT_FUNC(name, x, i, drive_push_pull))  \
						<< STM32_CNF_OUT_0_SHIFT) | \
	((STM32_OPEN_DRAIN * ST_STM32_DT_FUNC(name, x, i, drive_open_drain))\
						<< STM32_CNF_OUT_0_SHIFT) | \
	(ST_STM32_DT_SLEW_RATE(name, x, i) << STM32_MODE_OSPEED_SHIFT))
#endif /* CONFIG_SOC_SERIES_STM32F1X */

/**
 * @brief Internal: Construct a soc_gpio_pinctrl element index i of
 *        a pinctrl-x property for a given device instance inst
 *
 * @param i element index
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param inst device instance number
 * @return soc_gpio_pinctrl element
 */
#define ST_STM32_DT_INST_PIN_ELEM(i, x, inst)			\
	{							\
		ST_STM32_DT_INST_PINMUX(inst, x, i),		\
		ST_STM32_DT_INST_PINCFG(inst, x, i)		\
	}

/**
 * @brief Internal: Construct a soc_gpio_pinctrl element index i of
 *        a pinctrl-x property for a given device
 *
 * @param i element index
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @param name device node label identifier
 * @return soc_gpio_pinctrl element
 */
#define ST_STM32_DT_PIN_ELEM(i, x, name)		\
	{						\
		ST_STM32_DT_PINMUX(name, x, i),		\
		ST_STM32_DT_PINCFG(name, x, i)		\
	}

/**
 * @brief Internal: Return the number of elements of a pinctrl-x property
 *        for a given device instance
 *
 * This macro returns the number of element in property pcintrl-<x> of
 * device instance <inst>
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @return number of element in property
 */
#define ST_STM32_DT_INST_NUM_PINS(inst, x) DT_INST_NUM_PINCTRLS_BY_IDX(inst, x)

/**
 * @brief Internal: Return the number of elements of a pinctrl-x property
 *        for a given device
 *
 * This macro returns the number of element in property pcintrl-<x> of
 * device "name"
 *
 * @param name device node label identifier
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @return number of element in property
 */
#define ST_STM32_DT_NUM_PINS(name, x) \
				DT_NUM_PINCTRLS_BY_IDX(DT_NODELABEL(name), x)

/**
 * @brief Construct a soc_gpio_pinctrl array of a specific pcintrl property
 *        for a given device instance
 *
 * This macro returns an array of soc_gpio_pinctrl, each line matching a pinctrl
 * configuration provided in property pcintrl-<x> of device instance <inst>
 *
 * @param inst device instance number
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @return array of soc_gpio_pinctrl
 */
#define ST_STM32_DT_INST_PINCTRL(inst, x)				\
	{ COND_CODE_1(DT_INST_PINCTRL_HAS_IDX(inst, x),			\
		      (LISTIFY(ST_STM32_DT_INST_NUM_PINS(inst, x),	\
			       ST_STM32_DT_INST_PIN_ELEM, (,),		\
			       x,					\
			       inst)),				\
		      ())						\
	}

/**
 * @brief Construct a soc_gpio_pinctrl array of a specific pcintrl property
 *        for a given device name
 *
 * This macro returns an array of soc_gpio_pinctrl, each line matching a pinctrl
 * configuration provided in property pcintrl-<x> of a device referenced by
 * its node label identifier.
 *
 * @param name device node label identifier
 * @param x index of targeted pinctrl- property (eg: pinctrl-<x>)
 * @return array of soc_gpio_pinctrl
 */
#define ST_STM32_DT_PINCTRL(name, x)					\
	{ COND_CODE_1(DT_PINCTRL_HAS_IDX(DT_NODELABEL(name), x),	\
		      (LISTIFY(ST_STM32_DT_NUM_PINS(name, x),		\
			       ST_STM32_DT_PIN_ELEM, (,),		\
			       x,					\
			       name)),					\
		      ())						\
	}

#endif /* _ST_STM32_DT_H_ */
