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