118 lines
3.6 KiB
C
118 lines
3.6 KiB
C
/*
|
|
* Copyright (c) 2021 IoT.bzh
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
*/
|
|
|
|
#ifndef ZEPHYR_SOC_ARM_RENESAS_RCAR_GEN3_PINCTRL_SOC_H_
|
|
#define ZEPHYR_SOC_ARM_RENESAS_RCAR_GEN3_PINCTRL_SOC_H_
|
|
|
|
#include <devicetree.h>
|
|
#include <dt-bindings/pinctrl/renesas/pinctrl-rcar-common.h>
|
|
#include <stdint.h>
|
|
#include <sys/util_macro.h>
|
|
|
|
struct rcar_pin_func {
|
|
uint8_t bank:5; /* bank number 0 - 18 */
|
|
uint8_t shift:5; /* bit shift 0 - 28 */
|
|
uint8_t func:4; /* choice from 0x0 to 0xF */
|
|
};
|
|
/** Pull-up, pull-down, or bias disable is requested */
|
|
#define RCAR_PIN_FLAGS_PULL_SET BIT(0)
|
|
/** Performs on/off control of the pull resistors */
|
|
#define RCAR_PIN_FLAGS_PUEN BIT(1)
|
|
/** Select pull-up resistor if set pull-down otherwise */
|
|
#define RCAR_PIN_FLAGS_PUD BIT(2)
|
|
/** Alternate function for the pin is requested */
|
|
#define RCAR_PIN_FLAGS_FUNC_SET BIT(3)
|
|
|
|
#define RCAR_PIN_PULL_UP (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN | RCAR_PIN_FLAGS_PUD)
|
|
#define RCAR_PIN_PULL_DOWN (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN)
|
|
#define RCAR_PIN_PULL_DISABLE RCAR_PIN_FLAGS_PULL_SET
|
|
|
|
/** Type for R-Car pin. */
|
|
typedef struct pinctrl_soc_pin {
|
|
uint16_t pin;
|
|
struct rcar_pin_func func;
|
|
uint8_t flags;
|
|
uint8_t drive_strength;
|
|
} pinctrl_soc_pin_t;
|
|
|
|
#define RCAR_IPSR(node_id) DT_PROP_BY_IDX(node_id, pin, 1)
|
|
#define RCAR_HAS_IPSR(node_id) DT_PROP_HAS_IDX(node_id, pin, 1)
|
|
|
|
/* Offsets are defined in dt-bindings pinctrl-rcar-common.h */
|
|
#define RCAR_PIN_FUNC(node_id) \
|
|
{ \
|
|
((RCAR_IPSR(node_id) >> 10U) & 0x1FU), \
|
|
((RCAR_IPSR(node_id) >> 4U) & 0x1FU), \
|
|
((RCAR_IPSR(node_id) & 0xFU)) \
|
|
}
|
|
|
|
#define RCAR_PIN_FLAGS(node_id) \
|
|
DT_PROP(node_id, bias_pull_up) * RCAR_PIN_PULL_UP | \
|
|
DT_PROP(node_id, bias_pull_down) * RCAR_PIN_PULL_DOWN | \
|
|
DT_PROP(node_id, bias_disable) * RCAR_PIN_PULL_DISABLE | \
|
|
RCAR_HAS_IPSR(node_id) * RCAR_PIN_FLAGS_FUNC_SET
|
|
|
|
#define RCAR_DT_PIN(node_id) \
|
|
{ \
|
|
.pin = DT_PROP_BY_IDX(node_id, pin, 0), \
|
|
.func = COND_CODE_1(RCAR_HAS_IPSR(node_id), \
|
|
(RCAR_PIN_FUNC(node_id)), (0)), \
|
|
.flags = RCAR_PIN_FLAGS(node_id), \
|
|
.drive_strength = \
|
|
COND_CODE_1(DT_NODE_HAS_PROP(node_id, drive_strength), \
|
|
(DT_PROP(node_id, drive_strength)), (0)), \
|
|
},
|
|
|
|
/**
|
|
* @brief Utility macro to initialize each pin.
|
|
*
|
|
* @param node_id Node identifier.
|
|
* @param state_prop State property name.
|
|
* @param idx State property entry index.
|
|
*/
|
|
#define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \
|
|
RCAR_DT_PIN(DT_PROP_BY_IDX(node_id, state_prop, idx))
|
|
|
|
/**
|
|
* @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_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT) }
|
|
|
|
struct pfc_drive_reg_field {
|
|
uint16_t pin;
|
|
uint8_t offset;
|
|
uint8_t size;
|
|
};
|
|
|
|
struct pfc_drive_reg {
|
|
uint32_t reg;
|
|
const struct pfc_drive_reg_field fields[8];
|
|
};
|
|
|
|
struct pfc_bias_reg {
|
|
uint32_t puen; /** Pull-enable or pull-up control register */
|
|
uint32_t pud; /** Pull-up/down or pull-down control register */
|
|
const uint16_t pins[32];
|
|
};
|
|
|
|
const struct pfc_bias_reg *pfc_rcar_get_bias_regs(void);
|
|
const struct pfc_drive_reg *pfc_rcar_get_drive_regs(void);
|
|
|
|
/**
|
|
* @brief Utility macro to check if a pin is GPIO capable
|
|
*
|
|
* @param pin
|
|
* @return true if pin is GPIO capable false otherwise
|
|
*/
|
|
#define RCAR_IS_GP_PIN(pin) (pin < PIN_NOGPSR_START)
|
|
|
|
#endif /* ZEPHYR_SOC_ARM_RENESAS_RCAR_GEN3_PINCTRL_SOC_H_ */
|