Line data Source code
1 1 : /*
2 : * Copyright (c) 2024, Ambiq Micro Inc. <www.ambiq.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public APIs for MSPI driver
10 : * @since 3.7
11 : * @version 0.1.0
12 : */
13 :
14 : #ifndef ZEPHYR_INCLUDE_MSPI_H_
15 : #define ZEPHYR_INCLUDE_MSPI_H_
16 :
17 : #include <errno.h>
18 :
19 : #include <zephyr/sys/__assert.h>
20 : #include <zephyr/types.h>
21 : #include <zephyr/kernel.h>
22 : #include <zephyr/device.h>
23 : #include <zephyr/drivers/gpio.h>
24 :
25 : #ifdef __cplusplus
26 : extern "C" {
27 : #endif
28 :
29 : /**
30 : * @brief MSPI Driver APIs
31 : * @defgroup mspi_interface MSPI Driver APIs
32 : * @ingroup io_interfaces
33 : * @{
34 : */
35 :
36 : /**
37 : * @brief MSPI operational mode
38 : */
39 0 : enum mspi_op_mode {
40 : MSPI_OP_MODE_CONTROLLER = 0,
41 : MSPI_OP_MODE_PERIPHERAL = 1,
42 : };
43 :
44 : /**
45 : * @brief MSPI duplex mode
46 : */
47 0 : enum mspi_duplex {
48 : MSPI_HALF_DUPLEX = 0,
49 : MSPI_FULL_DUPLEX = 1,
50 : };
51 :
52 : /**
53 : * @brief MSPI I/O mode capabilities
54 : * Postfix like 1_4_4 stands for the number of lines used for
55 : * command, address and data phases.
56 : * Mode with no postfix has the same number of lines for all phases.
57 : */
58 0 : enum mspi_io_mode {
59 : MSPI_IO_MODE_SINGLE = 0,
60 : MSPI_IO_MODE_DUAL = 1,
61 : MSPI_IO_MODE_DUAL_1_1_2 = 2,
62 : MSPI_IO_MODE_DUAL_1_2_2 = 3,
63 : MSPI_IO_MODE_QUAD = 4,
64 : MSPI_IO_MODE_QUAD_1_1_4 = 5,
65 : MSPI_IO_MODE_QUAD_1_4_4 = 6,
66 : MSPI_IO_MODE_OCTAL = 7,
67 : MSPI_IO_MODE_OCTAL_1_1_8 = 8,
68 : MSPI_IO_MODE_OCTAL_1_8_8 = 9,
69 : MSPI_IO_MODE_HEX = 10,
70 : MSPI_IO_MODE_HEX_8_8_16 = 11,
71 : MSPI_IO_MODE_HEX_8_16_16 = 12,
72 : MSPI_IO_MODE_MAX,
73 : };
74 :
75 : /**
76 : * @brief MSPI data rate capabilities
77 : * SINGLE stands for single data rate for all phases.
78 : * DUAL stands for dual data rate for all phases.
79 : * S_S_D stands for single data rate for command and address phases but
80 : * dual data rate for data phase.
81 : * S_D_D stands for single data rate for command phase but dual data rate
82 : * for address and data phases.
83 : */
84 0 : enum mspi_data_rate {
85 : MSPI_DATA_RATE_SINGLE = 0,
86 : MSPI_DATA_RATE_S_S_D = 1,
87 : MSPI_DATA_RATE_S_D_D = 2,
88 : MSPI_DATA_RATE_DUAL = 3,
89 : MSPI_DATA_RATE_MAX,
90 : };
91 :
92 : /**
93 : * @brief MSPI Polarity & Phase Modes
94 : */
95 0 : enum mspi_cpp_mode {
96 : MSPI_CPP_MODE_0 = 0,
97 : MSPI_CPP_MODE_1 = 1,
98 : MSPI_CPP_MODE_2 = 2,
99 : MSPI_CPP_MODE_3 = 3,
100 : };
101 :
102 : /**
103 : * @brief MSPI Endian
104 : */
105 0 : enum mspi_endian {
106 : MSPI_XFER_LITTLE_ENDIAN = 0,
107 : MSPI_XFER_BIG_ENDIAN = 1,
108 : };
109 :
110 : /**
111 : * @brief MSPI chip enable polarity
112 : */
113 0 : enum mspi_ce_polarity {
114 : MSPI_CE_ACTIVE_LOW = 0,
115 : MSPI_CE_ACTIVE_HIGH = 1,
116 : };
117 :
118 : /**
119 : * @brief MSPI bus event.
120 : * This is a preliminary list of events. I encourage the community
121 : * to fill it up.
122 : */
123 0 : enum mspi_bus_event {
124 : MSPI_BUS_RESET = 0,
125 : MSPI_BUS_ERROR = 1,
126 : MSPI_BUS_XFER_COMPLETE = 2,
127 : MSPI_BUS_EVENT_MAX,
128 : };
129 :
130 : /**
131 : * @brief MSPI bus event callback mask
132 : * This is a preliminary list same as mspi_bus_event. I encourage the
133 : * community to fill it up.
134 : */
135 0 : enum mspi_bus_event_cb_mask {
136 : MSPI_BUS_NO_CB = 0,
137 : MSPI_BUS_RESET_CB = BIT(0),
138 : MSPI_BUS_ERROR_CB = BIT(1),
139 : MSPI_BUS_XFER_COMPLETE_CB = BIT(2),
140 : };
141 :
142 : /**
143 : * @brief MSPI transfer modes
144 : */
145 0 : enum mspi_xfer_mode {
146 : MSPI_PIO,
147 : MSPI_DMA,
148 : };
149 :
150 : /**
151 : * @brief MSPI transfer directions
152 : */
153 0 : enum mspi_xfer_direction {
154 : MSPI_RX,
155 : MSPI_TX,
156 : };
157 :
158 : /**
159 : * @brief MSPI controller device specific configuration mask
160 : */
161 0 : enum mspi_dev_cfg_mask {
162 : MSPI_DEVICE_CONFIG_NONE = 0,
163 : MSPI_DEVICE_CONFIG_CE_NUM = BIT(0),
164 : MSPI_DEVICE_CONFIG_FREQUENCY = BIT(1),
165 : MSPI_DEVICE_CONFIG_IO_MODE = BIT(2),
166 : MSPI_DEVICE_CONFIG_DATA_RATE = BIT(3),
167 : MSPI_DEVICE_CONFIG_CPP = BIT(4),
168 : MSPI_DEVICE_CONFIG_ENDIAN = BIT(5),
169 : MSPI_DEVICE_CONFIG_CE_POL = BIT(6),
170 : MSPI_DEVICE_CONFIG_DQS = BIT(7),
171 : MSPI_DEVICE_CONFIG_RX_DUMMY = BIT(8),
172 : MSPI_DEVICE_CONFIG_TX_DUMMY = BIT(9),
173 : MSPI_DEVICE_CONFIG_READ_CMD = BIT(10),
174 : MSPI_DEVICE_CONFIG_WRITE_CMD = BIT(11),
175 : MSPI_DEVICE_CONFIG_CMD_LEN = BIT(12),
176 : MSPI_DEVICE_CONFIG_ADDR_LEN = BIT(13),
177 : MSPI_DEVICE_CONFIG_MEM_BOUND = BIT(14),
178 : MSPI_DEVICE_CONFIG_BREAK_TIME = BIT(15),
179 : MSPI_DEVICE_CONFIG_ALL = BIT_MASK(16),
180 : };
181 :
182 : /**
183 : * @brief MSPI XIP access permissions
184 : */
185 0 : enum mspi_xip_permit {
186 : MSPI_XIP_READ_WRITE = 0,
187 : MSPI_XIP_READ_ONLY = 1,
188 : };
189 :
190 : /**
191 : * @brief MSPI Configure API
192 : * @defgroup mspi_configure_api MSPI Configure API
193 : * @{
194 : */
195 :
196 : /**
197 : * @brief Stub for timing parameter
198 : */
199 0 : enum mspi_timing_param {
200 : MSPI_TIMING_PARAM_DUMMY
201 : };
202 :
203 : /**
204 : * @brief Stub for struct timing_cfg
205 : */
206 1 : struct mspi_timing_cfg {
207 : #ifdef __cplusplus
208 : /* For C++ compatibility. */
209 : uint8_t dummy;
210 : #endif
211 : };
212 :
213 : /**
214 : * @brief MSPI device ID
215 : * The controller can identify its devices and determine whether the access is
216 : * allowed in a multiple device scheme.
217 : */
218 1 : struct mspi_dev_id {
219 : /** @brief device gpio ce */
220 1 : struct gpio_dt_spec ce;
221 : /** @brief device index on DT */
222 1 : uint16_t dev_idx;
223 : };
224 :
225 : /**
226 : * @brief MSPI controller configuration
227 : */
228 1 : struct mspi_cfg {
229 : /** @brief mspi channel number */
230 1 : uint8_t channel_num;
231 : /** @brief Configure operation mode */
232 1 : enum mspi_op_mode op_mode;
233 : /** @brief Configure duplex mode */
234 1 : enum mspi_duplex duplex;
235 : /** @brief DQS support flag */
236 1 : bool dqs_support;
237 : /** @brief Software managed multi peripheral enable */
238 1 : bool sw_multi_periph;
239 : /** @brief GPIO chip select lines (optional) */
240 1 : struct gpio_dt_spec *ce_group;
241 : /** @brief GPIO chip-select line numbers (optional) */
242 1 : uint32_t num_ce_gpios;
243 : /** @brief Peripheral number from 0 to host controller peripheral limit. */
244 1 : uint32_t num_periph;
245 : /** @brief Maximum supported frequency in MHz */
246 1 : uint32_t max_freq;
247 : /** @brief Whether to re-initialize controller */
248 1 : bool re_init;
249 : };
250 :
251 : /**
252 : * @brief MSPI DT information
253 : */
254 1 : struct mspi_dt_spec {
255 : /** @brief MSPI bus */
256 1 : const struct device *bus;
257 : /** @brief MSPI hardware specific configuration */
258 1 : struct mspi_cfg config;
259 : };
260 :
261 : /**
262 : * @brief MSPI controller device specific configuration
263 : */
264 1 : struct mspi_dev_cfg {
265 : /** @brief Configure CE0 or CE1 or more */
266 1 : uint8_t ce_num;
267 : /** @brief Configure frequency */
268 1 : uint32_t freq;
269 : /** @brief Configure I/O mode */
270 1 : enum mspi_io_mode io_mode;
271 : /** @brief Configure data rate */
272 1 : enum mspi_data_rate data_rate;
273 : /** @brief Configure clock polarity and phase */
274 1 : enum mspi_cpp_mode cpp;
275 : /** @brief Configure transfer endian */
276 1 : enum mspi_endian endian;
277 : /** @brief Configure chip enable polarity */
278 1 : enum mspi_ce_polarity ce_polarity;
279 : /** @brief Configure DQS mode */
280 1 : bool dqs_enable;
281 : /** @brief Configure number of clock cycles between
282 : * addr and data in RX direction
283 : */
284 1 : uint16_t rx_dummy;
285 : /** @brief Configure number of clock cycles between
286 : * addr and data in TX direction
287 : */
288 1 : uint16_t tx_dummy;
289 : /** @brief Configure read command */
290 1 : uint32_t read_cmd;
291 : /** @brief Configure write command */
292 1 : uint32_t write_cmd;
293 : /** @brief Configure command length */
294 1 : uint8_t cmd_length;
295 : /** @brief Configure address length */
296 1 : uint8_t addr_length;
297 : /** @brief Configure memory boundary */
298 1 : uint32_t mem_boundary;
299 : /** @brief Configure the time to break up a transfer into 2 */
300 1 : uint32_t time_to_break;
301 : };
302 :
303 : /**
304 : * @brief MSPI controller XIP configuration
305 : */
306 1 : struct mspi_xip_cfg {
307 : /** @brief XIP enable */
308 1 : bool enable;
309 : /** @brief XIP region start address =
310 : * hardware default + address offset
311 : */
312 1 : uint32_t address_offset;
313 : /** @brief XIP region size */
314 1 : uint32_t size;
315 : /** @brief XIP access permission */
316 1 : enum mspi_xip_permit permission;
317 : };
318 :
319 : /**
320 : * @brief MSPI controller scramble configuration
321 : */
322 1 : struct mspi_scramble_cfg {
323 : /** @brief scramble enable */
324 1 : bool enable;
325 : /** @brief scramble region start address =
326 : * hardware default + address offset
327 : */
328 1 : uint32_t address_offset;
329 : /** @brief scramble region size */
330 1 : uint32_t size;
331 : };
332 :
333 : /** @} */
334 :
335 : /**
336 : * @brief MSPI Transfer API
337 : * @defgroup mspi_transfer_api MSPI Transfer API
338 : * @{
339 : */
340 :
341 : /**
342 : * @brief MSPI Chip Select control structure
343 : *
344 : * This can be used to control a CE line via a GPIO line, instead of
345 : * using the controller inner CE logic.
346 : *
347 : */
348 1 : struct mspi_ce_control {
349 : /**
350 : * @brief GPIO devicetree specification of CE GPIO.
351 : * The device pointer can be set to NULL to fully inhibit CE control if
352 : * necessary. The GPIO flags GPIO_ACTIVE_LOW/GPIO_ACTIVE_HIGH should be
353 : * the same as in MSPI configuration.
354 : */
355 1 : struct gpio_dt_spec gpio;
356 : /**
357 : * @brief Delay to wait.
358 : * In microseconds before starting the
359 : * transmission and before releasing the CE line.
360 : */
361 1 : uint32_t delay;
362 : };
363 :
364 : /**
365 : * @brief MSPI peripheral xfer packet format
366 : */
367 1 : struct mspi_xfer_packet {
368 : /** @brief Direction (Transmit/Receive) */
369 1 : enum mspi_xfer_direction dir;
370 : /** @brief Bus event callback masks */
371 1 : enum mspi_bus_event_cb_mask cb_mask;
372 : /** @brief Transfer command */
373 1 : uint32_t cmd;
374 : /** @brief Transfer Address */
375 1 : uint32_t address;
376 : /** @brief Number of bytes to transfer */
377 1 : uint32_t num_bytes;
378 : /** @brief Data Buffer */
379 1 : uint8_t *data_buf;
380 : };
381 :
382 : /**
383 : * @brief MSPI peripheral xfer format
384 : * This includes transfer related settings that may
385 : * require configuring the hardware.
386 : */
387 1 : struct mspi_xfer {
388 : /** @brief Async or sync transfer */
389 1 : bool async;
390 : /** @brief Transfer Mode */
391 1 : enum mspi_xfer_mode xfer_mode;
392 : /** @brief Configure TX dummy cycles */
393 1 : uint16_t tx_dummy;
394 : /** @brief Configure RX dummy cycles */
395 1 : uint16_t rx_dummy;
396 : /** @brief Configure command length */
397 1 : uint8_t cmd_length;
398 : /** @brief Configure address length */
399 1 : uint8_t addr_length;
400 : /** @brief Hold CE active after xfer */
401 1 : bool hold_ce;
402 : /** @brief Software CE control */
403 1 : struct mspi_ce_control ce_sw_ctrl;
404 : /** @brief Priority 0 = Low (best effort)
405 : * 1 = High (service immediately)
406 : */
407 1 : uint8_t priority;
408 : /** @brief Transfer packets */
409 1 : const struct mspi_xfer_packet *packets;
410 : /** @brief Number of transfer packets */
411 1 : uint32_t num_packet;
412 : /** @brief Transfer timeout value */
413 1 : uint32_t timeout;
414 : };
415 :
416 : /** @} */
417 :
418 : /**
419 : * @brief MSPI callback API
420 : * @defgroup mspi_callback_api MSPI callback API
421 : * @{
422 : */
423 :
424 : /**
425 : * @brief MSPI event data
426 : */
427 1 : struct mspi_event_data {
428 : /** @brief Pointer to the bus controller */
429 1 : const struct device *controller;
430 : /** @brief Pointer to the peripheral device ID */
431 1 : const struct mspi_dev_id *dev_id;
432 : /** @brief Pointer to a transfer packet */
433 1 : const struct mspi_xfer_packet *packet;
434 : /** @brief MSPI event status */
435 1 : uint32_t status;
436 : /** @brief Packet index */
437 1 : uint32_t packet_idx;
438 : };
439 :
440 : /**
441 : * @brief MSPI event
442 : */
443 1 : struct mspi_event {
444 : /** Event type */
445 1 : enum mspi_bus_event evt_type;
446 : /** Data associated to the event */
447 1 : struct mspi_event_data evt_data;
448 : };
449 :
450 : /**
451 : * @brief MSPI callback context
452 : */
453 1 : struct mspi_callback_context {
454 : /** @brief MSPI event */
455 1 : struct mspi_event mspi_evt;
456 : /** @brief user defined context */
457 1 : void *ctx;
458 : };
459 :
460 : /**
461 : * @typedef mspi_callback_handler_t
462 : * @brief Define the application callback handler function signature.
463 : *
464 : * @param mspi_cb_ctx Pointer to the MSPI callback context
465 : *
466 : */
467 1 : typedef void (*mspi_callback_handler_t)(struct mspi_callback_context *mspi_cb_ctx, ...);
468 :
469 : /** @} */
470 :
471 : /**
472 : * MSPI driver API definition and system call entry points
473 : */
474 1 : typedef int (*mspi_api_config)(const struct mspi_dt_spec *spec);
475 :
476 0 : typedef int (*mspi_api_dev_config)(const struct device *controller,
477 : const struct mspi_dev_id *dev_id,
478 : const enum mspi_dev_cfg_mask param_mask,
479 : const struct mspi_dev_cfg *cfg);
480 :
481 0 : typedef int (*mspi_api_get_channel_status)(const struct device *controller, uint8_t ch);
482 :
483 0 : typedef int (*mspi_api_transceive)(const struct device *controller,
484 : const struct mspi_dev_id *dev_id,
485 : const struct mspi_xfer *req);
486 :
487 0 : typedef int (*mspi_api_register_callback)(const struct device *controller,
488 : const struct mspi_dev_id *dev_id,
489 : const enum mspi_bus_event evt_type,
490 : mspi_callback_handler_t cb,
491 : struct mspi_callback_context *ctx);
492 :
493 0 : typedef int (*mspi_api_xip_config)(const struct device *controller,
494 : const struct mspi_dev_id *dev_id,
495 : const struct mspi_xip_cfg *xip_cfg);
496 :
497 0 : typedef int (*mspi_api_scramble_config)(const struct device *controller,
498 : const struct mspi_dev_id *dev_id,
499 : const struct mspi_scramble_cfg *scramble_cfg);
500 :
501 0 : typedef int (*mspi_api_timing_config)(const struct device *controller,
502 : const struct mspi_dev_id *dev_id, const uint32_t param_mask,
503 : void *timing_cfg);
504 :
505 0 : __subsystem struct mspi_driver_api {
506 0 : mspi_api_config config;
507 0 : mspi_api_dev_config dev_config;
508 0 : mspi_api_get_channel_status get_channel_status;
509 0 : mspi_api_transceive transceive;
510 0 : mspi_api_register_callback register_callback;
511 0 : mspi_api_xip_config xip_config;
512 0 : mspi_api_scramble_config scramble_config;
513 0 : mspi_api_timing_config timing_config;
514 : };
515 :
516 : /**
517 : * @addtogroup mspi_configure_api
518 : * @{
519 : */
520 :
521 : /**
522 : * @brief Configure a MSPI controller.
523 : *
524 : * This routine provides a generic interface to override MSPI controller
525 : * capabilities.
526 : *
527 : * In the controller driver, one may implement this API to initialize or
528 : * re-initialize their controller hardware. Additional SoC platform specific
529 : * settings that are not in struct mspi_cfg may be added to one's own
530 : * binding(xxx,mspi-controller.yaml) so that one may derive the settings from
531 : * DTS and configure it in this API. In general, these settings should not
532 : * change during run-time. The bindings for @see mspi_cfg can be found in
533 : * mspi-controller.yaml.
534 : *
535 : * @param spec Pointer to MSPI DT information.
536 : *
537 : * @retval 0 If successful.
538 : * @retval -EIO General input / output error, failed to configure device.
539 : * @retval -EINVAL invalid capabilities, failed to configure device.
540 : * @retval -ENOTSUP capability not supported by MSPI peripheral.
541 : */
542 1 : __syscall int mspi_config(const struct mspi_dt_spec *spec);
543 :
544 : static inline int z_impl_mspi_config(const struct mspi_dt_spec *spec)
545 : {
546 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)spec->bus->api;
547 :
548 : return api->config(spec);
549 : }
550 :
551 : /**
552 : * @brief Configure a MSPI controller with device specific parameters.
553 : *
554 : * This routine provides a generic interface to override MSPI controller
555 : * device specific settings that should be derived from device datasheets.
556 : *
557 : * With @see mspi_dev_id defined as the device index and CE GPIO from device
558 : * tree, the API supports multiple devices on the same controller instance.
559 : * It is up to the controller driver implementation whether to support device
560 : * switching either by software or by hardware or not at all. If by software,
561 : * the switching should be done in this API's implementation.
562 : * The implementation may also support individual parameter configurations
563 : * specified by @see mspi_dev_cfg_mask.
564 : * The settings within @see mspi_dev_cfg don't typically change once the mode
565 : * of operation is determined after the device initialization.
566 : * The bindings for @see mspi_dev_cfg can be found in mspi-device.yaml.
567 : *
568 : * @param controller Pointer to the device structure for the driver instance.
569 : * @param dev_id Pointer to the device ID structure from a device.
570 : * @param param_mask Macro definition of what to be configured in cfg.
571 : * @param cfg The device runtime configuration for the MSPI controller.
572 : *
573 : * @retval 0 If successful.
574 : * @retval -EIO General input / output error, failed to configure device.
575 : * @retval -EINVAL invalid capabilities, failed to configure device.
576 : * @retval -ENOTSUP capability not supported by MSPI peripheral.
577 : */
578 1 : __syscall int mspi_dev_config(const struct device *controller,
579 : const struct mspi_dev_id *dev_id,
580 : const enum mspi_dev_cfg_mask param_mask,
581 : const struct mspi_dev_cfg *cfg);
582 :
583 : static inline int z_impl_mspi_dev_config(const struct device *controller,
584 : const struct mspi_dev_id *dev_id,
585 : const enum mspi_dev_cfg_mask param_mask,
586 : const struct mspi_dev_cfg *cfg)
587 : {
588 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
589 :
590 : return api->dev_config(controller, dev_id, param_mask, cfg);
591 : }
592 :
593 : /**
594 : * @brief Query to see if it a channel is ready.
595 : *
596 : * This routine allows to check if logical channel is ready before use.
597 : * Note that queries for channels not supported will always return false.
598 : *
599 : * @param controller Pointer to the device structure for the driver instance.
600 : * @param ch the MSPI channel for which status is to be retrieved.
601 : *
602 : * @retval 0 If MSPI channel is ready.
603 : */
604 1 : __syscall int mspi_get_channel_status(const struct device *controller, uint8_t ch);
605 :
606 : static inline int z_impl_mspi_get_channel_status(const struct device *controller, uint8_t ch)
607 : {
608 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
609 :
610 : return api->get_channel_status(controller, ch);
611 : }
612 :
613 : /** @} */
614 :
615 : /**
616 : * @addtogroup mspi_transfer_api
617 : * @{
618 : */
619 :
620 : /**
621 : * @brief Transfer request over MSPI.
622 : *
623 : * This routines provides a generic interface to transfer a request
624 : * synchronously/asynchronously.
625 : *
626 : * The @see mspi_xfer allows for dynamically changing the transfer related
627 : * settings once the mode of operation is determined and configured.
628 : * The API supports bulk transfers with different starting addresses and sizes
629 : * with @see mspi_xfer_packet. However, it is up to the controller
630 : * implementation whether to support scatter IO and callback management.
631 : * The controller can determine which user callback to trigger based on
632 : * @see mspi_bus_event_cb_mask upon completion of each async/sync transfer
633 : * if the callback had been registered. Or not to trigger any callback at all
634 : * with MSPI_BUS_NO_CB even if the callbacks are already registered.
635 : *
636 : * @param controller Pointer to the device structure for the driver instance.
637 : * @param dev_id Pointer to the device ID structure from a device.
638 : * @param req Content of the request and request specific settings.
639 : *
640 : * @retval 0 If successful.
641 : * @retval -ENOTSUP
642 : * @retval -EIO General input / output error, failed to send over the bus.
643 : */
644 1 : __syscall int mspi_transceive(const struct device *controller,
645 : const struct mspi_dev_id *dev_id,
646 : const struct mspi_xfer *req);
647 :
648 : static inline int z_impl_mspi_transceive(const struct device *controller,
649 : const struct mspi_dev_id *dev_id,
650 : const struct mspi_xfer *req)
651 : {
652 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
653 :
654 : if (!api->transceive) {
655 : return -ENOTSUP;
656 : }
657 :
658 : return api->transceive(controller, dev_id, req);
659 : }
660 :
661 : /** @} */
662 :
663 : /**
664 : * @addtogroup mspi_configure_api
665 : * @{
666 : */
667 :
668 : /**
669 : * @brief Configure a MSPI XIP settings.
670 : *
671 : * This routine provides a generic interface to configure the XIP feature.
672 : *
673 : * @param controller Pointer to the device structure for the driver instance.
674 : * @param dev_id Pointer to the device ID structure from a device.
675 : * @param cfg The controller XIP configuration for MSPI.
676 : *
677 : * @retval 0 If successful.
678 : * @retval -EIO General input / output error, failed to configure device.
679 : * @retval -EINVAL invalid capabilities, failed to configure device.
680 : * @retval -ENOTSUP capability not supported by MSPI peripheral.
681 : */
682 1 : __syscall int mspi_xip_config(const struct device *controller,
683 : const struct mspi_dev_id *dev_id,
684 : const struct mspi_xip_cfg *cfg);
685 :
686 : static inline int z_impl_mspi_xip_config(const struct device *controller,
687 : const struct mspi_dev_id *dev_id,
688 : const struct mspi_xip_cfg *cfg)
689 : {
690 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
691 :
692 : if (!api->xip_config) {
693 : return -ENOTSUP;
694 : }
695 :
696 : return api->xip_config(controller, dev_id, cfg);
697 : }
698 :
699 : /**
700 : * @brief Configure a MSPI scrambling settings.
701 : *
702 : * This routine provides a generic interface to configure the scrambling
703 : * feature.
704 : *
705 : * @param controller Pointer to the device structure for the driver instance.
706 : * @param dev_id Pointer to the device ID structure from a device.
707 : * @param cfg The controller scramble configuration for MSPI.
708 : *
709 : * @retval 0 If successful.
710 : * @retval -EIO General input / output error, failed to configure device.
711 : * @retval -EINVAL invalid capabilities, failed to configure device.
712 : * @retval -ENOTSUP capability not supported by MSPI peripheral.
713 : */
714 1 : __syscall int mspi_scramble_config(const struct device *controller,
715 : const struct mspi_dev_id *dev_id,
716 : const struct mspi_scramble_cfg *cfg);
717 :
718 : static inline int z_impl_mspi_scramble_config(const struct device *controller,
719 : const struct mspi_dev_id *dev_id,
720 : const struct mspi_scramble_cfg *cfg)
721 : {
722 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
723 :
724 : if (!api->scramble_config) {
725 : return -ENOTSUP;
726 : }
727 :
728 : return api->scramble_config(controller, dev_id, cfg);
729 : }
730 :
731 : /**
732 : * @brief Configure a MSPI timing settings.
733 : *
734 : * This routine provides a generic interface to configure MSPI controller
735 : * timing if necessary.
736 : *
737 : * @param controller Pointer to the device structure for the driver instance.
738 : * @param dev_id Pointer to the device ID structure from a device.
739 : * @param param_mask The macro definition of what should be configured in cfg.
740 : * @param cfg The controller timing configuration for MSPI.
741 : *
742 : * @retval 0 If successful.
743 : * @retval -EIO General input / output error, failed to configure device.
744 : * @retval -EINVAL invalid capabilities, failed to configure device.
745 : * @retval -ENOTSUP capability not supported by MSPI peripheral.
746 : */
747 1 : __syscall int mspi_timing_config(const struct device *controller,
748 : const struct mspi_dev_id *dev_id,
749 : const uint32_t param_mask, void *cfg);
750 :
751 : static inline int z_impl_mspi_timing_config(const struct device *controller,
752 : const struct mspi_dev_id *dev_id,
753 : const uint32_t param_mask, void *cfg)
754 : {
755 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
756 :
757 : if (!api->timing_config) {
758 : return -ENOTSUP;
759 : }
760 :
761 : return api->timing_config(controller, dev_id, param_mask, cfg);
762 : }
763 :
764 : /** @} */
765 :
766 : /**
767 : * @addtogroup mspi_callback_api
768 : * @{
769 : */
770 :
771 : /**
772 : * @brief Register the mspi callback functions.
773 : *
774 : * This routines provides a generic interface to register mspi callback functions.
775 : * In generally it should be called before mspi_transceive.
776 : *
777 : * @param controller Pointer to the device structure for the driver instance.
778 : * @param dev_id Pointer to the device ID structure from a device.
779 : * @param evt_type The event type associated the callback.
780 : * @param cb Pointer to the user implemented callback function.
781 : * @param ctx Pointer to the callback context.
782 : *
783 : * @retval 0 If successful.
784 : * @retval -ENOTSUP
785 : */
786 1 : static inline int mspi_register_callback(const struct device *controller,
787 : const struct mspi_dev_id *dev_id,
788 : const enum mspi_bus_event evt_type,
789 : mspi_callback_handler_t cb,
790 : struct mspi_callback_context *ctx)
791 : {
792 : const struct mspi_driver_api *api = (const struct mspi_driver_api *)controller->api;
793 :
794 : if (!api->register_callback) {
795 : return -ENOTSUP;
796 : }
797 :
798 : return api->register_callback(controller, dev_id, evt_type, cb, ctx);
799 : }
800 :
801 : /** @} */
802 :
803 : #ifdef __cplusplus
804 : }
805 : #endif
806 :
807 : #include <zephyr/drivers/mspi/devicetree.h>
808 :
809 : /**
810 : * @}
811 : */
812 : #include <zephyr/syscalls/mspi.h>
813 : #endif /* ZEPHYR_INCLUDE_MSPI_H_ */
|