| /* |
| * 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 <zephyr/devicetree.h> |
| #include <zephyr/dt-bindings/pinctrl/renesas/pinctrl-rcar-common.h> |
| #include <stdint.h> |
| #include <zephyr/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_ */ |