summaryrefslogtreecommitdiff
path: root/drivers/fsl_smc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/fsl_smc.c')
-rw-r--r--drivers/fsl_smc.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/drivers/fsl_smc.c b/drivers/fsl_smc.c
index 45382fd..dacf193 100644
--- a/drivers/fsl_smc.c
+++ b/drivers/fsl_smc.c
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
- * All rights reserved.
+ * Copyright 2016-2017 NXP
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
@@ -12,7 +12,7 @@
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
- * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
+ * o Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
@@ -29,6 +29,7 @@
*/
#include "fsl_smc.h"
+#include "fsl_flash.h"
#if (defined(FSL_FEATURE_SMC_HAS_PARAM) && FSL_FEATURE_SMC_HAS_PARAM)
void SMC_GetParam(SMC_Type *base, smc_param_t *param)
@@ -41,6 +42,39 @@ void SMC_GetParam(SMC_Type *base, smc_param_t *param)
}
#endif /* FSL_FEATURE_SMC_HAS_PARAM */
+void SMC_PreEnterStopModes(void)
+{
+ flash_prefetch_speculation_status_t speculationStatus =
+ {
+ kFLASH_prefetchSpeculationOptionDisable, /* Disable instruction speculation.*/
+ kFLASH_prefetchSpeculationOptionDisable, /* Disable data speculation.*/
+ };
+
+ __disable_irq();
+ __ISB();
+
+ /*
+ * Before enter stop modes, the flash cache prefetch should be disabled.
+ * Otherwise the prefetch might be interrupted by stop, then the data and
+ * and instruction from flash are wrong.
+ */
+ FLASH_PflashSetPrefetchSpeculation(&speculationStatus);
+}
+
+void SMC_PostExitStopModes(void)
+{
+ flash_prefetch_speculation_status_t speculationStatus =
+ {
+ kFLASH_prefetchSpeculationOptionEnable, /* Enable instruction speculation.*/
+ kFLASH_prefetchSpeculationOptionEnable, /* Enable data speculation.*/
+ };
+
+ FLASH_PflashSetPrefetchSpeculation(&speculationStatus);
+
+ __enable_irq();
+ __ISB();
+}
+
status_t SMC_SetPowerModeRun(SMC_Type *base)
{
uint8_t reg;