mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
465 lines
16 KiB
Diff
465 lines
16 KiB
Diff
|
From 051f3793314e2fb3f1945f3e6fa6942a355ebb50 Mon Sep 17 00:00:00 2001
|
||
|
From: Ran Wang <ran.wang_1@nxp.com>
|
||
|
Date: Thu, 12 Apr 2018 14:35:40 +0800
|
||
|
Subject: [PATCH] drivers/soc/fsl: add EPU FSM configuration for deep sleep
|
||
|
|
||
|
In the last stage of deep sleep, software will trigger a Finite
|
||
|
State Machine (FSM) to control the hardware procedure, such a
|
||
|
board isolation, killing PLLs, removing power, and so on.
|
||
|
|
||
|
When the system is waked up by an interrupt, the FSM controls
|
||
|
the hardware to complete the early resume procedure.
|
||
|
|
||
|
This patch configure the EPU FSM preparing for deep sleep.
|
||
|
|
||
|
Signed-off-by: Hongbo Zhang <hongbo.zhang@freescale.com>
|
||
|
Signed-off-by: Chenhui Zhao <chenhui.zhao@freescale.com>
|
||
|
Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
|
||
|
---
|
||
|
drivers/soc/fsl/Kconfig | 7 ++
|
||
|
drivers/soc/fsl/Makefile | 1 +
|
||
|
drivers/soc/fsl/sleep_fsm.c | 279 ++++++++++++++++++++++++++++++++++++++++++++
|
||
|
drivers/soc/fsl/sleep_fsm.h | 130 +++++++++++++++++++++
|
||
|
4 files changed, 417 insertions(+)
|
||
|
create mode 100644 drivers/soc/fsl/sleep_fsm.c
|
||
|
create mode 100644 drivers/soc/fsl/sleep_fsm.h
|
||
|
|
||
|
--- a/drivers/soc/fsl/Kconfig
|
||
|
+++ b/drivers/soc/fsl/Kconfig
|
||
|
@@ -31,6 +31,13 @@ config FSL_MC_DPIO
|
||
|
objects individually, but groups them under a service layer
|
||
|
API.
|
||
|
|
||
|
+config FSL_SLEEP_FSM
|
||
|
+ bool
|
||
|
+ help
|
||
|
+ This driver configures a hardware FSM (Finite State Machine) for deep sleep.
|
||
|
+ The FSM is used to finish clean-ups at the last stage of system entering deep
|
||
|
+ sleep, and also wakes up system when a wake up event happens.
|
||
|
+
|
||
|
config DPAA2_CONSOLE
|
||
|
tristate "QorIQ DPAA2 console driver"
|
||
|
depends on OF && (ARCH_LAYERSCAPE || COMPILE_TEST)
|
||
|
--- a/drivers/soc/fsl/Makefile
|
||
|
+++ b/drivers/soc/fsl/Makefile
|
||
|
@@ -11,3 +11,4 @@ obj-$(CONFIG_FSL_GUTS) += guts.o
|
||
|
obj-$(CONFIG_FSL_MC_DPIO) += dpio/
|
||
|
obj-$(CONFIG_DPAA2_CONSOLE) += dpaa2-console.o
|
||
|
obj-$(CONFIG_FSL_RCPM) += rcpm.o
|
||
|
+obj-$(CONFIG_FSL_SLEEP_FSM) += sleep_fsm.o
|
||
|
--- /dev/null
|
||
|
+++ b/drivers/soc/fsl/sleep_fsm.c
|
||
|
@@ -0,0 +1,279 @@
|
||
|
+/*
|
||
|
+ * deep sleep FSM (finite-state machine) configuration
|
||
|
+ *
|
||
|
+ * Copyright 2018 NXP
|
||
|
+ *
|
||
|
+ * Author: Hongbo Zhang <hongbo.zhang@freescale.com>
|
||
|
+ * Chenhui Zhao <chenhui.zhao@freescale.com>
|
||
|
+ *
|
||
|
+ * Redistribution and use in source and binary forms, with or without
|
||
|
+ * modification, are permitted provided that the following conditions are met:
|
||
|
+ * * Redistributions of source code must retain the above copyright
|
||
|
+ * notice, this list of conditions and the following disclaimer.
|
||
|
+ * * Redistributions in binary form must reproduce the above copyright
|
||
|
+ * notice, this list of conditions and the following disclaimer in the
|
||
|
+ * documentation and/or other materials provided with the distribution.
|
||
|
+ * * Neither the name of the above-listed copyright holders nor the
|
||
|
+ * names of any contributors may be used to endorse or promote products
|
||
|
+ * derived from this software without specific prior written permission.
|
||
|
+ *
|
||
|
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||
|
+ * GNU General Public License ("GPL") as published by the Free Software
|
||
|
+ * Foundation, either version 2 of that License or (at your option) any
|
||
|
+ * later version.
|
||
|
+ *
|
||
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||
|
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
||
|
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
|
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
+ * POSSIBILITY OF SUCH DAMAGE.
|
||
|
+ */
|
||
|
+
|
||
|
+#include <linux/kernel.h>
|
||
|
+#include <linux/io.h>
|
||
|
+#include <linux/types.h>
|
||
|
+
|
||
|
+#include "sleep_fsm.h"
|
||
|
+/*
|
||
|
+ * These values are from chip's reference manual. For example,
|
||
|
+ * the values for T1040 can be found in "8.4.3.8 Programming
|
||
|
+ * supporting deep sleep mode" of Chapter 8 "Run Control and
|
||
|
+ * Power Management (RCPM)".
|
||
|
+ * The default value can be applied to T104x, LS1021.
|
||
|
+ */
|
||
|
+struct fsm_reg_vals epu_default_val[] = {
|
||
|
+ /* EPGCR (Event Processor Global Control Register) */
|
||
|
+ {EPGCR, 0},
|
||
|
+ /* EPECR (Event Processor Event Control Registers) */
|
||
|
+ {EPECR0 + EPECR_STRIDE * 0, 0},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 1, 0},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 2, 0xF0004004},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 3, 0x80000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 4, 0x20000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 5, 0x08000004},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 6, 0x80000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 7, 0x80000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 8, 0x60000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 9, 0x08000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 10, 0x42000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 11, 0x90000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 12, 0x80000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 13, 0x08000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 14, 0x02000084},
|
||
|
+ {EPECR0 + EPECR_STRIDE * 15, 0x00000004},
|
||
|
+ /*
|
||
|
+ * EPEVTCR (Event Processor EVT Pin Control Registers)
|
||
|
+ * SCU8 triger EVT2, and SCU11 triger EVT9
|
||
|
+ */
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 0, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 1, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 2, 0x80000001},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 3, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 4, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 5, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 6, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 7, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 8, 0},
|
||
|
+ {EPEVTCR0 + EPEVTCR_STRIDE * 9, 0xB0000001},
|
||
|
+ /* EPCMPR (Event Processor Counter Compare Registers) */
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 0, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 1, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 2, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 3, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 4, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 5, 0x00000020},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 6, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 7, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 8, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 9, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 10, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 11, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 12, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 13, 0},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 14, 0x000000FF},
|
||
|
+ {EPCMPR0 + EPCMPR_STRIDE * 15, 0x000000FF},
|
||
|
+ /* EPCCR (Event Processor Counter Control Registers) */
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 0, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 1, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 2, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 3, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 4, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 5, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 6, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 7, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 8, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 9, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 10, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 11, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 12, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 13, 0},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 14, 0x92840000},
|
||
|
+ {EPCCR0 + EPCCR_STRIDE * 15, 0x92840000},
|
||
|
+ /* EPSMCR (Event Processor SCU Mux Control Registers) */
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 0, 0},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 1, 0},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 2, 0x6C700000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 3, 0x2F000000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 4, 0x002F0000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 5, 0x00002E00},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 6, 0x7C000000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 7, 0x30000000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 8, 0x64300000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 9, 0x00003000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 10, 0x65000030},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 11, 0x31740000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 12, 0x7F000000},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 13, 0x00003100},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 14, 0x00000031},
|
||
|
+ {EPSMCR0 + EPSMCR_STRIDE * 15, 0x76000000},
|
||
|
+ /* EPACR (Event Processor Action Control Registers) */
|
||
|
+ {EPACR0 + EPACR_STRIDE * 0, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 1, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 2, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 3, 0x00000080},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 4, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 5, 0x00000040},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 6, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 7, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 8, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 9, 0x0000001C},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 10, 0x00000020},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 11, 0},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 12, 0x00000003},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 13, 0x06000000},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 14, 0x04000000},
|
||
|
+ {EPACR0 + EPACR_STRIDE * 15, 0x02000000},
|
||
|
+ /* EPIMCR (Event Processor Input Mux Control Registers) */
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 0, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 1, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 2, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 3, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 4, 0x44000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 5, 0x40000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 6, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 7, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 8, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 9, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 10, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 11, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 12, 0x44000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 13, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 14, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 15, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 16, 0x6A000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 17, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 18, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 19, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 20, 0x48000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 21, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 22, 0x6C000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 23, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 24, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 25, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 26, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 27, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 28, 0x76000000},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 29, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 30, 0},
|
||
|
+ {EPIMCR0 + EPIMCR_STRIDE * 31, 0x76000000},
|
||
|
+ /* EPXTRIGCR (Event Processor Crosstrigger Control Register) */
|
||
|
+ {EPXTRIGCR, 0x0000FFDF},
|
||
|
+ /* end */
|
||
|
+ {FSM_END_FLAG, 0},
|
||
|
+};
|
||
|
+
|
||
|
+struct fsm_reg_vals npc_default_val[] = {
|
||
|
+ /* NPC triggered Memory-Mapped Access Registers */
|
||
|
+ {NCR, 0x80000000},
|
||
|
+ {MCCR1, 0},
|
||
|
+ {MCSR1, 0},
|
||
|
+ {MMAR1LO, 0},
|
||
|
+ {MMAR1HI, 0},
|
||
|
+ {MMDR1, 0},
|
||
|
+ {MCSR2, 0},
|
||
|
+ {MMAR2LO, 0},
|
||
|
+ {MMAR2HI, 0},
|
||
|
+ {MMDR2, 0},
|
||
|
+ {MCSR3, 0x80000000},
|
||
|
+ {MMAR3LO, 0x000E2130},
|
||
|
+ {MMAR3HI, 0x00030000},
|
||
|
+ {MMDR3, 0x00020000},
|
||
|
+ /* end */
|
||
|
+ {FSM_END_FLAG, 0},
|
||
|
+};
|
||
|
+
|
||
|
+/**
|
||
|
+ * fsl_fsm_setup - Configure EPU's FSM registers
|
||
|
+ * @base: the base address of registers
|
||
|
+ * @val: Pointer to address-value pairs for FSM registers
|
||
|
+ */
|
||
|
+void fsl_fsm_setup(void __iomem *base, struct fsm_reg_vals *val)
|
||
|
+{
|
||
|
+ struct fsm_reg_vals *data = val;
|
||
|
+
|
||
|
+ WARN_ON(!base || !data);
|
||
|
+ while (data->offset != FSM_END_FLAG) {
|
||
|
+ iowrite32be(data->value, base + data->offset);
|
||
|
+ data++;
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+void fsl_epu_setup_default(void __iomem *epu_base)
|
||
|
+{
|
||
|
+ fsl_fsm_setup(epu_base, epu_default_val);
|
||
|
+}
|
||
|
+
|
||
|
+void fsl_npc_setup_default(void __iomem *npc_base)
|
||
|
+{
|
||
|
+ fsl_fsm_setup(npc_base, npc_default_val);
|
||
|
+}
|
||
|
+
|
||
|
+void fsl_epu_clean_default(void __iomem *epu_base)
|
||
|
+{
|
||
|
+ u32 offset;
|
||
|
+
|
||
|
+ /* follow the exact sequence to clear the registers */
|
||
|
+ /* Clear EPACRn */
|
||
|
+ for (offset = EPACR0; offset <= EPACR15; offset += EPACR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPEVTCRn */
|
||
|
+ for (offset = EPEVTCR0; offset <= EPEVTCR9; offset += EPEVTCR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPGCR */
|
||
|
+ iowrite32be(0, epu_base + EPGCR);
|
||
|
+
|
||
|
+ /* Clear EPSMCRn */
|
||
|
+ for (offset = EPSMCR0; offset <= EPSMCR15; offset += EPSMCR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPCCRn */
|
||
|
+ for (offset = EPCCR0; offset <= EPCCR31; offset += EPCCR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPCMPRn */
|
||
|
+ for (offset = EPCMPR0; offset <= EPCMPR31; offset += EPCMPR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPCTRn */
|
||
|
+ for (offset = EPCTR0; offset <= EPCTR31; offset += EPCTR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPIMCRn */
|
||
|
+ for (offset = EPIMCR0; offset <= EPIMCR31; offset += EPIMCR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+
|
||
|
+ /* Clear EPXTRIGCRn */
|
||
|
+ iowrite32be(0, epu_base + EPXTRIGCR);
|
||
|
+
|
||
|
+ /* Clear EPECRn */
|
||
|
+ for (offset = EPECR0; offset <= EPECR15; offset += EPECR_STRIDE)
|
||
|
+ iowrite32be(0, epu_base + offset);
|
||
|
+}
|
||
|
--- /dev/null
|
||
|
+++ b/drivers/soc/fsl/sleep_fsm.h
|
||
|
@@ -0,0 +1,130 @@
|
||
|
+/*
|
||
|
+ * deep sleep FSM (finite-state machine) configuration
|
||
|
+ *
|
||
|
+ * Copyright 2018 NXP
|
||
|
+ *
|
||
|
+ * Redistribution and use in source and binary forms, with or without
|
||
|
+ * modification, are permitted provided that the following conditions are met:
|
||
|
+ * * Redistributions of source code must retain the above copyright
|
||
|
+ * notice, this list of conditions and the following disclaimer.
|
||
|
+ * * Redistributions in binary form must reproduce the above copyright
|
||
|
+ * notice, this list of conditions and the following disclaimer in the
|
||
|
+ * documentation and/or other materials provided with the distribution.
|
||
|
+ * * Neither the name of the above-listed copyright holders nor the
|
||
|
+ * names of any contributors may be used to endorse or promote products
|
||
|
+ * derived from this software without specific prior written permission.
|
||
|
+ *
|
||
|
+ *
|
||
|
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||
|
+ * GNU General Public License ("GPL") as published by the Free Software
|
||
|
+ * Foundation, either version 2 of that License or (at your option) any
|
||
|
+ * later version.
|
||
|
+ *
|
||
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||
|
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
||
|
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
|
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
+ * POSSIBILITY OF SUCH DAMAGE.
|
||
|
+ */
|
||
|
+
|
||
|
+#ifndef _FSL_SLEEP_FSM_H
|
||
|
+#define _FSL_SLEEP_FSM_H
|
||
|
+
|
||
|
+#define FSL_STRIDE_4B 4
|
||
|
+#define FSL_STRIDE_8B 8
|
||
|
+
|
||
|
+/* End flag */
|
||
|
+#define FSM_END_FLAG 0xFFFFFFFFUL
|
||
|
+
|
||
|
+/* Block offsets */
|
||
|
+#define RCPM_BLOCK_OFFSET 0x00022000
|
||
|
+#define EPU_BLOCK_OFFSET 0x00000000
|
||
|
+#define NPC_BLOCK_OFFSET 0x00001000
|
||
|
+
|
||
|
+/* EPGCR (Event Processor Global Control Register) */
|
||
|
+#define EPGCR 0x000
|
||
|
+
|
||
|
+/* EPEVTCR0-9 (Event Processor EVT Pin Control Registers) */
|
||
|
+#define EPEVTCR0 0x050
|
||
|
+#define EPEVTCR9 0x074
|
||
|
+#define EPEVTCR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPXTRIGCR (Event Processor Crosstrigger Control Register) */
|
||
|
+#define EPXTRIGCR 0x090
|
||
|
+
|
||
|
+/* EPIMCR0-31 (Event Processor Input Mux Control Registers) */
|
||
|
+#define EPIMCR0 0x100
|
||
|
+#define EPIMCR31 0x17C
|
||
|
+#define EPIMCR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPSMCR0-15 (Event Processor SCU Mux Control Registers) */
|
||
|
+#define EPSMCR0 0x200
|
||
|
+#define EPSMCR15 0x278
|
||
|
+#define EPSMCR_STRIDE FSL_STRIDE_8B
|
||
|
+
|
||
|
+/* EPECR0-15 (Event Processor Event Control Registers) */
|
||
|
+#define EPECR0 0x300
|
||
|
+#define EPECR15 0x33C
|
||
|
+#define EPECR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPACR0-15 (Event Processor Action Control Registers) */
|
||
|
+#define EPACR0 0x400
|
||
|
+#define EPACR15 0x43C
|
||
|
+#define EPACR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPCCRi0-15 (Event Processor Counter Control Registers) */
|
||
|
+#define EPCCR0 0x800
|
||
|
+#define EPCCR15 0x83C
|
||
|
+#define EPCCR31 0x87C
|
||
|
+#define EPCCR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPCMPR0-15 (Event Processor Counter Compare Registers) */
|
||
|
+#define EPCMPR0 0x900
|
||
|
+#define EPCMPR15 0x93C
|
||
|
+#define EPCMPR31 0x97C
|
||
|
+#define EPCMPR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* EPCTR0-31 (Event Processor Counter Register) */
|
||
|
+#define EPCTR0 0xA00
|
||
|
+#define EPCTR31 0xA7C
|
||
|
+#define EPCTR_STRIDE FSL_STRIDE_4B
|
||
|
+
|
||
|
+/* NPC triggered Memory-Mapped Access Registers */
|
||
|
+#define NCR 0x000
|
||
|
+#define MCCR1 0x0CC
|
||
|
+#define MCSR1 0x0D0
|
||
|
+#define MMAR1LO 0x0D4
|
||
|
+#define MMAR1HI 0x0D8
|
||
|
+#define MMDR1 0x0DC
|
||
|
+#define MCSR2 0x0E0
|
||
|
+#define MMAR2LO 0x0E4
|
||
|
+#define MMAR2HI 0x0E8
|
||
|
+#define MMDR2 0x0EC
|
||
|
+#define MCSR3 0x0F0
|
||
|
+#define MMAR3LO 0x0F4
|
||
|
+#define MMAR3HI 0x0F8
|
||
|
+#define MMDR3 0x0FC
|
||
|
+
|
||
|
+/* RCPM Core State Action Control Register 0 */
|
||
|
+#define CSTTACR0 0xB00
|
||
|
+
|
||
|
+/* RCPM Core Group 1 Configuration Register 0 */
|
||
|
+#define CG1CR0 0x31C
|
||
|
+
|
||
|
+struct fsm_reg_vals {
|
||
|
+ u32 offset;
|
||
|
+ u32 value;
|
||
|
+};
|
||
|
+
|
||
|
+void fsl_fsm_setup(void __iomem *base, struct fsm_reg_vals *val);
|
||
|
+void fsl_epu_setup_default(void __iomem *epu_base);
|
||
|
+void fsl_npc_setup_default(void __iomem *npc_base);
|
||
|
+void fsl_epu_clean_default(void __iomem *epu_base);
|
||
|
+
|
||
|
+#endif /* _FSL_SLEEP_FSM_H */
|