hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/include/linux/spi/spi-mem.h
....@@ -17,6 +17,7 @@
1717 { \
1818 .buswidth = __buswidth, \
1919 .opcode = __opcode, \
20
+ .nbytes = 1, \
2021 }
2122
2223 #define SPI_MEM_OP_ADDR(__nbytes, __val, __buswidth) \
....@@ -57,21 +58,27 @@
5758 /**
5859 * enum spi_mem_data_dir - describes the direction of a SPI memory data
5960 * transfer from the controller perspective
61
+ * @SPI_MEM_NO_DATA: no data transferred
6062 * @SPI_MEM_DATA_IN: data coming from the SPI memory
61
- * @SPI_MEM_DATA_OUT: data sent the SPI memory
63
+ * @SPI_MEM_DATA_OUT: data sent to the SPI memory
6264 */
6365 enum spi_mem_data_dir {
66
+ SPI_MEM_NO_DATA,
6467 SPI_MEM_DATA_IN,
6568 SPI_MEM_DATA_OUT,
6669 };
6770
6871 /**
6972 * struct spi_mem_op - describes a SPI memory operation
73
+ * @cmd.nbytes: number of opcode bytes (only 1 or 2 are valid). The opcode is
74
+ * sent MSB-first.
7075 * @cmd.buswidth: number of IO lines used to transmit the command
7176 * @cmd.opcode: operation opcode
77
+ * @cmd.dtr: whether the command opcode should be sent in DTR mode or not
7278 * @addr.nbytes: number of address bytes to send. Can be zero if the operation
7379 * does not need to send an address
7480 * @addr.buswidth: number of IO lines used to transmit the address cycles
81
+ * @addr.dtr: whether the address should be sent in DTR mode or not
7582 * @addr.val: address value. This value is always sent MSB first on the bus.
7683 * Note that only @addr.nbytes are taken into account in this
7784 * address value, so users should make sure the value fits in the
....@@ -79,7 +86,9 @@
7986 * @dummy.nbytes: number of dummy bytes to send after an opcode or address. Can
8087 * be zero if the operation does not require dummy bytes
8188 * @dummy.buswidth: number of IO lanes used to transmit the dummy bytes
89
+ * @dummy.dtr: whether the dummy bytes should be sent in DTR mode or not
8290 * @data.buswidth: number of IO lanes used to send/receive the data
91
+ * @data.dtr: whether the data should be sent in DTR mode or not
8392 * @data.dir: direction of the transfer
8493 * @data.nbytes: number of data bytes to send/receive. Can be zero if the
8594 * operation does not involve transferring data
....@@ -88,23 +97,28 @@
8897 */
8998 struct spi_mem_op {
9099 struct {
100
+ u8 nbytes;
91101 u8 buswidth;
92
- u8 opcode;
102
+ u8 dtr : 1;
103
+ u16 opcode;
93104 } cmd;
94105
95106 struct {
96107 u8 nbytes;
97108 u8 buswidth;
109
+ u8 dtr : 1;
98110 u64 val;
99111 } addr;
100112
101113 struct {
102114 u8 nbytes;
103115 u8 buswidth;
116
+ u8 dtr : 1;
104117 } dummy;
105118
106119 struct {
107120 u8 buswidth;
121
+ u8 dtr : 1;
108122 enum spi_mem_data_dir dir;
109123 unsigned int nbytes;
110124 union {
....@@ -121,6 +135,49 @@
121135 .dummy = __dummy, \
122136 .data = __data, \
123137 }
138
+
139
+/**
140
+ * struct spi_mem_dirmap_info - Direct mapping information
141
+ * @op_tmpl: operation template that should be used by the direct mapping when
142
+ * the memory device is accessed
143
+ * @offset: absolute offset this direct mapping is pointing to
144
+ * @length: length in byte of this direct mapping
145
+ *
146
+ * These information are used by the controller specific implementation to know
147
+ * the portion of memory that is directly mapped and the spi_mem_op that should
148
+ * be used to access the device.
149
+ * A direct mapping is only valid for one direction (read or write) and this
150
+ * direction is directly encoded in the ->op_tmpl.data.dir field.
151
+ */
152
+struct spi_mem_dirmap_info {
153
+ struct spi_mem_op op_tmpl;
154
+ u64 offset;
155
+ u64 length;
156
+};
157
+
158
+/**
159
+ * struct spi_mem_dirmap_desc - Direct mapping descriptor
160
+ * @mem: the SPI memory device this direct mapping is attached to
161
+ * @info: information passed at direct mapping creation time
162
+ * @nodirmap: set to 1 if the SPI controller does not implement
163
+ * ->mem_ops->dirmap_create() or when this function returned an
164
+ * error. If @nodirmap is true, all spi_mem_dirmap_{read,write}()
165
+ * calls will use spi_mem_exec_op() to access the memory. This is a
166
+ * degraded mode that allows spi_mem drivers to use the same code
167
+ * no matter whether the controller supports direct mapping or not
168
+ * @priv: field pointing to controller specific data
169
+ *
170
+ * Common part of a direct mapping descriptor. This object is created by
171
+ * spi_mem_dirmap_create() and controller implementation of ->create_dirmap()
172
+ * can create/attach direct mapping resources to the descriptor in the ->priv
173
+ * field.
174
+ */
175
+struct spi_mem_dirmap_desc {
176
+ struct spi_mem *mem;
177
+ struct spi_mem_dirmap_info info;
178
+ unsigned int nodirmap;
179
+ void *priv;
180
+};
124181
125182 /**
126183 * struct spi_mem - describes a SPI memory device
....@@ -177,10 +234,32 @@
177234 * Note that if the implementation of this function allocates memory
178235 * dynamically, then it should do so with devm_xxx(), as we don't
179236 * have a ->free_name() function.
237
+ * @dirmap_create: create a direct mapping descriptor that can later be used to
238
+ * access the memory device. This method is optional
239
+ * @dirmap_destroy: destroy a memory descriptor previous created by
240
+ * ->dirmap_create()
241
+ * @dirmap_read: read data from the memory device using the direct mapping
242
+ * created by ->dirmap_create(). The function can return less
243
+ * data than requested (for example when the request is crossing
244
+ * the currently mapped area), and the caller of
245
+ * spi_mem_dirmap_read() is responsible for calling it again in
246
+ * this case.
247
+ * @dirmap_write: write data to the memory device using the direct mapping
248
+ * created by ->dirmap_create(). The function can return less
249
+ * data than requested (for example when the request is crossing
250
+ * the currently mapped area), and the caller of
251
+ * spi_mem_dirmap_write() is responsible for calling it again in
252
+ * this case.
180253 *
181254 * This interface should be implemented by SPI controllers providing an
182255 * high-level interface to execute SPI memory operation, which is usually the
183256 * case for QSPI controllers.
257
+ *
258
+ * Note on ->dirmap_{read,write}(): drivers should avoid accessing the direct
259
+ * mapping from the CPU because doing that can stall the CPU waiting for the
260
+ * SPI mem transaction to finish, and this will make real-time maintainers
261
+ * unhappy and might make your system less reactive. Instead, drivers should
262
+ * use DMA to access this direct mapping.
184263 */
185264 struct spi_controller_mem_ops {
186265 int (*adjust_op_size)(struct spi_mem *mem, struct spi_mem_op *op);
....@@ -189,6 +268,12 @@
189268 int (*exec_op)(struct spi_mem *mem,
190269 const struct spi_mem_op *op);
191270 const char *(*get_name)(struct spi_mem *mem);
271
+ int (*dirmap_create)(struct spi_mem_dirmap_desc *desc);
272
+ void (*dirmap_destroy)(struct spi_mem_dirmap_desc *desc);
273
+ ssize_t (*dirmap_read)(struct spi_mem_dirmap_desc *desc,
274
+ u64 offs, size_t len, void *buf);
275
+ ssize_t (*dirmap_write)(struct spi_mem_dirmap_desc *desc,
276
+ u64 offs, size_t len, const void *buf);
192277 };
193278
194279 /**
....@@ -222,6 +307,13 @@
222307 void spi_controller_dma_unmap_mem_op_data(struct spi_controller *ctlr,
223308 const struct spi_mem_op *op,
224309 struct sg_table *sg);
310
+
311
+bool spi_mem_default_supports_op(struct spi_mem *mem,
312
+ const struct spi_mem_op *op);
313
+
314
+bool spi_mem_dtr_supports_op(struct spi_mem *mem,
315
+ const struct spi_mem_op *op);
316
+
225317 #else
226318 static inline int
227319 spi_controller_dma_map_mem_op_data(struct spi_controller *ctlr,
....@@ -237,6 +329,20 @@
237329 struct sg_table *sg)
238330 {
239331 }
332
+
333
+static inline
334
+bool spi_mem_default_supports_op(struct spi_mem *mem,
335
+ const struct spi_mem_op *op)
336
+{
337
+ return false;
338
+}
339
+
340
+static inline
341
+bool spi_mem_dtr_supports_op(struct spi_mem *mem,
342
+ const struct spi_mem_op *op)
343
+{
344
+ return false;
345
+}
240346 #endif /* CONFIG_SPI_MEM */
241347
242348 int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op);
....@@ -249,6 +355,20 @@
249355
250356 const char *spi_mem_get_name(struct spi_mem *mem);
251357
358
+struct spi_mem_dirmap_desc *
359
+spi_mem_dirmap_create(struct spi_mem *mem,
360
+ const struct spi_mem_dirmap_info *info);
361
+void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc);
362
+ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
363
+ u64 offs, size_t len, void *buf);
364
+ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
365
+ u64 offs, size_t len, const void *buf);
366
+struct spi_mem_dirmap_desc *
367
+devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
368
+ const struct spi_mem_dirmap_info *info);
369
+void devm_spi_mem_dirmap_destroy(struct device *dev,
370
+ struct spi_mem_dirmap_desc *desc);
371
+
252372 int spi_mem_driver_register_with_owner(struct spi_mem_driver *drv,
253373 struct module *owner);
254374