/* SPDX-License-Identifier: BSD-3-Clause */
/*
 * Copyright (C) 2023 OpenSynergy GmbH
 * Copyright (C) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
 */
#ifndef _LINUX_VIRTIO_VIRTIO_SPI_H
#define _LINUX_VIRTIO_VIRTIO_SPI_H

#include "standard-headers/linux/types.h"
#include "standard-headers/linux/virtio_config.h"
#include "standard-headers/linux/virtio_ids.h"
#include "standard-headers/linux/virtio_types.h"

/* Sample data on trailing clock edge */
#define VIRTIO_SPI_CPHA			_BITUL(0)
/* Clock is high when IDLE */
#define VIRTIO_SPI_CPOL			_BITUL(1)
/* Chip Select is active high */
#define VIRTIO_SPI_CS_HIGH			_BITUL(2)
/* Transmit LSB first */
#define VIRTIO_SPI_MODE_LSB_FIRST		_BITUL(3)
/* Loopback mode */
#define VIRTIO_SPI_MODE_LOOP			_BITUL(4)

/**
 * struct virtio_spi_config - All config fields are read-only for the
 * Virtio SPI driver
 * @cs_max_number: maximum number of chipselect the host SPI controller
 *   supports.
 * @cs_change_supported: indicates if the host SPI controller supports to toggle
 *   chipselect after each transfer in one message:
 *   0: unsupported, chipselect will be kept in active state throughout the
 *      message transaction;
 *   1: supported.
 *   Note: Message here contains a sequence of SPI transfers.
 * @tx_nbits_supported: indicates the supported number of bit for writing:
 *   bit 0: DUAL (2-bit transfer), 1 for supported
 *   bit 1: QUAD (4-bit transfer), 1 for supported
 *   bit 2: OCTAL (8-bit transfer), 1 for supported
 *   other bits are reserved as 0, 1-bit transfer is always supported.
 * @rx_nbits_supported: indicates the supported number of bit for reading:
 *   bit 0: DUAL (2-bit transfer), 1 for supported
 *   bit 1: QUAD (4-bit transfer), 1 for supported
 *   bit 2: OCTAL (8-bit transfer), 1 for supported
 *   other bits are reserved as 0, 1-bit transfer is always supported.
 * @bits_per_word_mask: mask indicating which values of bits_per_word are
 *   supported. If not set, no limitation for bits_per_word.
 * @mode_func_supported: indicates the following features are supported or not:
 *   bit 0-1: CPHA feature
 *     0b00: invalid, should support as least one CPHA setting
 *     0b01: supports CPHA=0 only
 *     0b10: supports CPHA=1 only
 *     0b11: supports CPHA=0 and CPHA=1.
 *   bit 2-3: CPOL feature
 *     0b00: invalid, should support as least one CPOL setting
 *     0b01: supports CPOL=0 only
 *     0b10: supports CPOL=1 only
 *     0b11: supports CPOL=0 and CPOL=1.
 *   bit 4: chipselect active high feature, 0 for unsupported and 1 for
 *     supported, chipselect active low is supported by default.
 *   bit 5: LSB first feature, 0 for unsupported and 1 for supported,
 *     MSB first is supported by default.
 *   bit 6: loopback mode feature, 0 for unsupported and 1 for supported,
 *     normal mode is supported by default.
 * @max_freq_hz: the maximum clock rate supported in Hz unit, 0 means no
 *   limitation for transfer speed.
 * @max_word_delay_ns: the maximum word delay supported, in nanoseconds.
 *   A value of 0 indicates that word delay is unsupported.
 *   Each transfer may consist of a sequence of words.
 * @max_cs_setup_ns: the maximum delay supported after chipselect is asserted,
 *   in ns unit, 0 means delay is not supported to introduce after chipselect is
 *   asserted.
 * @max_cs_hold_ns: the maximum delay supported before chipselect is deasserted,
 *   in ns unit, 0 means delay is not supported to introduce before chipselect
 *   is deasserted.
 * @max_cs_incative_ns: maximum delay supported after chipselect is deasserted,
 *   in ns unit, 0 means delay is not supported to introduce after chipselect is
 *   deasserted.
 */
struct virtio_spi_config {
	uint8_t cs_max_number;
	uint8_t cs_change_supported;
#define VIRTIO_SPI_RX_TX_SUPPORT_DUAL		_BITUL(0)
#define VIRTIO_SPI_RX_TX_SUPPORT_QUAD		_BITUL(1)
#define VIRTIO_SPI_RX_TX_SUPPORT_OCTAL		_BITUL(2)
	uint8_t tx_nbits_supported;
	uint8_t rx_nbits_supported;
	uint32_t bits_per_word_mask;
#define VIRTIO_SPI_MF_SUPPORT_CPHA_0		_BITUL(0)
#define VIRTIO_SPI_MF_SUPPORT_CPHA_1		_BITUL(1)
#define VIRTIO_SPI_MF_SUPPORT_CPOL_0		_BITUL(2)
#define VIRTIO_SPI_MF_SUPPORT_CPOL_1		_BITUL(3)
#define VIRTIO_SPI_MF_SUPPORT_CS_HIGH		_BITUL(4)
#define VIRTIO_SPI_MF_SUPPORT_LSB_FIRST		_BITUL(5)
#define VIRTIO_SPI_MF_SUPPORT_LOOPBACK		_BITUL(6)
	uint32_t mode_func_supported;
	uint32_t max_freq_hz;
	uint32_t max_word_delay_ns;
	uint32_t max_cs_setup_ns;
	uint32_t max_cs_hold_ns;
	uint32_t max_cs_inactive_ns;
};

/**
 * struct spi_transfer_head - virtio SPI transfer descriptor
 * @chip_select_id: chipselect index the SPI transfer used.
 * @bits_per_word: the number of bits in each SPI transfer word.
 * @cs_change: whether to deselect device after finishing this transfer
 *     before starting the next transfer, 0 means cs keep asserted and
 *     1 means cs deasserted then asserted again.
 * @tx_nbits: bus width for write transfer.
 *     0,1: bus width is 1, also known as SINGLE
 *     2  : bus width is 2, also known as DUAL
 *     4  : bus width is 4, also known as QUAD
 *     8  : bus width is 8, also known as OCTAL
 *     other values are invalid.
 * @rx_nbits: bus width for read transfer.
 *     0,1: bus width is 1, also known as SINGLE
 *     2  : bus width is 2, also known as DUAL
 *     4  : bus width is 4, also known as QUAD
 *     8  : bus width is 8, also known as OCTAL
 *     other values are invalid.
 * @reserved: for future use.
 * @mode: SPI transfer mode.
 *     bit 0: CPHA, determines the timing (i.e. phase) of the data
 *         bits relative to the clock pulses.For CPHA=0, the
 *         "out" side changes the data on the trailing edge of the
 *         preceding clock cycle, while the "in" side captures the data
 *         on (or shortly after) the leading edge of the clock cycle.
 *         For CPHA=1, the "out" side changes the data on the leading
 *         edge of the current clock cycle, while the "in" side
 *         captures the data on (or shortly after) the trailing edge of
 *         the clock cycle.
 *     bit 1: CPOL, determines the polarity of the clock. CPOL=0 is a
 *         clock which idles at 0, and each cycle consists of a pulse
 *         of 1. CPOL=1 is a clock which idles at 1, and each cycle
 *         consists of a pulse of 0.
 *     bit 2: CS_HIGH, if 1, chip select active high, else active low.
 *     bit 3: LSB_FIRST, determines per-word bits-on-wire, if 0, MSB
 *         first, else LSB first.
 *     bit 4: LOOP, loopback mode.
 * @freq: the transfer speed in Hz.
 * @word_delay_ns: delay to be inserted between consecutive words of a
 *     transfer, in ns unit.
 * @cs_setup_ns: delay to be introduced after CS is asserted, in ns
 *     unit.
 * @cs_delay_hold_ns: delay to be introduced before CS is deasserted
 *     for each transfer, in ns unit.
 * @cs_change_delay_inactive_ns: delay to be introduced after CS is
 *     deasserted and before next asserted, in ns unit.
 */
struct spi_transfer_head {
	uint8_t chip_select_id;
	uint8_t bits_per_word;
	uint8_t cs_change;
	uint8_t tx_nbits;
	uint8_t rx_nbits;
	uint8_t reserved[3];
	uint32_t mode;
	uint32_t freq;
	uint32_t word_delay_ns;
	uint32_t cs_setup_ns;
	uint32_t cs_delay_hold_ns;
	uint32_t cs_change_delay_inactive_ns;
};

/**
 * struct spi_transfer_result - virtio SPI transfer result
 * @result: Transfer result code.
 *          VIRTIO_SPI_TRANS_OK: Transfer successful.
 *          VIRTIO_SPI_PARAM_ERR: Parameter error.
 *          VIRTIO_SPI_TRANS_ERR: Transfer error.
 */
struct spi_transfer_result {
#define VIRTIO_SPI_TRANS_OK	0
#define VIRTIO_SPI_PARAM_ERR	1
#define VIRTIO_SPI_TRANS_ERR	2
	uint8_t result;
};

#endif /* #ifndef _LINUX_VIRTIO_VIRTIO_SPI_H */
