| /* |
| * Copyright (c) 2024 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /* |
| * This header is part of mspi_dw.c extracted only for clarity. |
| * It is not supposed to be included by any file other than mspi_dw.c. |
| */ |
| |
| /* CTRLR0 - Control Register 0 */ |
| #define CTRLR0_SPI_FRF_MASK GENMASK(23, 22) |
| #define CTRLR0_SPI_FRF_STANDARD 0UL |
| #define CTRLR0_SPI_FRF_DUAL 1UL |
| #define CTRLR0_SPI_FRF_QUAD 2UL |
| #define CTRLR0_SPI_FRF_OCTAL 3UL |
| #define CTRLR0_TMOD_MASK GENMASK(11, 10) |
| #define CTRLR0_TMOD_TX_RX 0UL |
| #define CTRLR0_TMOD_TX 1UL |
| #define CTRLR0_TMOD_RX 2UL |
| #define CTRLR0_TMOD_EEPROM 3UL |
| #define CTRLR0_SCPOL_BIT BIT(9) |
| #define CTRLR0_SCPH_BIT BIT(8) |
| #define CTRLR0_FRF_MASK GENMASK(7, 6) |
| #define CTRLR0_FRF_SPI 0UL |
| #define CTRLR0_FRF_SSP 1UL |
| #define CTRLR0_FRF_MICROWIRE 2UL |
| #define CTRLR0_DFS_MASK GENMASK(4, 0) |
| |
| /* CTRLR1- Control Register 1 */ |
| #define CTRLR1_NDF_MASK GENMASK(15, 0) |
| |
| /* SSIENR - SSI Enable Register */ |
| #define SSIENR_SSIC_EN_BIT BIT(0) |
| |
| /* TXFTLR - Transmit FIFO Threshold Level */ |
| #define TXFTLR_TXFTHR_MASK GENMASK(23, 16) |
| #define TXFTLR_TFT_MASK GENMASK(7, 0) |
| |
| /* RXFTLR - Receive FIFO Threshold Level */ |
| #define RXFTLR_RFT_MASK GENMASK(7, 0) |
| |
| /* TXFLR - Transmit FIFO Level Register */ |
| #define TXFLR_TXTFL_MASK GENMASK(7, 0) |
| |
| /* RXFLR - Receive FIFO Level Register */ |
| #define RXFLR_RXTFL_MASK GENMASK(7, 0) |
| |
| /* SR - Status Register */ |
| #define SR_BUSY_BIT BIT(0) |
| |
| /* IMR - Interrupt Mask Register */ |
| #define IMR_TXEIM_BIT BIT(0) |
| #define IMR_TXOIM_BIT BIT(1) |
| #define IMR_RXUIM_BIT BIT(2) |
| #define IMR_RXOIM_BIT BIT(3) |
| #define IMR_RXFIM_BIT BIT(4) |
| #define IMR_MSTIM_BIT BIT(5) |
| |
| /* ISR - Interrupt Status Register */ |
| #define ISR_TXEIS_BIT BIT(0) |
| #define ISR_TXOIS_BIT BIT(1) |
| #define ISR_RXUIS_BIT BIT(2) |
| #define ISR_RXOIS_BIT BIT(3) |
| #define ISR_RXFIS_BIT BIT(4) |
| #define ISR_MSTIS_BIT BIT(5) |
| |
| /* SPI_CTRLR0 - SPI Control Register */ |
| #define SPI_CTRLR0_CLK_STRETCH_EN_BIT BIT(30) |
| #define SPI_CTRLR0_XIP_PREFETCH_EN_BIT BIT(29) |
| #define SPI_CTRLR0_XIP_MBL_BIT BIT(26) |
| #define SPI_CTRLR0_SPI_RXDS_SIG_EN_BIT BIT(25) |
| #define SPI_CTRLR0_SPI_DM_EN_BIT BIT(24) |
| #define SPI_CTRLR0_RXDS_VL_EN_BIT BIT(23) |
| #define SPI_CTRLR0_SSIC_XIP_CONT_XFER_EN_BIT BIT(21) |
| #define SPI_CTRLR0_XIP_INST_EN_BIT BIT(20) |
| #define SPI_CTRLR0_XIP_DFS_HC_BIT BIT(19) |
| #define SPI_CTRLR0_SPI_RXDS_EN_BIT BIT(18) |
| #define SPI_CTRLR0_INST_DDR_EN_BIT BIT(17) |
| #define SPI_CTRLR0_SPI_DDR_EN_BIT BIT(16) |
| #define SPI_CTRLR0_WAIT_CYCLES_MASK GENMASK(15, 11) |
| #define SPI_CTRLR0_WAIT_CYCLES_MAX BIT_MASK(5) |
| #define SPI_CTRLR0_INST_L_MASK GENMASK(9, 8) |
| #define SPI_CTRLR0_INST_L0 0UL |
| #define SPI_CTRLR0_INST_L4 1UL |
| #define SPI_CTRLR0_INST_L8 2UL |
| #define SPI_CTRLR0_INST_L16 3UL |
| #define SPI_CTRLR0_XIP_MD_BIT_EN_BIT BIT(7) |
| #define SPI_CTRLR0_ADDR_L_MASK GENMASK(5, 2) |
| #define SPI_CTRLR0_TRANS_TYPE_MASK GENMASK(1, 0) |
| #define SPI_CTRLR0_TRANS_TYPE_TT0 0UL |
| #define SPI_CTRLR0_TRANS_TYPE_TT1 1UL |
| #define SPI_CTRLR0_TRANS_TYPE_TT2 2UL |
| #define SPI_CTRLR0_TRANS_TYPE_TT3 3UL |
| |
| /* XIP_CTRL - XIP Control Register */ |
| #define XIP_CTRL_XIP_PREFETCH_EN_BIT BIT(28) |
| #define XIP_CTRL_XIP_MBL_MASK GENMASK(27, 26) |
| #define XIP_CTRL_XIP_MBL_2 0UL |
| #define XIP_CTRL_XIP_MBL_4 1UL |
| #define XIP_CTRL_XIP_MBL_8 2UL |
| #define XIP_CTRL_XIP_MBL_16 3UL |
| #define XIP_CTRL_RXDS_SIG_EN_BIT BIT(25) |
| #define XIP_CTRL_XIP_HYBERBUS_EN_BIT BIT(24) |
| #define XIP_CTRL_CONT_XFER_EN_BIT BIT(23) |
| #define XIP_CTRL_INST_EN_BIT BIT(22) |
| #define XIP_CTRL_RXDS_EN_BIT BIT(21) |
| #define XIP_CTRL_INST_DDR_EN_BIT BIT(20) |
| #define XIP_CTRL_DDR_EN_BIT BIT(19) |
| #define XIP_CTRL_DFS_HC_BIT BIT(18) |
| #define XIP_CTRL_WAIT_CYCLES_MASK GENMASK(17, 13) |
| #define XIP_CTRL_WAIT_CYCLES_MAX BIT_MASK(5) |
| #define XIP_CTRL_MD_BITS_EN_BIT BIT(12) |
| #define XIP_CTRL_INST_L_MASK GENMASK(10, 9) |
| #define XIP_CTRL_INST_L0 0UL |
| #define XIP_CTRL_INST_L4 1UL |
| #define XIP_CTRL_INST_L8 2UL |
| #define XIP_CTRL_INST_L16 3UL |
| #define XIP_CTRL_ADDR_L_MASK GENMASK(7, 4) |
| #define XIP_CTRL_TRANS_TYPE_MASK GENMASK(3, 2) |
| #define XIP_CTRL_TRANS_TYPE_TT0 0UL |
| #define XIP_CTRL_TRANS_TYPE_TT1 1UL |
| #define XIP_CTRL_TRANS_TYPE_TT2 2UL |
| #define XIP_CTRL_FRF_MASK GENMASK(1, 0) |
| #define XIP_CTRL_FRF_DUAL 1UL |
| #define XIP_CTRL_FRF_QUAD 2UL |
| #define XIP_CTRL_FRF_OCTAL 3UL |
| |
| /* XIP_CTRL - XIP Control Register */ |
| #define XIP_CTRL_XIP_PREFETCH_EN_BIT BIT(28) |
| #define XIP_CTRL_XIP_MBL_MASK GENMASK(27, 26) |
| #define XIP_CTRL_XIP_MBL_2 0UL |
| #define XIP_CTRL_XIP_MBL_4 1UL |
| #define XIP_CTRL_XIP_MBL_8 2UL |
| #define XIP_CTRL_XIP_MBL_16 3UL |
| #define XIP_CTRL_XIP_HYBERBUS_EN_BIT BIT(24) |
| #define XIP_CTRL_CONT_XFER_EN_BIT BIT(23) |
| #define XIP_CTRL_INST_EN_BIT BIT(22) |
| #define XIP_CTRL_RXDS_EN_BIT BIT(21) |
| #define XIP_CTRL_INST_DDR_EN_BIT BIT(20) |
| #define XIP_CTRL_DDR_EN_BIT BIT(19) |
| #define XIP_CTRL_DFS_HC_BIT BIT(18) |
| |
| /* XIP_WRITE_CTRL - XIP Write Control Register */ |
| #define XIP_WRITE_CTRL_WAIT_CYCLES_MASK GENMASK(20, 16) |
| #define XIP_WRITE_CTRL_WAIT_CYCLES_MAX BIT_MASK(5) |
| #define XIP_WRITE_CTRL_RXDS_SIG_EN_BIT BIT(13) |
| #define XIP_WRITE_CTRL_HYBERBUS_EN_BIT BIT(12) |
| #define XIP_WRITE_CTRL_INST_DDR_EN_BIT BIT(11) |
| #define XIP_WRITE_CTRL_SPI_DDR_EN_BIT BIT(10) |
| #define XIP_WRITE_CTRL_INST_L_MASK GENMASK(9, 8) |
| #define XIP_WRITE_CTRL_INST_L0 0UL |
| #define XIP_WRITE_CTRL_INST_L4 1UL |
| #define XIP_WRITE_CTRL_INST_L8 2UL |
| #define XIP_WRITE_CTRL_INST_L16 3UL |
| #define XIP_WRITE_CTRL_ADDR_L_MASK GENMASK(7, 4) |
| #define XIP_WRITE_CTRL_TRANS_TYPE_MASK GENMASK(3, 2) |
| #define XIP_WRITE_CTRL_TRANS_TYPE_TT0 0UL |
| #define XIP_WRITE_CTRL_TRANS_TYPE_TT1 1UL |
| #define XIP_WRITE_CTRL_TRANS_TYPE_TT2 2UL |
| #define XIP_WRITE_CTRL_FRF_MASK GENMASK(1, 0) |
| #define XIP_WRITE_CTRL_FRF_DUAL 1UL |
| #define XIP_WRITE_CTRL_FRF_QUAD 2UL |
| #define XIP_WRITE_CTRL_FRF_OCTAL 3UL |
| |
| /* Register access helpers. */ |
| #define USES_AUX_REG(inst) + DT_INST_PROP(inst, aux_reg_enable) |
| #define AUX_REG_INSTANCES (0 DT_INST_FOREACH_STATUS_OKAY(USES_AUX_REG)) |
| #define BASE_ADDR(dev) (mm_reg_t)DEVICE_MMIO_GET(dev) |
| |
| #if AUX_REG_INSTANCES != 0 |
| static uint32_t aux_reg_read(const struct device *dev, uint32_t off) |
| { |
| return sys_in32(BASE_ADDR(dev) + off/4); |
| } |
| static void aux_reg_write(uint32_t data, const struct device *dev, uint32_t off) |
| { |
| sys_out32(data, BASE_ADDR(dev) + off/4); |
| } |
| #endif |
| |
| #if AUX_REG_INSTANCES != DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) |
| static uint32_t reg_read(const struct device *dev, uint32_t off) |
| { |
| return sys_read32(BASE_ADDR(dev) + off); |
| } |
| static void reg_write(uint32_t data, const struct device *dev, uint32_t off) |
| { |
| sys_write32(data, BASE_ADDR(dev) + off); |
| } |
| #endif |
| |
| #if AUX_REG_INSTANCES == 0 |
| /* If no instance uses aux-reg access. */ |
| #define DECLARE_REG_ACCESS() |
| #define DEFINE_REG_ACCESS(inst) |
| #define DEFINE_MM_REG_RD(reg, off) \ |
| static inline uint32_t read_##reg(const struct device *dev) \ |
| { return reg_read(dev, off); } |
| #define DEFINE_MM_REG_WR(reg, off) \ |
| static inline void write_##reg(const struct device *dev, uint32_t data) \ |
| { reg_write(data, dev, off); } |
| |
| #elif AUX_REG_INSTANCES == DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) |
| /* If all instances use aux-reg access. */ |
| #define DECLARE_REG_ACCESS() |
| #define DEFINE_REG_ACCESS(inst) |
| #define DEFINE_MM_REG_RD(reg, off) \ |
| static inline uint32_t read_##reg(const struct device *dev) \ |
| { return aux_reg_read(dev, off); } |
| #define DEFINE_MM_REG_WR(reg, off) \ |
| static inline void write_##reg(const struct device *dev, uint32_t data) \ |
| { aux_reg_write(data, dev, off); } |
| |
| #else |
| /* If register access varies by instance. */ |
| #define DECLARE_REG_ACCESS() \ |
| uint32_t (*read)(const struct device *dev, uint32_t off); \ |
| void (*write)(uint32_t data, const struct device *dev, uint32_t off) |
| #define DEFINE_REG_ACCESS(inst) \ |
| COND_CODE_1(DT_INST_PROP(inst, aux_reg_enable), \ |
| (.read = aux_reg_read, \ |
| .write = aux_reg_write,), \ |
| (.read = reg_read, \ |
| .write = reg_write,)) |
| #define DEFINE_MM_REG_RD(reg, off) \ |
| static inline uint32_t read_##reg(const struct device *dev) \ |
| { \ |
| const struct mspi_dw_config *dev_config = dev->config; \ |
| return dev_config->read(dev, off); \ |
| } |
| #define DEFINE_MM_REG_WR(reg, off) \ |
| static inline void write_##reg(const struct device *dev, uint32_t data) \ |
| { \ |
| const struct mspi_dw_config *dev_config = dev->config; \ |
| dev_config->write(data, dev, off); \ |
| } |
| #endif |