/* * Copyright (c) 2022 Microchip Technology Inc. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef _SPI_XEC_QMSPI_V2_H #define _SPI_XEC_QMSPI_V2_H #define MEC152X_QSPI_SRC_CLOCK_HZ 48000000u #define MEC172X_QSPI_SRC_CLOCK_HZ 48000000u #define MEC172X_QSPI_TURBO_SRC_CLOCK_HZ 96000000u #define XEC_QSPI_TX_FIFO_SIZE 8 #define XEC_QSPI_RX_FIFO_SIZE 8 #define XEC_QSPI_DESCR_MAX 16 /* mode register */ #define XEC_QSPI_M_ACTV_POS 0 #define XEC_QSPI_M_SRST_POS 1 #define XEC_QSPI_M_RX_LDMA_EN_POS 3 #define XEC_QSPI_M_TX_LDMA_EN_POS 4 #define XEC_QSPI_M_CPOL_POS 8 #define XEC_QSPI_M_CPHA_MOSI_POS 9 #define XEC_QSPI_M_CPHA_MISO_POS 10 #define XEC_QSPI_M_CP_MSK (0x7u << XEC_QSPI_M_CPOL_POS) #define XEC_QSPI_M_CS_SEL_POS 12 #define XEC_QSPI_M_CS_SEL_MSK (0x3u << XEC_QSPI_M_CS_SEL_POS) #define XEC_QSPI_M_CS0_SEL 0 #define XEC_QSPI_M_CS1_SEL (1u << XEC_QSPI_M_CS_SEL_POS) #define XEC_QSPI_M_CLK_DIV_POS 16 #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_M_CLK_DIV_MASK 0xffff0000u #else #define XEC_QSPI_M_CLK_DIV_MASK 0xff000000u #endif /* control register */ #define XEC_QSPI_C_IFC_POS 0 #define XEC_QSPI_C_IFC_MSK 0x3u #define XEC_QSPI_C_IFC_1X 0 #define XEC_QSPI_C_IFC_2X 0x1u #define XEC_QSPI_C_IFC_4X 0x2u #define XEC_QSPI_C_TX_EN_POS 2 #define XEC_QSPI_C_TX_EN_MSK (0x3u << XEC_QSPI_C_TX_EN_POS) #define XEC_QSPI_C_TX_EN_DATA (0x1u << XEC_QSPI_C_TX_EN_POS) #define XEC_QSPI_C_TX_EN_ZEROS (0x2u << XEC_QSPI_C_TX_EN_POS) #define XEC_QSPI_C_TX_EN_ONES (0x3u << XEC_QSPI_C_TX_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_POS 4 #define XEC_QSPI_C_TX_DMA_EN_MSK (0x3u << XEC_QSPI_C_TX_DMA_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_1B (0x1u << XEC_QSPI_C_TX_DMA_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_2B (0x2u << XEC_QSPI_C_TX_DMA_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_4B (0x3u << XEC_QSPI_C_TX_DMA_EN_POS) #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_C_TX_DMA_EN_LDCH0 (0x1u << XEC_QSPI_C_TX_DMA_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_LDCH1 (0x2u << XEC_QSPI_C_TX_DMA_EN_POS) #define XEC_QSPI_C_TX_DMA_EN_LDCH2 (0x3u << XEC_QSPI_C_TX_DMA_EN_POS) #endif #define XEC_QSPI_C_RX_EN_POS 6 #define XEC_QSPI_C_RX_DMA_EN_POS 7 #define XEC_QSPI_C_RX_DMA_EN_MSK (0x3u << XEC_QSPI_C_RX_DMA_EN_POS) #define XEC_QSPI_C_RX_DMA_EN_1B (0x1u << XEC_QSPI_C_RX_DMA_EN_POS) #define XEC_QSPI_C_RX_DMA_EN_2B (0x2u << XEC_QSPI_C_RX_DMA_EN_POS) #define XEC_QSPI_C_RX_DMA_EN_4B (0x3u << XEC_QSPI_C_RX_DMA_EN_POS) #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_C_RX_DMA_EN_LDCH0 (0x1u << XEC_QSPI_C_RX_DMA_EN_POS) #define XEC_QSPI_C_RX_DMA_EN_LDCH1 (0x2u << XEC_QSPI_C_RX_DMA_EN_POS) #define XEC_QSPI_C_RX_DMA_EN_LDCH2 (0x3u << XEC_QSPI_C_RX_DMA_EN_POS) #endif #define XEC_QSPI_C_CLOSE_POS 9 #define XEC_QSPI_C_Q_XFR_UNITS_POS 10 #define XEC_QSPI_C_Q_XFR_UNITS_MSK (0x3u << XEC_QSPI_C_Q_XFR_UNITS_POS) #define XEC_QSPI_C_Q_XFR_UNITS_BITS 0 #define XEC_QSPI_C_Q_XFR_UNITS_1B (0x1u << XEC_QSPI_C_Q_XFR_UNITS_POS) #define XEC_QSPI_C_Q_XFR_UNITS_4B (0x2u << XEC_QSPI_C_Q_XFR_UNITS_POS) #define XEC_QSPI_C_Q_XFR_UNITS_16B (0x3u << XEC_QSPI_C_Q_XFR_UNITS_POS) #define XEC_QSPI_C_FN_DESCR_POS 12 #define XEC_QSPI_C_FN_DESCR_MSK (0xfu << XEC_QSPI_C_FN_DESCR_POS) #define XEC_QSPI_C_FN_DESCR(n) \ (((uint32_t)(n) & 0xfu) << XEC_QSPI_C_FN_DESCR_POS) /* control register enable descriptor mode */ #define XEC_QSPI_C_DESCR_MODE_EN_POS 16 /* descriptor specifies last descriptor to be processed */ #define XEC_QSPI_D_DESCR_LAST_POS 16 #define XEC_QSPI_C_Q_NUNITS_POS 17 #define XEC_QSPI_C_Q_NUNITS_MAX 0x7fffu #define XEC_QSPI_C_Q_NUNITS_MSK (0x7fffu << XEC_QSPI_C_Q_NUNITS_POS) #define XEC_QSPI_C_NUNITS(n) \ (((uint32_t)(n) & 0x7fffu) << XEC_QSPI_C_Q_NUNITS_POS) /* execute register (WO). Set one bit at a time! */ #define XEC_QSPI_EXE_START_POS 0 #define XEC_QSPI_EXE_STOP_POS 1 #define XEC_QSPI_EXE_CLR_FIFOS_POS 2 /* status register */ #define XEC_QSPI_STS_MSK 0x0f01ff7fu #define XEC_QSPI_STS_MSK_RW1C 0x0000cc1fu #define XEC_QSPI_STS_XFR_DONE_POS 0 #define XEC_QSPI_STS_DMA_DONE_POS 1 #define XEC_QSPI_STS_TXB_ERR_POS 2 #define XEC_QSPI_STS_RXB_ERR_POS 3 #define XEC_QSPI_STS_PROG_ERR_POS 4 #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_STS_LDMA_RX_ERR_POS 5 #define XEC_QSPI_STS_LDMA_TX_ERR_POS 6 #endif #define XEC_QSPI_STS_TXB_FULL_POS 8 #define XEC_QSPI_STS_TXB_EMPTY_POS 9 #define XEC_QSPI_STS_TXB_REQ_POS 10 #define XEC_QSPI_STS_TXB_STALL_POS 11 #define XEC_QSPI_STS_RXB_FULL_POS 12 #define XEC_QSPI_STS_RXB_EMPTY_POS 13 #define XEC_QSPI_STS_RXB_REQ_POS 14 #define XEC_QSPI_STS_RXB_STALL_POS 15 #define XEC_QSPI_STS_XFR_ACTIVE_POS 16 #define XEC_QSPI_STS_CURR_DESCR_POS 24 #define XEC_QSPI_STS_CURR_DESCR_MSK (0xfu << XEC_QSPI_STS_CURR_DESCR_POS) #define XEC_QSPI_STS_ALL_ERR (BIT(XEC_QSPI_STS_TXB_ERR_POS) | \ BIT(XEC_QSPI_STS_RXB_ERR_POS) | \ BIT(XEC_QSPI_STS_PROG_ERR_POS)) /* buffer count status (RO) */ #define XEC_QSPI_BCNT_STS_TX_POS 0 #define XEC_QSPI_BCNT_STS_TX_MSK 0xffffu #define XEC_QSPI_BCNT_STS_RX_POS 16 #define XEC_QSPI_BCNT_STS_RX_MSK (0xffffu << XEC_QSPI_BCNT_STS_RX_POS) /* interrupt enable */ #define XEC_QSPI_IEN_XFR_DONE_POS 0 #define XEC_QSPI_IEN_DMA_DONE_POS 1 #define XEC_QSPI_IEN_TXB_ERR_POS 2 #define XEC_QSPI_IEN_RXB_ERR_POS 3 #define XEC_QSPI_IEN_PROG_ERR_POS 4 #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_IEN_LDMA_RX_ERR_POS 5 #define XEC_QSPI_IEN_LDMA_TX_ERR_POS 6 #endif #define XEC_QSPI_IEN_TXB_FULL_POS 8 #define XEC_QSPI_IEN_TXB_EMPTY_POS 9 #define XEC_QSPI_IEN_TXB_REQ_POS 10 #define XEC_QSPI_IEN_RXB_FULL_POS 12 #define XEC_QSPI_IEN_RXB_EMPTY_POS 13 #define XEC_QSPI_IEN_RXB_REQ_POS 14 /* chip select timing */ #define XEC_QSPI_CSTM_DLY_CS_TO_START_POS 0 #define XEC_QSPI_CSTM_DLY_CS_TO_START_MSK 0xfu #define XEC_QSPI_CSTM_DLY_CLK_OFF_TO_CS_OFF_POS 8 #define XEC_QSPI_CSTM_DLY_CLK_OFF_TO_CS_OFF_MSK 0xf00u #define XEC_QSPI_CSTM_DLY_LAST_DATA_HOLD_POS 16 #define XEC_QSPI_CSTM_DLY_LAST_DATA_HOLD_MSK 0xf0000u #define XEC_QSPI_CSTM_DLY_CS_OFF_TO_CS_ON_POS 24 #define XEC_QSPI_CSTM_DLY_CS_OFF_TO_CS_ON_MSK 0xff000000u #ifdef CONFIG_SOC_SERIES_MEC172X #define XEC_QSPI_MALT1_EN_POS 0 #define XEC_QSPI_MALT1_CLK_DIV_POS 16 #define XEC_QSPI_MALT1_CLK_DIV_MSK 0xffff0000u #define XEC_QSPI_LDCH_CTRL_EN_POS 0 #define XEC_QSPI_LDCH_CTRL_RESTART_EN_POS 1 #define XEC_QSPI_LDCH_CTRL_RESTART_ADDR_EN_POS 2 #define XEC_QSPI_LDCH_CTRL_OVRLEN_POS 3 #define XEC_QSPI_LDCH_CTRL_ACCSZ_POS 4 #define XEC_QSPI_LDCH_CTRL_ACCSZ_MSK 0x30u #define XEC_QSPI_LDCH_CTRL_ACCSZ_1B 0u #define XEC_QSPI_LDCH_CTRL_ACCSZ_2B 1u #define XEC_QSPI_LDCH_CTRL_ACCSZ_4B 2u #define XEC_QSPI_LDCH_CTRL_INCR_ADDR_POS 6 struct qspi_ldma_chan { volatile uint32_t ldctrl; volatile uint32_t mstart; volatile uint32_t nbytes; uint32_t rsvd[1]; }; #endif /* CONFIG_SOC_SERIES_MEC172X */ #endif /* _SPI_XEC_QMSPI_V2_H */