|  | /* | 
|  | * Copyright 2023-2024 NXP | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_DRIVERS_FLASH_NXP_S32_QSPI_H_ | 
|  | #define ZEPHYR_DRIVERS_FLASH_NXP_S32_QSPI_H_ | 
|  |  | 
|  | #include "jesd216.h" | 
|  |  | 
|  | #define QSPI_ERASE_VALUE 0xff | 
|  |  | 
|  | #define QSPI_IS_ALIGNED(addr, bits) (((addr) & BIT_MASK(bits)) == 0) | 
|  |  | 
|  | #if defined(CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME) | 
|  | /* Size of LUT */ | 
|  | #define QSPI_SFDP_LUT_SIZE     130U | 
|  | /* Size of init operations */ | 
|  | #define QSPI_SFDP_INIT_OP_SIZE 8U | 
|  | #if defined(CONFIG_FLASH_JESD216_API) | 
|  | /* Size of all LUT sequences for JESD216 operations */ | 
|  | #define QSPI_JESD216_SEQ_SIZE 8U | 
|  | #endif /* CONFIG_FLASH_JESD216_API */ | 
|  | #endif /* CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME */ | 
|  |  | 
|  | struct nxp_s32_qspi_config { | 
|  | const struct device *controller; | 
|  | struct flash_parameters flash_parameters; | 
|  | #if defined(CONFIG_FLASH_PAGE_LAYOUT) | 
|  | struct flash_pages_layout layout; | 
|  | #endif | 
|  | #if !defined(CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME) | 
|  | const Qspi_Ip_MemoryConfigType memory_cfg; | 
|  | enum jesd216_dw15_qer_type qer_type; | 
|  | bool quad_mode; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | struct nxp_s32_qspi_data { | 
|  | uint8_t instance; | 
|  | Qspi_Ip_MemoryConnectionType memory_conn_cfg; | 
|  | uint8_t read_sfdp_lut_idx; | 
|  | #if defined(CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME) | 
|  | Qspi_Ip_MemoryConfigType memory_cfg; | 
|  | Qspi_Ip_InstrOpType lut_ops[QSPI_SFDP_LUT_SIZE]; | 
|  | Qspi_Ip_InitOperationType init_ops[QSPI_SFDP_INIT_OP_SIZE]; | 
|  | #endif | 
|  | #if defined(CONFIG_MULTITHREADING) | 
|  | struct k_sem sem; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | static ALWAYS_INLINE Qspi_Ip_MemoryConfigType *get_memory_config(const struct device *dev) | 
|  | { | 
|  | #if defined(CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME) | 
|  | return &((struct nxp_s32_qspi_data *)dev->data)->memory_cfg; | 
|  | #else | 
|  | return ((Qspi_Ip_MemoryConfigType *)&((const struct nxp_s32_qspi_config *)dev->config) | 
|  | ->memory_cfg); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | static inline void nxp_s32_qspi_lock(const struct device *dev) | 
|  | { | 
|  | #ifdef CONFIG_MULTITHREADING | 
|  | struct nxp_s32_qspi_data *data = dev->data; | 
|  |  | 
|  | k_sem_take(&data->sem, K_FOREVER); | 
|  | #else | 
|  | ARG_UNUSED(dev); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | static inline void nxp_s32_qspi_unlock(const struct device *dev) | 
|  | { | 
|  | #ifdef CONFIG_MULTITHREADING | 
|  | struct nxp_s32_qspi_data *data = dev->data; | 
|  |  | 
|  | k_sem_give(&data->sem); | 
|  | #else | 
|  | ARG_UNUSED(dev); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /* | 
|  | * This function retrieves the device instance used by the HAL | 
|  | * to access the internal driver state. | 
|  | */ | 
|  | uint8_t nxp_s32_qspi_register_device(void); | 
|  |  | 
|  | int nxp_s32_qspi_wait_until_ready(const struct device *dev); | 
|  |  | 
|  | int nxp_s32_qspi_read(const struct device *dev, off_t offset, void *dest, size_t size); | 
|  |  | 
|  | int nxp_s32_qspi_write(const struct device *dev, off_t offset, const void *src, size_t size); | 
|  |  | 
|  | int nxp_s32_qspi_erase(const struct device *dev, off_t offset, size_t size); | 
|  |  | 
|  | const struct flash_parameters *nxp_s32_qspi_get_parameters(const struct device *dev); | 
|  |  | 
|  | #if defined(CONFIG_FLASH_PAGE_LAYOUT) | 
|  | void nxp_s32_qspi_pages_layout(const struct device *dev, const struct flash_pages_layout **layout, | 
|  | size_t *layout_size); | 
|  | #endif /* CONFIG_FLASH_PAGE_LAYOUT */ | 
|  |  | 
|  | #if defined(CONFIG_FLASH_JESD216_API) || !defined(CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME) | 
|  | int nxp_s32_qspi_read_id(const struct device *dev, uint8_t *id); | 
|  | #endif /* CONFIG_FLASH_JESD216_API || !CONFIG_FLASH_NXP_S32_QSPI_SFDP_RUNTIME */ | 
|  |  | 
|  | #endif /* ZEPHYR_DRIVERS_FLASH_NXP_S32_QSPI_H_ */ |