imxrt: disable PWM synchronization when XBAR connection fails

This commit supplements commit 7d877fbb. External sync mode is now
disabled if XBAR connection fails and config options are used directly
in sync_src variable and passed to XBAR macro only when needed. The first
option could caused an undefined behaviour when sync_src was equal to -1
(external sync not used)

Signed-off-by: Michal Lenc <michallenc@seznam.cz>
This commit is contained in:
Michal Lenc 2022-09-20 19:22:23 +02:00 committed by Xiang Xiao
parent ba20cadd65
commit 11cf3de776

View File

@ -158,8 +158,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM1_MOD1_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM1_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC0_SEL_OFFSET,
},
#endif
@ -187,8 +186,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM1_MOD2_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM1_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC1_SEL_OFFSET,
},
#endif
@ -216,8 +214,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM1_MOD3_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM1_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC2_SEL_OFFSET,
},
#endif
@ -245,8 +242,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM1_MOD4_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM1_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC3_SEL_OFFSET,
},
#endif
@ -292,8 +288,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM2_MOD1_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM2_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC0_SEL_OFFSET,
},
#endif
@ -321,8 +316,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM2_MOD2_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM2_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC1_SEL_OFFSET,
},
#endif
@ -350,8 +344,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM2_MOD3_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM2_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC2_SEL_OFFSET,
},
#endif
@ -379,8 +372,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM2_MOD4_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM2_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC3_SEL_OFFSET,
}
#endif
@ -426,8 +418,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM3_MOD1_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM3_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC0_SEL_OFFSET,
},
#endif
@ -455,8 +446,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM3_MOD2_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM3_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC1_SEL_OFFSET,
},
#endif
@ -484,8 +474,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM3_MOD3_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM3_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC2_SEL_OFFSET,
},
#endif
@ -513,8 +502,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM3_MOD4_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM3_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC3_SEL_OFFSET,
},
#endif
@ -560,8 +548,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM4_MOD1_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM4_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC0_SEL_OFFSET,
},
#endif
@ -589,8 +576,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM4_MOD2_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM4_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC1_SEL_OFFSET,
},
#endif
@ -618,8 +604,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM4_MOD3_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM4_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC3_SEL_OFFSET,
},
#endif
@ -647,8 +632,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
.sync_src = IMXRT_XBARA1(XBAR_INPUT,
CONFIG_IMXRT_FLEXPWM4_MOD4_SYNC_SRC),
.sync_src = CONFIG_IMXRT_FLEXPWM4_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC4_SEL_OFFSET,
},
#endif
@ -955,16 +939,27 @@ static int pwm_setup(struct pwm_lowerhalf_s *dev)
/* Connect corresponding XBARs */
ret = imxrt_xbar_connect(priv->modules[i].ext_sync,
priv->modules[i].sync_src);
IMXRT_XBARA1(XBAR_INPUT,
priv->modules[i].sync_src));
if (ret < 0)
{
/* Disable external triggering if XBAR connection failed */
regval = getreg16(priv->base + IMXRT_FLEXPWM_SM0CTRL2_OFFSET
+ MODULE_OFFSET * shift);
regval &= ~(SMCTRL2_INIT_SEL_EXT_SYNC |
SMCTRL2_FORCE_SEL_EXT_SYNC |
SMCTRL2_FRCEN);
putreg16(regval, priv->base + IMXRT_FLEXPWM_SM0CTRL2_OFFSET
+ MODULE_OFFSET * shift);
pwmerr("ERROR: imxrt_xbar_connect failed: %d\n", ret);
}
}
if (priv->modules[i].trig_en)
{
/* Use duty cycle register for trigger generation */
/* Use period register for trigger generation */
regval = getreg16(priv->base + IMXRT_FLEXPWM_SM0TCTRL_OFFSET
+ MODULE_OFFSET * shift);