/* * 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_ */