zephyr/drivers/spi/spi_xec_qmspi_full_duplex.h

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 */