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