Line data Source code
1 0 : /* 2 : * Copyright (c) 2023 IoT.bzh 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : * 6 : */ 7 : 8 : #ifndef ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_ 9 : #define ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_ 10 : 11 : #include <zephyr/devicetree.h> 12 : #include <zephyr/dt-bindings/pinctrl/renesas/pinctrl-rcar-common.h> 13 : #include <stdint.h> 14 : #include <zephyr/sys/util_macro.h> 15 : 16 0 : struct rcar_pin_func { 17 0 : uint8_t bank:5; /* bank number 0 - 18 */ 18 0 : uint8_t shift:5; /* bit shift 0 - 28 */ 19 0 : uint8_t func:4; /* choice from 0x0 to 0xF */ 20 : }; 21 : 22 : /** Pull-up, pull-down, or bias disable is requested */ 23 1 : #define RCAR_PIN_FLAGS_PULL_SET BIT(0) 24 : /** Performs on/off control of the pull resistors */ 25 1 : #define RCAR_PIN_FLAGS_PUEN BIT(1) 26 : /** Select pull-up resistor if set pull-down otherwise */ 27 1 : #define RCAR_PIN_FLAGS_PUD BIT(2) 28 : /** Alternate function for the pin is requested */ 29 1 : #define RCAR_PIN_FLAGS_FUNC_SET BIT(3) 30 : /** Ignore IPSR settings for alternate function pin */ 31 1 : #define RCAR_PIN_FLAGS_FUNC_DUMMY BIT(4) 32 : 33 0 : #define RCAR_PIN_PULL_UP (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN | RCAR_PIN_FLAGS_PUD) 34 0 : #define RCAR_PIN_PULL_DOWN (RCAR_PIN_FLAGS_PULL_SET | RCAR_PIN_FLAGS_PUEN) 35 0 : #define RCAR_PIN_PULL_DISABLE RCAR_PIN_FLAGS_PULL_SET 36 : 37 : /** Type for R-Car pin. */ 38 1 : typedef struct pinctrl_soc_pin { 39 0 : uint16_t pin; 40 0 : struct rcar_pin_func func; 41 0 : uint8_t flags; 42 0 : uint8_t drive_strength; 43 0 : uint8_t voltage; 44 1 : } pinctrl_soc_pin_t; 45 : 46 0 : #define RCAR_IPSR(node_id) DT_PROP_BY_IDX(node_id, pin, 1) 47 0 : #define RCAR_HAS_IPSR(node_id) DT_PROP_HAS_IDX(node_id, pin, 1) 48 : 49 : /* Offsets are defined in dt-bindings pinctrl-rcar-common.h */ 50 0 : #define RCAR_PIN_FUNC(node_id) \ 51 : { \ 52 : ((RCAR_IPSR(node_id) >> 10U) & 0x1FU), \ 53 : ((RCAR_IPSR(node_id) >> 4U) & 0x1FU), \ 54 : ((RCAR_IPSR(node_id) & 0xFU)) \ 55 : } 56 : 57 0 : #define RCAR_PIN_IS_FUNC_DUMMY(node_id) \ 58 : ((((RCAR_IPSR(node_id) >> 10U) & 0x1FU) == 0x1F) && \ 59 : (((RCAR_IPSR(node_id) >> 4U) & 0x1FU) == 0x1F) && \ 60 : ((RCAR_IPSR(node_id) & 0xFU) == 0xF)) 61 : 62 0 : #define RCAR_PIN_FLAGS(node_id) \ 63 : DT_PROP(node_id, bias_pull_up) * RCAR_PIN_PULL_UP | \ 64 : DT_PROP(node_id, bias_pull_down) * RCAR_PIN_PULL_DOWN | \ 65 : DT_PROP(node_id, bias_disable) * RCAR_PIN_PULL_DISABLE | \ 66 : RCAR_HAS_IPSR(node_id) * RCAR_PIN_FLAGS_FUNC_SET | \ 67 : RCAR_PIN_IS_FUNC_DUMMY(node_id) * RCAR_PIN_FLAGS_FUNC_DUMMY 68 : 69 0 : #define RCAR_DT_PIN(node_id) \ 70 : { \ 71 : .pin = DT_PROP_BY_IDX(node_id, pin, 0), \ 72 : .func = COND_CODE_1(RCAR_HAS_IPSR(node_id), \ 73 : (RCAR_PIN_FUNC(node_id)), {0}), \ 74 : .flags = RCAR_PIN_FLAGS(node_id), \ 75 : .drive_strength = \ 76 : COND_CODE_1(DT_NODE_HAS_PROP(node_id, drive_strength), \ 77 : (DT_PROP(node_id, drive_strength)), (0)), \ 78 : .voltage = COND_CODE_1(DT_NODE_HAS_PROP(node_id, \ 79 : power_source), \ 80 : (DT_PROP(node_id, power_source)), \ 81 : (PIN_VOLTAGE_NONE)), \ 82 : }, 83 : 84 : /** 85 : * @brief Utility macro to initialize each pin. 86 : * 87 : * @param node_id Node identifier. 88 : * @param state_prop State property name. 89 : * @param idx State property entry index. 90 : */ 91 : #define Z_PINCTRL_STATE_PIN_INIT(node_id, state_prop, idx) \ 92 : RCAR_DT_PIN(DT_PROP_BY_IDX(node_id, state_prop, idx)) 93 : 94 : /** 95 : * @brief Utility macro to initialize state pins contained in a given property. 96 : * 97 : * @param node_id Node identifier. 98 : * @param prop Property name describing state pins. 99 : */ 100 : #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ 101 : { DT_FOREACH_PROP_ELEM(node_id, prop, Z_PINCTRL_STATE_PIN_INIT) } 102 : 103 0 : struct pfc_drive_reg_field { 104 0 : uint16_t pin; 105 0 : uint8_t offset; 106 0 : uint8_t size; 107 : }; 108 : 109 0 : struct pfc_drive_reg { 110 0 : uint32_t reg; 111 0 : const struct pfc_drive_reg_field fields[8]; 112 : }; 113 : 114 0 : struct pfc_bias_reg { 115 0 : uint32_t puen; /** Pull-enable or pull-up control register */ 116 1 : uint32_t pud; /** Pull-up/down or pull-down control register */ 117 1 : const uint16_t pins[32]; 118 : }; 119 : 120 : /** 121 : * @brief Utility macro to check if a pin is GPIO capable 122 : * 123 : * @param pin 124 : * @return true if pin is GPIO capable false otherwise 125 : */ 126 1 : #define RCAR_IS_GP_PIN(pin) (pin < PIN_NOGPSR_START) 127 : 128 : #endif /* ZEPHYR_SOC_ARM_RENESAS_RCAR_COMMON_PINCTRL_SOC_H_ */