freebsd-dev/sys/dev/qcom_qup/qcom_spi_reg.h
Adrian Chadd d27ba30884 qcom_qup: add initial v1/v2 QUP SPI driver
The Qualcomm Universal Peripherals Engine (QUP) is a unified SPI and I2C
peripheral that ships with a variety of Qualcomm SoCs.

It supports three transfer modes - single PIO, block PIO and DMA.

This driver only supports the single PIO mode, which is enough to
bootstrap the rest of the SPI NAND/NOR support and means I can do
things like read the Wifi calibration data from NOR.  It has some
hardware support code for the other transfer modes as well as
some support for split transfers (ie, transfers with no read or
write phase), but I haven't yet implemented those.

This driver is based on four sources - the linux driver, the u-boot
driver, some initial work done for APQ8064 by mmel@, and the APQ8064
Technical Reference Manual which is surprisingly free and open to
read.  The linux and u-boot drivers approach a variety of things
completely differently, from how PIO is done, the hardware support
for re-ordering bytes in a transfer word and how the CS lines
are used.

Tested:

* IPQ4018, SPI to NAND/NOR flash, PIO only
2021-12-27 15:27:29 -08:00

77 lines
2.7 KiB
C

/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2021 Adrian Chadd <adrian@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef __QCOM_SPI_REG_H__
#define __QCOM_SPI_REG_H__
#define SPI_CONFIG 0x0300
#define SPI_CONFIG_HS_MODE (1U << 10)
#define SPI_CONFIG_INPUT_FIRST (1U << 9)
#define SPI_CONFIG_LOOPBACK (1U << 8)
#define SPI_IO_CONTROL 0x0304
#define SPI_IO_C_FORCE_CS (1U << 11)
#define SPI_IO_C_CLK_IDLE_HIGH (1U << 10)
#define SPI_IO_C_MX_CS_MODE (1U << 8)
#define SPI_IO_C_CS_N_POLARITY_0 (1U << 4)
#define SPI_IO_C_CS_SELECT(x) (((x) & 3) << 2)
#define SPI_IO_C_CS_SELECT_MASK 0x000c
#define SPI_IO_C_TRISTATE_CS (1U << 1)
#define SPI_IO_C_NO_TRI_STATE (1U << 0)
#define SPI_ERROR_FLAGS 0x0308
#define SPI_ERROR_FLAGS_EN 0x030c
#define SPI_ERROR_CLK_OVER_RUN (1U << 1)
#define SPI_ERROR_CLK_UNDER_RUN (1U << 0)
/*
* Strictly this isn't true; some controllers have
* less CS lines exposed via GPIO/pinmux.
*/
#define SPI_NUM_CHIPSELECTS 4
/*
* The maximum single SPI transaction done in any mode.
* Ie, if you have a PIO/DMA transaction larger than
* this then it must be split up into SPI_MAX_XFER
* sub-transactions in the transfer loop.
*/
#define SPI_MAX_XFER (65536 - 64)
/*
* Any frequency at or above 26MHz is considered "high"
* and will have some different parameters configured.
*/
#define SPI_HS_MIN_RATE 26000000
#define SPI_MAX_RATE 50000000
#endif /* __QCOM_SPI_REG_H__ */