ae9de20222
Add MEC172x full duplex qmspi driver version to support full duplex transfers as expected by the Zephyr spi driver model. On every spi clock we transmit one bit and receive one bit. This driver will work with Zephyr SPI NOR driver. Signed-off-by: Jay Vasanth <jay.vasanth@microchip.com>
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 */
|