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