1b114abb6SLionel Debieve /* 2*9a9ea829SLionel Debieve * Copyright (c) 2019-2021, ARM Limited and Contributors. All rights reserved. 3b114abb6SLionel Debieve * 4b114abb6SLionel Debieve * SPDX-License-Identifier: BSD-3-Clause 5b114abb6SLionel Debieve */ 6b114abb6SLionel Debieve 7b114abb6SLionel Debieve #ifndef IO_MTD_H 8b114abb6SLionel Debieve #define IO_MTD_H 9b114abb6SLionel Debieve 10b114abb6SLionel Debieve #include <stdint.h> 11b114abb6SLionel Debieve #include <stdio.h> 12b114abb6SLionel Debieve 13b114abb6SLionel Debieve #include <drivers/io/io_storage.h> 14b114abb6SLionel Debieve 15b114abb6SLionel Debieve /* MTD devices ops */ 16b114abb6SLionel Debieve typedef struct io_mtd_ops { 17b114abb6SLionel Debieve /* 18b114abb6SLionel Debieve * Initialize MTD framework and retrieve device information. 19b114abb6SLionel Debieve * 20b114abb6SLionel Debieve * @size: [out] MTD device size in bytes. 21b114abb6SLionel Debieve * @erase_size: [out] MTD erase size in bytes. 22b114abb6SLionel Debieve * Return 0 on success, a negative error code otherwise. 23b114abb6SLionel Debieve */ 24b114abb6SLionel Debieve int (*init)(unsigned long long *size, unsigned int *erase_size); 25b114abb6SLionel Debieve 26b114abb6SLionel Debieve /* 27b114abb6SLionel Debieve * Execute a read memory operation. 28b114abb6SLionel Debieve * 29b114abb6SLionel Debieve * @offset: Offset in bytes to start read operation. 30b114abb6SLionel Debieve * @buffer: [out] Buffer to store read data. 31b114abb6SLionel Debieve * @length: Required length to be read in bytes. 32b114abb6SLionel Debieve * @out_length: [out] Length read in bytes. 33b114abb6SLionel Debieve * Return 0 on success, a negative error code otherwise. 34b114abb6SLionel Debieve */ 35b114abb6SLionel Debieve int (*read)(unsigned int offset, uintptr_t buffer, size_t length, 36b114abb6SLionel Debieve size_t *out_length); 37b114abb6SLionel Debieve 38b114abb6SLionel Debieve /* 39b114abb6SLionel Debieve * Execute a write memory operation. 40b114abb6SLionel Debieve * 41b114abb6SLionel Debieve * @offset: Offset in bytes to start write operation. 42b114abb6SLionel Debieve * @buffer: Buffer to be written in device. 43b114abb6SLionel Debieve * @length: Required length to be written in bytes. 44b114abb6SLionel Debieve * Return 0 on success, a negative error code otherwise. 45b114abb6SLionel Debieve */ 46b114abb6SLionel Debieve int (*write)(unsigned int offset, uintptr_t buffer, size_t length); 47*9a9ea829SLionel Debieve 48*9a9ea829SLionel Debieve /* 49*9a9ea829SLionel Debieve * Look for an offset to be added to the given offset. 50*9a9ea829SLionel Debieve * 51*9a9ea829SLionel Debieve * @base: Base address of the area. 52*9a9ea829SLionel Debieve * @offset: Offset in bytes to start read operation. 53*9a9ea829SLionel Debieve * @extra_offset: [out] Offset to be added to the previous offset. 54*9a9ea829SLionel Debieve * Return 0 on success, a negative error code otherwise. 55*9a9ea829SLionel Debieve */ 56*9a9ea829SLionel Debieve int (*seek)(uintptr_t base, unsigned int offset, size_t *extra_offset); 57b114abb6SLionel Debieve } io_mtd_ops_t; 58b114abb6SLionel Debieve 59b114abb6SLionel Debieve typedef struct io_mtd_dev_spec { 60b114abb6SLionel Debieve unsigned long long device_size; 61b114abb6SLionel Debieve unsigned int erase_size; 62*9a9ea829SLionel Debieve size_t offset; 63b114abb6SLionel Debieve io_mtd_ops_t ops; 64b114abb6SLionel Debieve } io_mtd_dev_spec_t; 65b114abb6SLionel Debieve 66b114abb6SLionel Debieve struct io_dev_connector; 67b114abb6SLionel Debieve 68b114abb6SLionel Debieve int register_io_dev_mtd(const struct io_dev_connector **dev_con); 69b114abb6SLionel Debieve 70b114abb6SLionel Debieve #endif /* IO_MTD_H */ 71