1*e3ee7b7dSSheetal Tigadoli /* 2*e3ee7b7dSSheetal Tigadoli * Copyright (c) 2017 - 2020, Broadcom 3*e3ee7b7dSSheetal Tigadoli * 4*e3ee7b7dSSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 5*e3ee7b7dSSheetal Tigadoli */ 6*e3ee7b7dSSheetal Tigadoli 7*e3ee7b7dSSheetal Tigadoli #ifndef IPROC_QSPI_H 8*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_H 9*e3ee7b7dSSheetal Tigadoli 10*e3ee7b7dSSheetal Tigadoli #include <platform_def.h> 11*e3ee7b7dSSheetal Tigadoli 12*e3ee7b7dSSheetal Tigadoli /*SPI configuration enable*/ 13*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_CLK_SPEED 62500000 14*e3ee7b7dSSheetal Tigadoli #define SPI_CPHA (1 << 0) 15*e3ee7b7dSSheetal Tigadoli #define SPI_CPOL (1 << 1) 16*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_MODE0 0 17*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_MODE3 (SPI_CPOL|SPI_CPHA) 18*e3ee7b7dSSheetal Tigadoli 19*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_BUS 0 20*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_CS 0 21*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_BASE_REG QSPI_CTRL_BASE_ADDR 22*e3ee7b7dSSheetal Tigadoli #define IPROC_QSPI_CRU_CONTROL_REG QSPI_CLK_CTRL 23*e3ee7b7dSSheetal Tigadoli 24*e3ee7b7dSSheetal Tigadoli #define QSPI_AXI_CLK 200000000 25*e3ee7b7dSSheetal Tigadoli 26*e3ee7b7dSSheetal Tigadoli #define QSPI_RETRY_COUNT_US_MAX 200000 27*e3ee7b7dSSheetal Tigadoli 28*e3ee7b7dSSheetal Tigadoli /* Chip attributes */ 29*e3ee7b7dSSheetal Tigadoli #define QSPI_REG_BASE IPROC_QSPI_BASE_REG 30*e3ee7b7dSSheetal Tigadoli #define CRU_CONTROL_REG IPROC_QSPI_CRU_CONTROL_REG 31*e3ee7b7dSSheetal Tigadoli #define SPBR_DIV_MIN 8U 32*e3ee7b7dSSheetal Tigadoli #define SPBR_DIV_MAX 255U 33*e3ee7b7dSSheetal Tigadoli #define NUM_CDRAM_BYTES 16U 34*e3ee7b7dSSheetal Tigadoli 35*e3ee7b7dSSheetal Tigadoli /* Register fields */ 36*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_MSB_BITS_8 0x00000020 37*e3ee7b7dSSheetal Tigadoli 38*e3ee7b7dSSheetal Tigadoli /* Flash opcode and parameters */ 39*e3ee7b7dSSheetal Tigadoli #define CDRAM_PCS0 2 40*e3ee7b7dSSheetal Tigadoli #define CDRAM_CONT (1 << 7) 41*e3ee7b7dSSheetal Tigadoli #define CDRAM_BITS_EN (1 << 6) 42*e3ee7b7dSSheetal Tigadoli #define CDRAM_QUAD_MODE (1 << 8) 43*e3ee7b7dSSheetal Tigadoli #define CDRAM_RBIT_INPUT (1 << 10) 44*e3ee7b7dSSheetal Tigadoli 45*e3ee7b7dSSheetal Tigadoli /* MSPI registers */ 46*e3ee7b7dSSheetal Tigadoli #define QSPI_MSPI_MODE_REG_BASE (QSPI_REG_BASE + 0x200) 47*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_LSB_REG 0x000 48*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_MSB_REG 0x004 49*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR1_LSB_REG 0x008 50*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR1_MSB_REG 0x00c 51*e3ee7b7dSSheetal Tigadoli #define MSPI_NEWQP_REG 0x010 52*e3ee7b7dSSheetal Tigadoli #define MSPI_ENDQP_REG 0x014 53*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR2_REG 0x018 54*e3ee7b7dSSheetal Tigadoli #define MSPI_STATUS_REG 0x020 55*e3ee7b7dSSheetal Tigadoli #define MSPI_CPTQP_REG 0x024 56*e3ee7b7dSSheetal Tigadoli #define MSPI_TXRAM_REG 0x040 57*e3ee7b7dSSheetal Tigadoli #define MSPI_RXRAM_REG 0x0c0 58*e3ee7b7dSSheetal Tigadoli #define MSPI_CDRAM_REG 0x140 59*e3ee7b7dSSheetal Tigadoli #define MSPI_WRITE_LOCK_REG 0x180 60*e3ee7b7dSSheetal Tigadoli #define MSPI_DISABLE_FLUSH_GEN_REG 0x184 61*e3ee7b7dSSheetal Tigadoli 62*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_MSB_REG_MSTR_SHIFT 7 63*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_MSB_REG_16_BITS_PER_WD_SHIFT (0 << 2) 64*e3ee7b7dSSheetal Tigadoli #define MSPI_SPCR0_MSB_REG_MODE_MASK 0x3 65*e3ee7b7dSSheetal Tigadoli 66*e3ee7b7dSSheetal Tigadoli /* BSPI registers */ 67*e3ee7b7dSSheetal Tigadoli #define QSPI_BSPI_MODE_REG_BASE QSPI_REG_BASE 68*e3ee7b7dSSheetal Tigadoli #define BSPI_MAST_N_BOOT_CTRL_REG 0x008 69*e3ee7b7dSSheetal Tigadoli #define BSPI_BUSY_STATUS_REG 0x00c 70*e3ee7b7dSSheetal Tigadoli 71*e3ee7b7dSSheetal Tigadoli #define MSPI_CMD_COMPLETE_MASK 1 72*e3ee7b7dSSheetal Tigadoli #define BSPI_BUSY_MASK 1 73*e3ee7b7dSSheetal Tigadoli #define MSPI_CTRL_MASK 1 74*e3ee7b7dSSheetal Tigadoli 75*e3ee7b7dSSheetal Tigadoli #define MSPI_SPE (1 << 6) 76*e3ee7b7dSSheetal Tigadoli #define MSPI_CONT_AFTER_CMD (1 << 7) 77*e3ee7b7dSSheetal Tigadoli 78*e3ee7b7dSSheetal Tigadoli /* State */ 79*e3ee7b7dSSheetal Tigadoli enum bcm_qspi_state { 80*e3ee7b7dSSheetal Tigadoli QSPI_STATE_DISABLED, 81*e3ee7b7dSSheetal Tigadoli QSPI_STATE_MSPI, 82*e3ee7b7dSSheetal Tigadoli QSPI_STATE_BSPI 83*e3ee7b7dSSheetal Tigadoli }; 84*e3ee7b7dSSheetal Tigadoli 85*e3ee7b7dSSheetal Tigadoli /* QSPI private data */ 86*e3ee7b7dSSheetal Tigadoli struct bcmspi_priv { 87*e3ee7b7dSSheetal Tigadoli /* Specified SPI parameters */ 88*e3ee7b7dSSheetal Tigadoli uint32_t max_hz; 89*e3ee7b7dSSheetal Tigadoli uint32_t spi_mode; 90*e3ee7b7dSSheetal Tigadoli 91*e3ee7b7dSSheetal Tigadoli /* State */ 92*e3ee7b7dSSheetal Tigadoli enum bcm_qspi_state state; 93*e3ee7b7dSSheetal Tigadoli int mspi_16bit; 94*e3ee7b7dSSheetal Tigadoli 95*e3ee7b7dSSheetal Tigadoli /* Registers */ 96*e3ee7b7dSSheetal Tigadoli uintptr_t mspi_hw; 97*e3ee7b7dSSheetal Tigadoli uintptr_t bspi_hw; 98*e3ee7b7dSSheetal Tigadoli }; 99*e3ee7b7dSSheetal Tigadoli 100*e3ee7b7dSSheetal Tigadoli int iproc_qspi_setup(uint32_t bus, uint32_t cs, 101*e3ee7b7dSSheetal Tigadoli uint32_t max_hz, uint32_t mode); 102*e3ee7b7dSSheetal Tigadoli int iproc_qspi_claim_bus(void); 103*e3ee7b7dSSheetal Tigadoli void iproc_qspi_release_bus(void); 104*e3ee7b7dSSheetal Tigadoli int iproc_qspi_xfer(uint32_t bitlen, const void *dout, 105*e3ee7b7dSSheetal Tigadoli void *din, unsigned long flags); 106*e3ee7b7dSSheetal Tigadoli 107*e3ee7b7dSSheetal Tigadoli #endif /* _IPROC_QSPI_H_ */ 108