File Index
Files and directories
Sign in
FILE

virtio_spi.h

File preview with syntax highlighting.

linux-6.19.14/include/uapi/linux/virtio_spi.h C
  1/* SPDX-License-Identifier: BSD-3-Clause */
  2/*
  3 * Copyright (C) 2023 OpenSynergy GmbH
  4 * Copyright (C) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
  5 */
  6#ifndef _LINUX_VIRTIO_VIRTIO_SPI_H
  7#define _LINUX_VIRTIO_VIRTIO_SPI_H
  8
  9#include <linux/types.h>
 10#include <linux/virtio_config.h>
 11#include <linux/virtio_ids.h>
 12#include <linux/virtio_types.h>
 13
 14/* Sample data on trailing clock edge */
 15#define VIRTIO_SPI_CPHA			_BITUL(0)
 16/* Clock is high when IDLE */
 17#define VIRTIO_SPI_CPOL			_BITUL(1)
 18/* Chip Select is active high */
 19#define VIRTIO_SPI_CS_HIGH			_BITUL(2)
 20/* Transmit LSB first */
 21#define VIRTIO_SPI_MODE_LSB_FIRST		_BITUL(3)
 22/* Loopback mode */
 23#define VIRTIO_SPI_MODE_LOOP			_BITUL(4)
 24
 25/**
 26 * struct virtio_spi_config - All config fields are read-only for the
 27 * Virtio SPI driver
 28 * @cs_max_number: maximum number of chipselect the host SPI controller
 29 *   supports.
 30 * @cs_change_supported: indicates if the host SPI controller supports to toggle
 31 *   chipselect after each transfer in one message:
 32 *   0: unsupported, chipselect will be kept in active state throughout the
 33 *      message transaction;
 34 *   1: supported.
 35 *   Note: Message here contains a sequence of SPI transfers.
 36 * @tx_nbits_supported: indicates the supported number of bit for writing:
 37 *   bit 0: DUAL (2-bit transfer), 1 for supported
 38 *   bit 1: QUAD (4-bit transfer), 1 for supported
 39 *   bit 2: OCTAL (8-bit transfer), 1 for supported
 40 *   other bits are reserved as 0, 1-bit transfer is always supported.
 41 * @rx_nbits_supported: indicates the supported number of bit for reading:
 42 *   bit 0: DUAL (2-bit transfer), 1 for supported
 43 *   bit 1: QUAD (4-bit transfer), 1 for supported
 44 *   bit 2: OCTAL (8-bit transfer), 1 for supported
 45 *   other bits are reserved as 0, 1-bit transfer is always supported.
 46 * @bits_per_word_mask: mask indicating which values of bits_per_word are
 47 *   supported. If not set, no limitation for bits_per_word.
 48 * @mode_func_supported: indicates the following features are supported or not:
 49 *   bit 0-1: CPHA feature
 50 *     0b00: invalid, should support as least one CPHA setting
 51 *     0b01: supports CPHA=0 only
 52 *     0b10: supports CPHA=1 only
 53 *     0b11: supports CPHA=0 and CPHA=1.
 54 *   bit 2-3: CPOL feature
 55 *     0b00: invalid, should support as least one CPOL setting
 56 *     0b01: supports CPOL=0 only
 57 *     0b10: supports CPOL=1 only
 58 *     0b11: supports CPOL=0 and CPOL=1.
 59 *   bit 4: chipselect active high feature, 0 for unsupported and 1 for
 60 *     supported, chipselect active low is supported by default.
 61 *   bit 5: LSB first feature, 0 for unsupported and 1 for supported,
 62 *     MSB first is supported by default.
 63 *   bit 6: loopback mode feature, 0 for unsupported and 1 for supported,
 64 *     normal mode is supported by default.
 65 * @max_freq_hz: the maximum clock rate supported in Hz unit, 0 means no
 66 *   limitation for transfer speed.
 67 * @max_word_delay_ns: the maximum word delay supported, in nanoseconds.
 68 *   A value of 0 indicates that word delay is unsupported.
 69 *   Each transfer may consist of a sequence of words.
 70 * @max_cs_setup_ns: the maximum delay supported after chipselect is asserted,
 71 *   in ns unit, 0 means delay is not supported to introduce after chipselect is
 72 *   asserted.
 73 * @max_cs_hold_ns: the maximum delay supported before chipselect is deasserted,
 74 *   in ns unit, 0 means delay is not supported to introduce before chipselect
 75 *   is deasserted.
 76 * @max_cs_incative_ns: maximum delay supported after chipselect is deasserted,
 77 *   in ns unit, 0 means delay is not supported to introduce after chipselect is
 78 *   deasserted.
 79 */
 80struct virtio_spi_config {
 81	__u8 cs_max_number;
 82	__u8 cs_change_supported;
 83#define VIRTIO_SPI_RX_TX_SUPPORT_DUAL		_BITUL(0)
 84#define VIRTIO_SPI_RX_TX_SUPPORT_QUAD		_BITUL(1)
 85#define VIRTIO_SPI_RX_TX_SUPPORT_OCTAL		_BITUL(2)
 86	__u8 tx_nbits_supported;
 87	__u8 rx_nbits_supported;
 88	__le32 bits_per_word_mask;
 89#define VIRTIO_SPI_MF_SUPPORT_CPHA_0		_BITUL(0)
 90#define VIRTIO_SPI_MF_SUPPORT_CPHA_1		_BITUL(1)
 91#define VIRTIO_SPI_MF_SUPPORT_CPOL_0		_BITUL(2)
 92#define VIRTIO_SPI_MF_SUPPORT_CPOL_1		_BITUL(3)
 93#define VIRTIO_SPI_MF_SUPPORT_CS_HIGH		_BITUL(4)
 94#define VIRTIO_SPI_MF_SUPPORT_LSB_FIRST		_BITUL(5)
 95#define VIRTIO_SPI_MF_SUPPORT_LOOPBACK		_BITUL(6)
 96	__le32 mode_func_supported;
 97	__le32 max_freq_hz;
 98	__le32 max_word_delay_ns;
 99	__le32 max_cs_setup_ns;
100	__le32 max_cs_hold_ns;
101	__le32 max_cs_inactive_ns;
102};
103
104/**
105 * struct spi_transfer_head - virtio SPI transfer descriptor
106 * @chip_select_id: chipselect index the SPI transfer used.
107 * @bits_per_word: the number of bits in each SPI transfer word.
108 * @cs_change: whether to deselect device after finishing this transfer
109 *     before starting the next transfer, 0 means cs keep asserted and
110 *     1 means cs deasserted then asserted again.
111 * @tx_nbits: bus width for write transfer.
112 *     0,1: bus width is 1, also known as SINGLE
113 *     2  : bus width is 2, also known as DUAL
114 *     4  : bus width is 4, also known as QUAD
115 *     8  : bus width is 8, also known as OCTAL
116 *     other values are invalid.
117 * @rx_nbits: bus width for read transfer.
118 *     0,1: bus width is 1, also known as SINGLE
119 *     2  : bus width is 2, also known as DUAL
120 *     4  : bus width is 4, also known as QUAD
121 *     8  : bus width is 8, also known as OCTAL
122 *     other values are invalid.
123 * @reserved: for future use.
124 * @mode: SPI transfer mode.
125 *     bit 0: CPHA, determines the timing (i.e. phase) of the data
126 *         bits relative to the clock pulses.For CPHA=0, the
127 *         "out" side changes the data on the trailing edge of the
128 *         preceding clock cycle, while the "in" side captures the data
129 *         on (or shortly after) the leading edge of the clock cycle.
130 *         For CPHA=1, the "out" side changes the data on the leading
131 *         edge of the current clock cycle, while the "in" side
132 *         captures the data on (or shortly after) the trailing edge of
133 *         the clock cycle.
134 *     bit 1: CPOL, determines the polarity of the clock. CPOL=0 is a
135 *         clock which idles at 0, and each cycle consists of a pulse
136 *         of 1. CPOL=1 is a clock which idles at 1, and each cycle
137 *         consists of a pulse of 0.
138 *     bit 2: CS_HIGH, if 1, chip select active high, else active low.
139 *     bit 3: LSB_FIRST, determines per-word bits-on-wire, if 0, MSB
140 *         first, else LSB first.
141 *     bit 4: LOOP, loopback mode.
142 * @freq: the transfer speed in Hz.
143 * @word_delay_ns: delay to be inserted between consecutive words of a
144 *     transfer, in ns unit.
145 * @cs_setup_ns: delay to be introduced after CS is asserted, in ns
146 *     unit.
147 * @cs_delay_hold_ns: delay to be introduced before CS is deasserted
148 *     for each transfer, in ns unit.
149 * @cs_change_delay_inactive_ns: delay to be introduced after CS is
150 *     deasserted and before next asserted, in ns unit.
151 */
152struct spi_transfer_head {
153	__u8 chip_select_id;
154	__u8 bits_per_word;
155	__u8 cs_change;
156	__u8 tx_nbits;
157	__u8 rx_nbits;
158	__u8 reserved[3];
159	__le32 mode;
160	__le32 freq;
161	__le32 word_delay_ns;
162	__le32 cs_setup_ns;
163	__le32 cs_delay_hold_ns;
164	__le32 cs_change_delay_inactive_ns;
165};
166
167/**
168 * struct spi_transfer_result - virtio SPI transfer result
169 * @result: Transfer result code.
170 *          VIRTIO_SPI_TRANS_OK: Transfer successful.
171 *          VIRTIO_SPI_PARAM_ERR: Parameter error.
172 *          VIRTIO_SPI_TRANS_ERR: Transfer error.
173 */
174struct spi_transfer_result {
175#define VIRTIO_SPI_TRANS_OK	0
176#define VIRTIO_SPI_PARAM_ERR	1
177#define VIRTIO_SPI_TRANS_ERR	2
178	__u8 result;
179};
180
181#endif /* #ifndef _LINUX_VIRTIO_VIRTIO_SPI_H */
~/ Read-only file preview.