Skip to content

Commit 946b9dc

Browse files
danieldegrassedleach02
authored andcommitted
boards: imx8mm: add partial pin control support
Add initial pin control support for the A53 core of the imx8mm. Since the UART console driver is not currently enabled for this platform, there is no way to test the full pin control enablement. Therefore, CONFIG_PINCTRL is still not selected for this platform, although the required DTS definitions and pin control headers are present. Signed-off-by: Daniel DeGrasse <[email protected]>
1 parent 0eedecc commit 946b9dc

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

boards/arm64/imx8mm_evk/imx8mm_evk.dts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/dts-v1/;
88

99
#include <nxp/nxp_imx8mm_a53.dtsi>
10+
#include "imx8mm_evk-pinctrl.dtsi"
1011

1112
/ {
1213
model = "NXP i.MX8MM A53";

boards/arm64/imx8mm_evk/imx8mm_evk_jailhouse.dts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/dts-v1/;
88

99
#include <nxp/nxp_imx8mm_a53.dtsi>
10+
#include "imx8mm_evk-pinctrl.dtsi"
1011

1112
/ {
1213
model = "NXP i.MX8MM A53";
@@ -38,4 +39,6 @@
3839
&uart4 {
3940
status = "okay";
4041
current-speed = <115200>;
42+
pinctrl-0 = <&uart4_default>;
43+
pinctrl-names = "default";
4144
};

dts/arm64/nxp/nxp_imx8mm_a53.dtsi

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@
6161
status = "okay";
6262
};
6363

64+
iomuxc: iomuxc@30330000 {
65+
compatible = "nxp,imx-iomuxc";
66+
reg = <0x30330000 DT_SIZE_K(64)>;
67+
status = "okay";
68+
pinctrl: pinctrl {
69+
status = "okay";
70+
compatible = "nxp,imx8m-pinctrl";
71+
};
72+
};
73+
6474
ana_pll: ana_pll@30360000 {
6575
compatible = "nxp,imx-ana";
6676
reg = <0x30360000 DT_SIZE_K(64)>;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright (c) 2022, NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef ZEPHYR_SOC_ARM64_NXP_IMX8M_PINCTRL_SOC_H_
8+
#define ZEPHYR_SOC_ARM64_NXP_IMX8M_PINCTRL_SOC_H_
9+
10+
#include <zephyr/devicetree.h>
11+
#include <zephyr/types.h>
12+
#include "fsl_common.h"
13+
14+
#ifdef __cplusplus
15+
extern "C" {
16+
#endif
17+
18+
#define MCUX_IMX_INPUT_SCHMITT_ENABLE_SHIFT IOMUXC_SW_PAD_CTL_PAD_HYS_SHIFT
19+
#define MCUX_IMX_BIAS_PULL_UP_SHIFT IOMUXC_SW_PAD_CTL_PAD_PUE_SHIFT
20+
#define MCUX_IMX_BIAS_PULL_ENABLE_SHIFT IOMUXC_SW_PAD_CTL_PAD_PE_SHIFT
21+
#define MCUX_IMX_DRIVE_OPEN_DRAIN_SHIFT IOMUXC_SW_PAD_CTL_PAD_ODE_SHIFT
22+
#define MCUX_IMX_SLEW_RATE_SHIFT IOMUXC_SW_PAD_CTL_PAD_FSEL_SHIFT
23+
#define MCUX_IMX_DRIVE_STRENGTH_SHIFT IOMUXC_SW_PAD_CTL_PAD_DSE_SHIFT
24+
#define MCUX_IMX_INPUT_ENABLE_SHIFT 31 /* Shift to a bit not used by IOMUXC_SW_PAD_CTL */
25+
#define MCUX_IMX_INPUT_ENABLE(x) ((x >> MCUX_IMX_INPUT_ENABLE_SHIFT) & 0x1)
26+
27+
#define Z_PINCTRL_MCUX_IMX_PINCFG_INIT(node_id) \
28+
((DT_PROP(node_id, input_schmitt_enable) << MCUX_IMX_INPUT_SCHMITT_ENABLE_SHIFT) | \
29+
(DT_PROP(node_id, bias_pull_up) << MCUX_IMX_BIAS_PULL_UP_SHIFT) | \
30+
((DT_PROP(node_id, bias_pull_up) | DT_PROP(node_id, bias_pull_down)) \
31+
<< MCUX_IMX_BIAS_PULL_ENABLE_SHIFT) | \
32+
(DT_PROP(node_id, drive_open_drain) << MCUX_IMX_DRIVE_OPEN_DRAIN_SHIFT) | \
33+
(DT_ENUM_IDX(node_id, drive_strength) << MCUX_IMX_DRIVE_STRENGTH_SHIFT) | \
34+
(DT_ENUM_IDX(node_id, slew_rate) << MCUX_IMX_SLEW_RATE_SHIFT) | \
35+
(DT_PROP(node_id, input_enable) << MCUX_IMX_INPUT_ENABLE_SHIFT))
36+
37+
38+
/* This struct must be present. It is used by the mcux gpio driver */
39+
struct pinctrl_soc_pinmux {
40+
uint32_t mux_register; /*!< IOMUXC SW_PAD_MUX register */
41+
uint32_t config_register; /*!< IOMUXC SW_PAD_CTL register */
42+
uint32_t input_register; /*!< IOMUXC SELECT_INPUT DAISY register */
43+
uint8_t mux_mode: 4; /*!< Mux value for SW_PAD_MUX register */
44+
uint32_t input_daisy:4; /*!< Mux value for SELECT_INPUT_DAISY register */
45+
};
46+
47+
struct pinctrl_soc_pin {
48+
struct pinctrl_soc_pinmux pinmux;
49+
uint32_t pin_ctrl_flags; /*!< value to write to IOMUXC_SW_PAD_CTL register */
50+
};
51+
52+
typedef struct pinctrl_soc_pin pinctrl_soc_pin_t;
53+
54+
/* This definition must be present. It is used by the mcux gpio driver */
55+
#define MCUX_IMX_PINMUX(node_id) \
56+
{ \
57+
.mux_register = DT_PROP_BY_IDX(node_id, pinmux, 0), \
58+
.config_register = DT_PROP_BY_IDX(node_id, pinmux, 4), \
59+
.input_register = DT_PROP_BY_IDX(node_id, pinmux, 2), \
60+
.mux_mode = DT_PROP_BY_IDX(node_id, pinmux, 1), \
61+
.input_daisy = DT_PROP_BY_IDX(node_id, pinmux, 3), \
62+
}
63+
64+
#define Z_PINCTRL_PINMUX(group_id, pin_prop, idx) \
65+
MCUX_IMX_PINMUX(DT_PHANDLE_BY_IDX(group_id, pin_prop, idx))
66+
67+
#define Z_PINCTRL_STATE_PIN_INIT(group_id, pin_prop, idx) \
68+
{ \
69+
.pinmux = Z_PINCTRL_PINMUX(group_id, pin_prop, idx), \
70+
.pin_ctrl_flags = Z_PINCTRL_MCUX_IMX_PINCFG_INIT(group_id), \
71+
},
72+
73+
74+
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \
75+
{DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \
76+
DT_FOREACH_PROP_ELEM, pinmux, Z_PINCTRL_STATE_PIN_INIT)}; \
77+
78+
79+
#ifdef __cplusplus
80+
}
81+
#endif
82+
83+
#endif /* ZEPHYR_SOC_ARM64_NXP_IMX8M_PINCTRL_SOC_H_ */

0 commit comments

Comments
 (0)