1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #define DT_DRV_COMPAT jedec_mspi_nor
8 
9 #include <zephyr/drivers/flash.h>
10 #include <zephyr/drivers/gpio.h>
11 #include <zephyr/drivers/mspi.h>
12 #include <zephyr/logging/log.h>
13 #include <zephyr/pm/device.h>
14 #include <zephyr/pm/device_runtime.h>
15 
16 #include "jesd216.h"
17 #include "spi_nor.h"
18 
19 LOG_MODULE_REGISTER(flash_mspi_nor, CONFIG_FLASH_LOG_LEVEL);
20 
21 #if DT_ANY_INST_HAS_PROP_STATUS_OKAY(reset_gpios)
22 #define WITH_RESET_GPIO 1
23 #endif
24 
25 struct flash_mspi_nor_data {
26 	struct k_sem acquired;
27 	struct mspi_xfer_packet packet;
28 	struct mspi_xfer xfer;
29 };
30 
31 struct flash_mspi_nor_config {
32 	const struct device *bus;
33 	uint32_t flash_size;
34 	struct mspi_dev_id mspi_id;
35 	struct mspi_dev_cfg mspi_cfg;
36 	enum mspi_dev_cfg_mask mspi_cfg_mask;
37 #if defined(CONFIG_MSPI_XIP)
38 	struct mspi_xip_cfg xip_cfg;
39 #endif
40 #if defined(WITH_RESET_GPIO)
41 	struct gpio_dt_spec reset;
42 	uint32_t reset_pulse_us;
43 	uint32_t reset_recovery_us;
44 #endif
45 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
46 	struct flash_pages_layout layout;
47 #endif
48 	uint8_t jedec_id[SPI_NOR_MAX_ID_LEN];
49 };
50 
acquire(const struct device * dev)51 static int acquire(const struct device *dev)
52 {
53 	const struct flash_mspi_nor_config *dev_config = dev->config;
54 	struct flash_mspi_nor_data *dev_data = dev->data;
55 	int rc;
56 
57 	k_sem_take(&dev_data->acquired, K_FOREVER);
58 
59 	rc = pm_device_runtime_get(dev_config->bus);
60 	if (rc < 0) {
61 		LOG_ERR("pm_device_runtime_get() failed: %d", rc);
62 	} else {
63 		/* This acquires the MSPI controller and reconfigures it
64 		 * if needed for the flash device.
65 		 */
66 		rc = mspi_dev_config(dev_config->bus, &dev_config->mspi_id,
67 				     dev_config->mspi_cfg_mask,
68 				     &dev_config->mspi_cfg);
69 		if (rc < 0) {
70 			LOG_ERR("mspi_dev_config() failed: %d", rc);
71 		} else {
72 			return 0;
73 		}
74 
75 		(void)pm_device_runtime_put(dev_config->bus);
76 	}
77 
78 	k_sem_give(&dev_data->acquired);
79 	return rc;
80 }
81 
release(const struct device * dev)82 static void release(const struct device *dev)
83 {
84 	const struct flash_mspi_nor_config *dev_config = dev->config;
85 	struct flash_mspi_nor_data *dev_data = dev->data;
86 
87 	/* This releases the MSPI controller. */
88 	(void)mspi_get_channel_status(dev_config->bus, 0);
89 
90 	(void)pm_device_runtime_put(dev_config->bus);
91 
92 	k_sem_give(&dev_data->acquired);
93 }
94 
dev_flash_size(const struct device * dev)95 static inline uint32_t dev_flash_size(const struct device *dev)
96 {
97 	const struct flash_mspi_nor_config *dev_config = dev->config;
98 
99 	return dev_config->flash_size;
100 }
101 
dev_page_size(const struct device * dev)102 static inline uint16_t dev_page_size(const struct device *dev)
103 {
104 	return SPI_NOR_PAGE_SIZE;
105 }
106 
api_read(const struct device * dev,off_t addr,void * dest,size_t size)107 static int api_read(const struct device *dev, off_t addr, void *dest,
108 		    size_t size)
109 {
110 	const struct flash_mspi_nor_config *dev_config = dev->config;
111 	struct flash_mspi_nor_data *dev_data = dev->data;
112 	const uint32_t flash_size = dev_flash_size(dev);
113 	int rc;
114 
115 	if (size == 0) {
116 		return 0;
117 	}
118 
119 	if ((addr < 0) || ((addr + size) > flash_size)) {
120 		return -EINVAL;
121 	}
122 
123 	rc = acquire(dev);
124 	if (rc < 0) {
125 		return rc;
126 	}
127 
128 	/* TODO: get rid of all these hard-coded values for MX25Ux chips */
129 	dev_data->xfer.cmd_length  = 2;
130 	dev_data->xfer.addr_length = 4;
131 	dev_data->xfer.rx_dummy    = 20;
132 	dev_data->packet.dir       = MSPI_RX;
133 	dev_data->packet.cmd       = SPI_NOR_OCMD_RD;
134 	dev_data->packet.address   = addr;
135 	dev_data->packet.data_buf  = dest;
136 	dev_data->packet.num_bytes = size;
137 	rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
138 			     &dev_data->xfer);
139 
140 	release(dev);
141 
142 	if (rc < 0) {
143 		LOG_ERR("SPI_NOR_OCMD_RD xfer failed: %d", rc);
144 		return rc;
145 	}
146 
147 	return 0;
148 }
149 
wait_until_ready(const struct device * dev,k_timeout_t poll_period)150 static int wait_until_ready(const struct device *dev, k_timeout_t poll_period)
151 {
152 	const struct flash_mspi_nor_config *dev_config = dev->config;
153 	struct flash_mspi_nor_data *dev_data = dev->data;
154 	uint8_t status_reg;
155 	int rc;
156 
157 	while (true) {
158 		dev_data->xfer.cmd_length  = 2;
159 		dev_data->xfer.addr_length = 4;
160 		dev_data->xfer.rx_dummy    = 4;
161 		dev_data->packet.dir       = MSPI_RX;
162 		dev_data->packet.cmd       = SPI_NOR_OCMD_RDSR;
163 		dev_data->packet.address   = 0;
164 		dev_data->packet.data_buf  = &status_reg;
165 		dev_data->packet.num_bytes = sizeof(status_reg);
166 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
167 				     &dev_data->xfer);
168 		if (rc < 0) {
169 			LOG_ERR("SPI_NOR_OCMD_RDSR xfer failed: %d", rc);
170 			return rc;
171 		}
172 		if (!(status_reg & SPI_NOR_WIP_BIT)) {
173 			break;
174 		}
175 
176 		k_sleep(poll_period);
177 	}
178 
179 	return 0;
180 }
181 
api_write(const struct device * dev,off_t addr,const void * src,size_t size)182 static int api_write(const struct device *dev, off_t addr, const void *src,
183 		     size_t size)
184 {
185 	const struct flash_mspi_nor_config *dev_config = dev->config;
186 	struct flash_mspi_nor_data *dev_data = dev->data;
187 	const uint32_t flash_size = dev_flash_size(dev);
188 	const uint16_t page_size = dev_page_size(dev);
189 	int rc;
190 
191 	if (size == 0) {
192 		return 0;
193 	}
194 
195 	if ((addr < 0) || ((addr + size) > flash_size)) {
196 		return -EINVAL;
197 	}
198 
199 	rc = acquire(dev);
200 	if (rc < 0) {
201 		return rc;
202 	}
203 
204 	while (size > 0) {
205 		/* Split write into parts, each within one page only. */
206 		uint16_t page_offset = (uint16_t)(addr % page_size);
207 		uint16_t page_left = page_size - page_offset;
208 		uint16_t to_write = (uint16_t)MIN(size, page_left);
209 
210 		dev_data->xfer.cmd_length  = 2;
211 		dev_data->xfer.tx_dummy    = 0;
212 		dev_data->packet.dir       = MSPI_TX;
213 
214 		dev_data->xfer.addr_length = 0;
215 		dev_data->packet.cmd       = SPI_NOR_OCMD_WREN;
216 		dev_data->packet.num_bytes = 0;
217 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
218 				     &dev_data->xfer);
219 		if (rc < 0) {
220 			LOG_ERR("SPI_NOR_OCMD_WREN xfer failed: %d", rc);
221 			break;
222 		}
223 
224 		dev_data->xfer.addr_length = 4;
225 		dev_data->packet.cmd       = SPI_NOR_OCMD_PAGE_PRG;
226 		dev_data->packet.address   = addr;
227 		dev_data->packet.data_buf  = (uint8_t *)src;
228 		dev_data->packet.num_bytes = to_write;
229 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
230 				     &dev_data->xfer);
231 		if (rc < 0) {
232 			LOG_ERR("SPI_NOR_OCMD_PAGE_PRG xfer failed: %d", rc);
233 			break;
234 		}
235 
236 		addr += to_write;
237 		src   = (const uint8_t *)src + to_write;
238 		size -= to_write;
239 
240 		rc = wait_until_ready(dev, K_MSEC(1));
241 		if (rc < 0) {
242 			break;
243 		}
244 	}
245 
246 	release(dev);
247 
248 	return rc;
249 }
250 
api_erase(const struct device * dev,off_t addr,size_t size)251 static int api_erase(const struct device *dev, off_t addr, size_t size)
252 {
253 	const struct flash_mspi_nor_config *dev_config = dev->config;
254 	struct flash_mspi_nor_data *dev_data = dev->data;
255 	const uint32_t flash_size = dev_flash_size(dev);
256 	int rc = 0;
257 
258 	if ((addr < 0) || ((addr + size) > flash_size)) {
259 		return -EINVAL;
260 	}
261 
262 	if (!SPI_NOR_IS_SECTOR_ALIGNED(addr)) {
263 		return -EINVAL;
264 	}
265 
266 	if ((size % SPI_NOR_SECTOR_SIZE) != 0) {
267 		return -EINVAL;
268 	}
269 
270 	rc = acquire(dev);
271 	if (rc < 0) {
272 		return rc;
273 	}
274 
275 	while (size > 0) {
276 		dev_data->xfer.cmd_length  = 2;
277 		dev_data->xfer.tx_dummy    = 0;
278 		dev_data->packet.dir       = MSPI_TX;
279 		dev_data->packet.num_bytes = 0;
280 
281 		dev_data->xfer.addr_length = 0;
282 		dev_data->packet.cmd       = SPI_NOR_OCMD_WREN;
283 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
284 				     &dev_data->xfer);
285 		if (rc < 0) {
286 			LOG_ERR("SPI_NOR_OCMD_WREN xfer failed: %d", rc);
287 			break;
288 		}
289 
290 		if (size == flash_size) {
291 			/* Chip erase. */
292 			dev_data->xfer.addr_length = 0;
293 			dev_data->packet.cmd       = SPI_NOR_OCMD_CE;
294 
295 			size -= flash_size;
296 		} else {
297 			/* Sector erase. */
298 			dev_data->xfer.addr_length = 4;
299 			dev_data->packet.cmd       = SPI_NOR_OCMD_SE;
300 			dev_data->packet.address   = addr;
301 
302 			addr += SPI_NOR_SECTOR_SIZE;
303 			size -= SPI_NOR_SECTOR_SIZE;
304 		}
305 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
306 				     &dev_data->xfer);
307 		if (rc < 0) {
308 			LOG_ERR("Erase command 0x%02x xfer failed: %d",
309 				dev_data->packet.cmd, rc);
310 			break;
311 		}
312 
313 		rc = wait_until_ready(dev, K_MSEC(1));
314 		if (rc < 0) {
315 			break;
316 		}
317 	}
318 
319 	release(dev);
320 
321 	return rc;
322 }
323 
324 static const
api_get_parameters(const struct device * dev)325 struct flash_parameters *api_get_parameters(const struct device *dev)
326 {
327 	ARG_UNUSED(dev);
328 
329 	static const struct flash_parameters parameters = {
330 		.write_block_size = 1,
331 		.erase_value = 0xff,
332 	};
333 
334 	return ¶meters;
335 }
336 
read_jedec_id(const struct device * dev,uint8_t * id)337 static int read_jedec_id(const struct device *dev, uint8_t *id)
338 {
339 	const struct flash_mspi_nor_config *dev_config = dev->config;
340 	struct flash_mspi_nor_data *dev_data = dev->data;
341 	int rc;
342 
343 	dev_data->xfer.cmd_length  = 2;
344 	dev_data->xfer.addr_length = 4;
345 	dev_data->xfer.rx_dummy    = 4;
346 	dev_data->packet.dir       = MSPI_RX;
347 	dev_data->packet.cmd       = JESD216_OCMD_READ_ID;
348 	dev_data->packet.address   = 0;
349 	dev_data->packet.data_buf  = id;
350 	dev_data->packet.num_bytes = JESD216_READ_ID_LEN;
351 	rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
352 			     &dev_data->xfer);
353 	if (rc < 0) {
354 		printk("mspi_transceive() failed: %d\n", rc);
355 		return rc;
356 	}
357 
358 	return rc;
359 }
360 
361 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
api_page_layout(const struct device * dev,const struct flash_pages_layout ** layout,size_t * layout_size)362 static void api_page_layout(const struct device *dev,
363 			     const struct flash_pages_layout **layout,
364 			     size_t *layout_size)
365 {
366 	const struct flash_mspi_nor_config *dev_config = dev->config;
367 
368 	*layout = &dev_config->layout;
369 	*layout_size = 1;
370 }
371 #endif /* CONFIG_FLASH_PAGE_LAYOUT */
372 
373 #if defined(CONFIG_FLASH_JESD216_API)
api_sfdp_read(const struct device * dev,off_t addr,void * dest,size_t size)374 static int api_sfdp_read(const struct device *dev, off_t addr, void *dest,
375 			 size_t size)
376 {
377 	const struct flash_mspi_nor_config *dev_config = dev->config;
378 	struct flash_mspi_nor_data *dev_data = dev->data;
379 	int rc;
380 
381 	if (size == 0) {
382 		return 0;
383 	}
384 
385 	rc = acquire(dev);
386 	if (rc < 0) {
387 		return rc;
388 	}
389 
390 	dev_data->xfer.cmd_length  = 2;
391 	dev_data->xfer.addr_length = 4;
392 	dev_data->xfer.rx_dummy    = 20;
393 	dev_data->packet.dir       = MSPI_RX;
394 	dev_data->packet.cmd       = JESD216_OCMD_READ_SFDP;
395 	dev_data->packet.address   = addr;
396 	dev_data->packet.data_buf  = dest;
397 	dev_data->packet.num_bytes = size;
398 	rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
399 			     &dev_data->xfer);
400 	if (rc < 0) {
401 		printk("JESD216_OCMD_READ_SFDP xfer failed: %d\n", rc);
402 		return rc;
403 	}
404 
405 	release(dev);
406 
407 	return rc;
408 }
409 
api_read_jedec_id(const struct device * dev,uint8_t * id)410 static int api_read_jedec_id(const struct device *dev, uint8_t *id)
411 {
412 	int rc = 0;
413 
414 	rc = acquire(dev);
415 	if (rc < 0) {
416 		return rc;
417 	}
418 
419 	rc = read_jedec_id(dev, id);
420 
421 	release(dev);
422 
423 	return rc;
424 }
425 #endif /* CONFIG_FLASH_JESD216_API  */
426 
dev_pm_action_cb(const struct device * dev,enum pm_device_action action)427 static int dev_pm_action_cb(const struct device *dev,
428 			    enum pm_device_action action)
429 {
430 	switch (action) {
431 	case PM_DEVICE_ACTION_SUSPEND:
432 		break;
433 	case PM_DEVICE_ACTION_RESUME:
434 		break;
435 	default:
436 		return -ENOTSUP;
437 	}
438 
439 	return 0;
440 }
441 
flash_chip_init(const struct device * dev)442 static int flash_chip_init(const struct device *dev)
443 {
444 	const struct flash_mspi_nor_config *dev_config = dev->config;
445 	struct flash_mspi_nor_data *dev_data = dev->data;
446 	struct mspi_dev_cfg init_dev_cfg = dev_config->mspi_cfg;
447 	uint8_t id[JESD216_READ_ID_LEN] = {0};
448 	int rc;
449 
450 	init_dev_cfg.freq = MHZ(1);
451 	init_dev_cfg.io_mode = MSPI_IO_MODE_SINGLE;
452 
453 	rc = mspi_dev_config(dev_config->bus, &dev_config->mspi_id,
454 			     MSPI_DEVICE_CONFIG_ALL, &init_dev_cfg);
455 	if (rc < 0) {
456 		LOG_ERR("Failed to set initial device config: %d", rc);
457 		return rc;
458 	}
459 
460 	dev_data->xfer.xfer_mode  = MSPI_PIO;
461 	dev_data->xfer.packets    = &dev_data->packet;
462 	dev_data->xfer.num_packet = 1;
463 	dev_data->xfer.timeout    = 10;
464 
465 	dev_data->xfer.cmd_length  = 1;
466 	dev_data->xfer.addr_length = 0;
467 	dev_data->xfer.tx_dummy    = 0;
468 	dev_data->xfer.rx_dummy    = 0;
469 
470 	dev_data->packet.dir       = MSPI_RX;
471 	dev_data->packet.cmd       = JESD216_CMD_READ_ID;
472 	dev_data->packet.data_buf  = id;
473 	dev_data->packet.num_bytes = sizeof(id);
474 	rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
475 			     &dev_data->xfer);
476 	if (rc < 0) {
477 		LOG_ERR("Failed to read JEDEC ID in single line mode: %d", rc);
478 		return rc;
479 	}
480 
481 	/*
482 	 * If the read ID does not match the one from DTS, assume the flash
483 	 * is already in the Octa I/O mode, so switching it is not needed.
484 	 */
485 	if (memcmp(id, dev_config->jedec_id, sizeof(id)) == 0) {
486 		static const uint8_t enable_sopi[] = { 0x01 };
487 
488 		dev_data->packet.dir       = MSPI_TX;
489 		dev_data->packet.cmd       = SPI_NOR_CMD_WREN;
490 		dev_data->packet.num_bytes = 0;
491 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
492 				     &dev_data->xfer);
493 		if (rc < 0) {
494 			LOG_ERR("SPI_NOR_CMD_WREN xfer failed: %d", rc);
495 			return rc;
496 		}
497 
498 		dev_data->xfer.addr_length = 4;
499 		dev_data->packet.cmd       = SPI_NOR_CMD_WR_CFGREG2;
500 		dev_data->packet.address   = 0;
501 		dev_data->packet.data_buf  = (uint8_t *)&enable_sopi;
502 		dev_data->packet.num_bytes = sizeof(enable_sopi);
503 		rc = mspi_transceive(dev_config->bus, &dev_config->mspi_id,
504 				     &dev_data->xfer);
505 		if (rc < 0) {
506 			printk("SPI_NOR_CMD_WR_CFGREG2 xfer failed: %d\n", rc);
507 			return rc;
508 		}
509 	}
510 
511 	rc = mspi_dev_config(dev_config->bus, &dev_config->mspi_id,
512 			     MSPI_DEVICE_CONFIG_ALL, &dev_config->mspi_cfg);
513 	if (rc < 0) {
514 		LOG_ERR("Failed to set device config: %d", rc);
515 		return rc;
516 	}
517 
518 	rc = read_jedec_id(dev, id);
519 	if (rc < 0) {
520 		return rc;
521 	}
522 
523 	if (memcmp(id, dev_config->jedec_id, sizeof(id)) != 0) {
524 		LOG_ERR("JEDEC ID mismatch, read: %02x %02x %02x, "
525 			"expected: %02x %02x %02x",
526 			id[0], id[1], id[2],
527 			dev_config->jedec_id[0],
528 			dev_config->jedec_id[1],
529 			dev_config->jedec_id[2]);
530 		return -ENODEV;
531 	}
532 
533 #if defined(CONFIG_MSPI_XIP)
534 	/* Enable XIP access for this chip if specified so in DT. */
535 	if (dev_config->xip_cfg.enable) {
536 		rc = mspi_xip_config(dev_config->bus, &dev_config->mspi_id,
537 				     &dev_config->xip_cfg);
538 		if (rc < 0) {
539 			return rc;
540 		}
541 	}
542 #endif
543 
544 	return 0;
545 }
546 
drv_init(const struct device * dev)547 static int drv_init(const struct device *dev)
548 {
549 	const struct flash_mspi_nor_config *dev_config = dev->config;
550 	struct flash_mspi_nor_data *dev_data = dev->data;
551 	int rc;
552 
553 	if (!device_is_ready(dev_config->bus)) {
554 		LOG_ERR("Device %s is not ready", dev_config->bus->name);
555 		return -ENODEV;
556 	}
557 
558 #if defined(WITH_RESET_GPIO)
559 	if (dev_config->reset.port) {
560 		if (!gpio_is_ready_dt(&dev_config->reset)) {
561 			LOG_ERR("Device %s is not ready",
562 				dev_config->reset.port->name);
563 			return -ENODEV;
564 		}
565 
566 		rc = gpio_pin_configure_dt(&dev_config->reset,
567 					   GPIO_OUTPUT_ACTIVE);
568 		if (rc < 0) {
569 			LOG_ERR("Failed to activate RESET: %d", rc);
570 			return -EIO;
571 		}
572 
573 		if (dev_config->reset_pulse_us != 0) {
574 			k_busy_wait(dev_config->reset_pulse_us);
575 		}
576 
577 		rc = gpio_pin_set_dt(&dev_config->reset, 0);
578 		if (rc < 0) {
579 			LOG_ERR("Failed to deactivate RESET: %d", rc);
580 			return -EIO;
581 		}
582 
583 		if (dev_config->reset_recovery_us != 0) {
584 			k_busy_wait(dev_config->reset_recovery_us);
585 		}
586 	}
587 #endif
588 
589 	rc = pm_device_runtime_get(dev_config->bus);
590 	if (rc < 0) {
591 		LOG_ERR("pm_device_runtime_get() failed: %d", rc);
592 		return rc;
593 	}
594 
595 	rc = flash_chip_init(dev);
596 
597 	/* Release the MSPI controller - it was acquired by the call to
598 	 * mspi_dev_config() in flash_chip_init().
599 	 */
600 	(void)mspi_get_channel_status(dev_config->bus, 0);
601 
602 	(void)pm_device_runtime_put(dev_config->bus);
603 
604 	if (rc < 0) {
605 		return rc;
606 	}
607 
608 	k_sem_init(&dev_data->acquired, 1, K_SEM_MAX_LIMIT);
609 
610 	return pm_device_driver_init(dev, dev_pm_action_cb);
611 }
612 
613 static DEVICE_API(flash, drv_api) = {
614 	.read = api_read,
615 	.write = api_write,
616 	.erase = api_erase,
617 	.get_parameters = api_get_parameters,
618 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
619 	.page_layout = api_page_layout,
620 #endif
621 #if defined(CONFIG_FLASH_JESD216_API)
622 	.sfdp_read = api_sfdp_read,
623 	.read_jedec_id = api_read_jedec_id,
624 #endif
625 };
626 
627 #define FLASH_SIZE_INST(inst) (DT_INST_PROP(inst, size) / 8)
628 
629 #if defined(CONFIG_FLASH_PAGE_LAYOUT)
630 BUILD_ASSERT((CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE % 4096) == 0,
631 	"MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE must be multiple of 4096");
632 #define FLASH_PAGE_LAYOUT_DEFINE(inst) \
633 	.layout = { \
634 		.pages_size = CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
635 		.pages_count = FLASH_SIZE_INST(inst) \
636 			     / CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE, \
637 	},
638 #define FLASH_PAGE_LAYOUT_CHECK(inst) \
639 BUILD_ASSERT((FLASH_SIZE_INST(inst) % CONFIG_FLASH_MSPI_NOR_LAYOUT_PAGE_SIZE) == 0, \
640 	"MSPI_NOR_FLASH_LAYOUT_PAGE_SIZE incompatible with flash size, instance " #inst);
641 #else
642 #define FLASH_PAGE_LAYOUT_DEFINE(inst)
643 #define FLASH_PAGE_LAYOUT_CHECK(inst)
644 #endif
645 
646 /* MSPI bus must be initialized before this device. */
647 #if (CONFIG_MSPI_INIT_PRIORITY < CONFIG_FLASH_INIT_PRIORITY)
648 #define INIT_PRIORITY CONFIG_FLASH_INIT_PRIORITY
649 #else
650 #define INIT_PRIORITY UTIL_INC(CONFIG_MSPI_INIT_PRIORITY)
651 #endif
652 
653 #define FLASH_MSPI_NOR_INST(inst)						\
654 	BUILD_ASSERT(DT_INST_ENUM_IDX(inst, mspi_io_mode) ==			\
655 		     MSPI_IO_MODE_OCTAL,					\
656 		"Only Octal I/O mode is supported for now");			\
657 	PM_DEVICE_DT_INST_DEFINE(inst, dev_pm_action_cb);			\
658 	static struct flash_mspi_nor_data dev##inst##_data;			\
659 	static const struct flash_mspi_nor_config dev##inst##_config = {	\
660 		.bus = DEVICE_DT_GET(DT_INST_BUS(inst)),			\
661 		.flash_size = FLASH_SIZE_INST(inst),				\
662 		.mspi_id = MSPI_DEVICE_ID_DT_INST(inst),			\
663 		.mspi_cfg = MSPI_DEVICE_CONFIG_DT_INST(inst),			\
664 		.mspi_cfg_mask = DT_PROP(DT_INST_BUS(inst),			\
665 					 software_multiperipheral)		\
666 			       ? MSPI_DEVICE_CONFIG_ALL				\
667 			       : MSPI_DEVICE_CONFIG_NONE,			\
668 	IF_ENABLED(CONFIG_MSPI_XIP,						\
669 		(.xip_cfg = MSPI_XIP_CONFIG_DT_INST(inst),))			\
670 	IF_ENABLED(WITH_RESET_GPIO,						\
671 		(.reset = GPIO_DT_SPEC_INST_GET_OR(inst, reset_gpios, {0}),	\
672 		.reset_pulse_us = DT_INST_PROP_OR(inst, t_reset_pulse, 0)	\
673 				/ 1000,						\
674 		.reset_recovery_us = DT_INST_PROP_OR(inst, t_reset_recovery, 0)	\
675 				   / 1000,))					\
676 		FLASH_PAGE_LAYOUT_DEFINE(inst)					\
677 		.jedec_id = DT_INST_PROP(inst, jedec_id),			\
678 	};									\
679 	FLASH_PAGE_LAYOUT_CHECK(inst)						\
680 	DEVICE_DT_INST_DEFINE(inst,						\
681 		drv_init, PM_DEVICE_DT_INST_GET(inst),				\
682 		&dev##inst##_data, &dev##inst##_config,				\
683 		POST_KERNEL, INIT_PRIORITY,					\
684 		&drv_api);
685 
686 DT_INST_FOREACH_STATUS_OKAY(FLASH_MSPI_NOR_INST)
687