On 22.11.2022 19:32:30, haibo.chen@xxxxxxx wrote: > From: Haibo Chen <haibo.chen@xxxxxxx> > > IMX93 do not contain a GPR to config the stop mode, it will set > the flexcan into stop mode automatically once the ARM core go > into low power mode (WFI instruct) and gate off the flexcan > related clock automatically. But to let these logic work as > expect, before ARM core go into low power mode, need to make > sure the flexcan related clock keep on. > > To support stop mode and wakeup feature on imx93, this patch > add a new fsl_imx93_devtype_data to separate from imx8mp. > > Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx> > --- > drivers/net/can/flexcan/flexcan-core.c | 37 +++++++++++++++++++++++--- > drivers/net/can/flexcan/flexcan.h | 2 ++ > 2 files changed, 36 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/can/flexcan/flexcan-core.c b/drivers/net/can/flexcan/flexcan-core.c > index 9bdadd716f4e..0aeff34e5ae1 100644 > --- a/drivers/net/can/flexcan/flexcan-core.c > +++ b/drivers/net/can/flexcan/flexcan-core.c > @@ -345,6 +345,15 @@ static struct flexcan_devtype_data fsl_imx8mp_devtype_data = { > FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR, > }; > > +static struct flexcan_devtype_data fsl_imx93_devtype_data = { > + .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS | > + FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_RX_MAILBOX | > + FLEXCAN_QUIRK_BROKEN_PERR_STATE | FLEXCAN_QUIRK_AUTO_STOP_MODE | > + FLEXCAN_QUIRK_SUPPORT_FD | FLEXCAN_QUIRK_SUPPORT_ECC | > + FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX | > + FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR, > +}; > + > static const struct flexcan_devtype_data fsl_vf610_devtype_data = { > .quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS | > FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_RX_MAILBOX | > @@ -532,9 +541,14 @@ static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv) > ret = flexcan_stop_mode_enable_scfw(priv, true); > if (ret < 0) > return ret; > - } else { > + } else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR) { > regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, > 1 << priv->stm.req_bit, 1 << priv->stm.req_bit); > + } else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_AUTO_STOP_MODE) { > + /* For the auto stop mode, software do nothing, hardware will cover > + * all the operation automatically after system go into low power mode. > + */ > + return 0; > } > > return flexcan_low_power_enter_ack(priv); > @@ -551,7 +565,7 @@ static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv) > ret = flexcan_stop_mode_enable_scfw(priv, false); > if (ret < 0) > return ret; > - } else { > + } else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR) { > regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, > 1 << priv->stm.req_bit, 0); > } > @@ -560,6 +574,12 @@ static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv) > reg_mcr &= ~FLEXCAN_MCR_SLF_WAK; > priv->write(reg_mcr, ®s->mcr); > > + /* For the auto stop mode, hardware will exist stop mode ^^^^^ exit? No need to resend. Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Attachment:
signature.asc
Description: PGP signature