183 lines
6.6 KiB
C
183 lines
6.6 KiB
C
/*
|
|
* 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 */
|