|
| 1 | +/* |
| 2 | + * Copyright (c) 2022, NXP |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +#ifndef ZEPHYR_SOC_ARM_NXP_IMX_RT_PINCTRL_SOC_H_ |
| 8 | +#define ZEPHYR_SOC_ARM_NXP_IMX_RT_PINCTRL_SOC_H_ |
| 9 | + |
| 10 | +#include <devicetree.h> |
| 11 | +#include <zephyr/types.h> |
| 12 | +#include "fsl_common.h" |
| 13 | + |
| 14 | +#ifdef __cplusplus |
| 15 | +extern "C" { |
| 16 | +#endif |
| 17 | + |
| 18 | +struct pinctrl_soc_pinmux { |
| 19 | + uint32_t mux_register; |
| 20 | + uint32_t mux_mode; |
| 21 | + uint32_t input_register; |
| 22 | + uint32_t input_daisy; |
| 23 | + uint32_t config_register; |
| 24 | +}; |
| 25 | + |
| 26 | +struct pinctrl_soc_pin { |
| 27 | + struct pinctrl_soc_pinmux pinmux; |
| 28 | + uint32_t pin_ctrl_flags; |
| 29 | +}; |
| 30 | + |
| 31 | +typedef struct pinctrl_soc_pin pinctrl_soc_pin_t; |
| 32 | + |
| 33 | +#define MCUX_RT_INPUT_SCHMITT_ENABLE_SHIFT IOMUXC_SW_PAD_CTL_PAD_HYS_SHIFT |
| 34 | +#define MCUX_RT_BIAS_PULL_DOWN_SHIFT IOMUXC_SW_PAD_CTL_PAD_PUS_SHIFT |
| 35 | +#define MCUX_RT_BIAS_PULL_UP_SHIFT IOMUXC_SW_PAD_CTL_PAD_PUS_SHIFT |
| 36 | +#define MCUX_RT_BIAS_BUS_HOLD_SHIFT IOMUXC_SW_PAD_CTL_PAD_PUE_SHIFT |
| 37 | +#define MCUX_RT_PULL_ENABLE_SHIFT IOMUXC_SW_PAD_CTL_PAD_PKE_SHIFT |
| 38 | +#define MCUX_RT_DRIVE_OPEN_DRAIN_SHIFT IOMUXC_SW_PAD_CTL_PAD_ODE_SHIFT |
| 39 | +#define MCUX_RT_SPEED_SHIFT IOMUXC_SW_PAD_CTL_PAD_SPEED_SHIFT |
| 40 | +#define MCUX_RT_DRIVE_STRENGTH_SHIFT IOMUXC_SW_PAD_CTL_PAD_DSE_SHIFT |
| 41 | +#define MCUX_RT_SLEW_RATE_SHIFT IOMUXC_SW_PAD_CTL_PAD_SRE_SHIFT |
| 42 | +#define MCUX_RT_INPUT_ENABLE_SHIFT 31 /* Shift to a bit not used by IOMUXC_SW_PAD_CTL */ |
| 43 | +#define MCUX_RT_INPUT_ENABLE(x) ((x >> MCUX_RT_INPUT_ENABLE_SHIFT) & 0x1) |
| 44 | + |
| 45 | +#define Z_PINCTRL_MCUX_RT_PINCFG_INIT(node_id) \ |
| 46 | + ((DT_PROP(node_id, input_schmitt_enable) << MCUX_RT_INPUT_SCHMITT_ENABLE_SHIFT) | \ |
| 47 | + IF_ENABLED(DT_PROP(node_id, bias_pull_up), (DT_ENUM_IDX(node_id, bias_pull_up_value) \ |
| 48 | + << MCUX_RT_BIAS_PULL_UP_SHIFT) |) \ |
| 49 | + IF_ENABLED(DT_PROP(node_id, bias_pull_down), (DT_ENUM_IDX(node_id, bias_pull_down_value)\ |
| 50 | + << MCUX_RT_BIAS_PULL_DOWN_SHIFT) |) \ |
| 51 | + ((DT_PROP(node_id, bias_pull_down) | DT_PROP(node_id, bias_pull_up)) \ |
| 52 | + << MCUX_RT_BIAS_BUS_HOLD_SHIFT) | \ |
| 53 | + ((!DT_PROP(node_id, bias_disable)) << MCUX_RT_PULL_ENABLE_SHIFT) | \ |
| 54 | + (DT_PROP(node_id, drive_open_drain) << MCUX_RT_DRIVE_OPEN_DRAIN_SHIFT) | \ |
| 55 | + (DT_ENUM_IDX(node_id, nxp_speed) << MCUX_RT_SPEED_SHIFT) | \ |
| 56 | + (DT_ENUM_IDX(node_id, drive_strength) << MCUX_RT_DRIVE_STRENGTH_SHIFT) | \ |
| 57 | + (DT_ENUM_IDX(node_id, slew_rate) << MCUX_RT_SLEW_RATE_SHIFT) | \ |
| 58 | + (DT_PROP(node_id, input_enable) << MCUX_RT_INPUT_ENABLE_SHIFT)) |
| 59 | + |
| 60 | + |
| 61 | +#define Z_PINCTRL_PINMUX(group_id, pin_prop, idx, pinmux_idx) \ |
| 62 | + DT_PROP_BY_IDX(DT_PHANDLE_BY_IDX(group_id, pin_prop, idx), pinmux, pinmux_idx) |
| 63 | + |
| 64 | +#define Z_PINCTRL_STATE_PIN_INIT(group_id, pin_prop, idx) \ |
| 65 | + { \ |
| 66 | + .pinmux.mux_register = Z_PINCTRL_PINMUX(group_id, pin_prop, idx, 0), \ |
| 67 | + .pinmux.mux_mode = Z_PINCTRL_PINMUX(group_id, pin_prop, idx, 1), \ |
| 68 | + .pinmux.input_register = Z_PINCTRL_PINMUX(group_id, pin_prop, idx, 2), \ |
| 69 | + .pinmux.input_daisy = Z_PINCTRL_PINMUX(group_id, pin_prop, idx, 3), \ |
| 70 | + .pinmux.config_register = Z_PINCTRL_PINMUX(group_id, pin_prop, idx, 4), \ |
| 71 | + .pin_ctrl_flags = Z_PINCTRL_MCUX_RT_PINCFG_INIT(group_id), \ |
| 72 | + }, |
| 73 | + |
| 74 | + |
| 75 | +#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ |
| 76 | + {DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \ |
| 77 | + DT_FOREACH_PROP_ELEM, pinmux, Z_PINCTRL_STATE_PIN_INIT)}; \ |
| 78 | + |
| 79 | + |
| 80 | +#ifdef __cplusplus |
| 81 | +} |
| 82 | +#endif |
| 83 | + |
| 84 | +#endif /* ZEPHYR_SOC_ARM_NXP_IMX_RT_PINCTRL_SOC_H_ */ |
0 commit comments