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