xref: /rk3399_ARM-atf/include/drivers/io/io_mtd.h (revision e528bc22ebb7cf66fa79250514bdac519b2b1c61)
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