From ab25fdf1a9c2e1a177a33db71dbb44cb538e234a Mon Sep 17 00:00:00 2001 From: Jiafei Pan Date: Thu, 12 Dec 2024 15:46:20 +0800 Subject: [PATCH] boards: imx8mp_evk: add i2c support Added i2c3 support on imx8mp_evk A53 board. Signed-off-by: Jiafei Pan --- boards/nxp/imx8mp_evk/imx8mp_evk-pinctrl.dtsi | 12 ++++++++++++ .../nxp/imx8mp_evk/imx8mp_evk_mimx8ml8_a53.dts | 8 ++++++++ soc/nxp/imx/imx8m/a53/soc.c | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/boards/nxp/imx8mp_evk/imx8mp_evk-pinctrl.dtsi b/boards/nxp/imx8mp_evk/imx8mp_evk-pinctrl.dtsi index f88555b13e2..fd112cf8da2 100644 --- a/boards/nxp/imx8mp_evk/imx8mp_evk-pinctrl.dtsi +++ b/boards/nxp/imx8mp_evk/imx8mp_evk-pinctrl.dtsi @@ -66,4 +66,16 @@ drive-strength = "x1"; }; }; + + pinmux_i2c3: pinmux_i2c3 { + group0 { + pinmux = <&iomuxc_i2c3_scl_i2c_scl_i2c3_scl>, + <&iomuxc_i2c3_sda_i2c_sda_i2c3_sda>; + bias-pull-up; + input-schmitt-enable; + slew-rate = "slow"; + drive-strength = "x4"; + input-enable; + }; + }; }; diff --git a/boards/nxp/imx8mp_evk/imx8mp_evk_mimx8ml8_a53.dts b/boards/nxp/imx8mp_evk/imx8mp_evk_mimx8ml8_a53.dts index c50173e3f3a..d21ee0793ec 100644 --- a/boards/nxp/imx8mp_evk/imx8mp_evk_mimx8ml8_a53.dts +++ b/boards/nxp/imx8mp_evk/imx8mp_evk_mimx8ml8_a53.dts @@ -6,6 +6,7 @@ /dts-v1/; +#include #include #include "imx8mp_evk-pinctrl.dtsi" @@ -69,3 +70,10 @@ pinctrl-0 = <&uart4_default>; pinctrl-names = "default"; }; + +&i2c3 { + status = "okay"; + pinctrl-0 = <&pinmux_i2c3>; + pinctrl-names = "default"; + clock-frequency = ; +}; diff --git a/soc/nxp/imx/imx8m/a53/soc.c b/soc/nxp/imx/imx8m/a53/soc.c index a110213e2b6..8125d90632a 100644 --- a/soc/nxp/imx/imx8m/a53/soc.c +++ b/soc/nxp/imx/imx8m/a53/soc.c @@ -45,6 +45,12 @@ static void soc_rdc_init(void) periphConfig.policy = RDC_DT_VAL(enet); RDC_SetPeriphAccessConfig(rdc_inst, &periphConfig); #endif + +#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(i2c3)) && DT_NODE_HAS_PROP(DT_NODELABEL(i2c3), rdc) + periphConfig.periph = kRDC_Periph_I2C3; + periphConfig.policy = RDC_DT_VAL(i2c3); + RDC_SetPeriphAccessConfig(rdc_inst, &periphConfig); +#endif } #else @@ -52,7 +58,19 @@ static void soc_rdc_init(void) #endif +static void soc_clock_init(void) +{ +#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(i2c3)) + /* Set I2C source to SysPLL1 Div5 160MHZ */ + CLOCK_SetRootMux(kCLOCK_RootI2c3, kCLOCK_I2cRootmuxSysPll1Div5); + /* Set root clock to 160MHZ / 10 = 16MHZ */ + CLOCK_SetRootDivider(kCLOCK_RootI2c3, 1U, 10U); + CLOCK_EnableClock(kCLOCK_I2c3); +#endif +} + void soc_prep_hook(void) { soc_rdc_init(); + soc_clock_init(); }