xref: /rk3399_ARM-atf/drivers/intel/soc/stratix10/io/s10_memmap_qspi.c (revision 45cc606ea7bbf8931be715a51c1819e7dd22e936)
1f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /*
2f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
3f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  *
4f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  * SPDX-License-Identifier: BSD-3-Clause
5f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  */
6f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
7f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <assert.h>
8f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <string.h>
9f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
10f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <platform_def.h>
11f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
12f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <common/debug.h>
13f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_driver.h>
14f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_memmap.h>
15f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <drivers/io/io_storage.h>
16f5ba408cSMuhammad Hadi Asyrafi Abdul Halim #include <lib/utils.h>
17f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
18bf719f66SHadi Asyrafi #include "qspi/cadence_qspi.h"
19f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
20f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* As we need to be able to keep state for seek, only one file can be open
21f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  * at a time. Make this a structure and point to the entity->info. When we
22f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  * can malloc memory we can change this to support more open files.
23f5ba408cSMuhammad Hadi Asyrafi Abdul Halim  */
24f5ba408cSMuhammad Hadi Asyrafi Abdul Halim typedef struct {
25f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Use the 'in_use' flag as any value for base and file_pos could be
26f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	 * valid.
27f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	 */
28f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	int		in_use;
29f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	uintptr_t		base;
30*70cb0bffSYann Gautier 	unsigned long long	file_pos;
31*70cb0bffSYann Gautier 	unsigned long long	size;
32f5ba408cSMuhammad Hadi Asyrafi Abdul Halim } file_state_t;
33f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
34f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static file_state_t current_file = {0};
35f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
36f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Identify the device type as memmap */
device_type_memmap(void)37f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static io_type_t device_type_memmap(void)
38f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
39f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return IO_TYPE_MEMMAP;
40f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
41f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
42f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Memmap device functions */
43f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_open(const uintptr_t dev_spec, io_dev_info_t **dev_info);
44f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
45f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			     io_entity_t *entity);
46f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_seek(io_entity_t *entity, int mode,
47*70cb0bffSYann Gautier 			     signed long long offset);
48f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_len(io_entity_t *entity, size_t *length);
49f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
50f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			     size_t length, size_t *length_read);
51f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
52f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			      size_t length, size_t *length_written);
53f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_close(io_entity_t *entity);
54f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_close(io_dev_info_t *dev_info);
55f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
56f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
57f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_connector_t memmap_dev_connector = {
58f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.dev_open = memmap_dev_open
59f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
60f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
61f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
62f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_funcs_t memmap_dev_funcs = {
63f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.type = device_type_memmap,
64f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.open = memmap_block_open,
65f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.seek = memmap_block_seek,
66f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.size = memmap_block_len,
67f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.read = memmap_block_read,
68f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.write = memmap_block_write,
69f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.close = memmap_block_close,
70f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.dev_init = NULL,
71f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.dev_close = memmap_dev_close,
72f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
73f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
74f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
75f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* No state associated with this device so structure can be const */
76f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static const io_dev_info_t memmap_dev_info = {
77f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.funcs = &memmap_dev_funcs,
78f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	.info = (uintptr_t)NULL
79f5ba408cSMuhammad Hadi Asyrafi Abdul Halim };
80f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
81f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
82f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Open a connection to the memmap device */
memmap_dev_open(const uintptr_t dev_spec __unused,io_dev_info_t ** dev_info)83f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_open(const uintptr_t dev_spec __unused,
84f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			   io_dev_info_t **dev_info)
85f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
86f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(dev_info != NULL);
87f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	*dev_info = (io_dev_info_t *)&memmap_dev_info; /* cast away const */
88f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
89f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
90f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
91f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
92f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
93f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
94f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Close a connection to the memmap device */
memmap_dev_close(io_dev_info_t * dev_info)95f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_dev_close(io_dev_info_t *dev_info)
96f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
97f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* NOP */
98f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* TODO: Consider tracking open files and cleaning them up here */
99f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
100f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
101f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
102f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
103f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Open a file on the memmap device */
memmap_block_open(io_dev_info_t * dev_info,const uintptr_t spec,io_entity_t * entity)104f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
105f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			     io_entity_t *entity)
106f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
107f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	int result = -ENOMEM;
108f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	const io_block_spec_t *block_spec = (io_block_spec_t *)spec;
109f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
110f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Since we need to track open state for seek() we only allow one open
111f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	 * spec at a time. When we have dynamic memory we can malloc and set
112f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	 * entity->info.
113f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	 */
114f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	if (current_file.in_use == 0) {
115f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		assert(block_spec != NULL);
116f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		assert(entity != NULL);
117f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
118f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		current_file.in_use = 1;
119f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		current_file.base = block_spec->offset;
120f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		/* File cursor offset for seek and incremental reads etc. */
121f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		current_file.file_pos = 0;
122f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		current_file.size = block_spec->length;
123f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		entity->info = (uintptr_t)&current_file;
124f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		result = 0;
125f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	} else {
126f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		WARN("A Memmap device is already active. Close first.\n");
127f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	}
128f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
129f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return result;
130f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
131f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
132f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
133f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Seek to a particular file offset on the memmap device */
memmap_block_seek(io_entity_t * entity,int mode,signed long long offset)134*70cb0bffSYann Gautier static int memmap_block_seek(io_entity_t *entity, int mode,
135*70cb0bffSYann Gautier 			     signed long long offset)
136f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
137f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	int result = -ENOENT;
138f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	file_state_t *fp;
139f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
140f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* We only support IO_SEEK_SET for the moment. */
141f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	if (mode == IO_SEEK_SET) {
142f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		assert(entity != NULL);
143f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
144f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		fp = (file_state_t *) entity->info;
145f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
146f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		/* Assert that new file position is valid */
147*70cb0bffSYann Gautier 		assert((offset >= 0) &&
148*70cb0bffSYann Gautier 		       ((unsigned long long)offset < fp->size));
149f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
150f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		/* Reset file position */
151f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		fp->file_pos = offset;
152f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		result = 0;
153f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	}
154f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
155f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return result;
156f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
157f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
158f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
159f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Return the size of a file on the memmap device */
memmap_block_len(io_entity_t * entity,size_t * length)160f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_len(io_entity_t *entity, size_t *length)
161f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
162f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(entity != NULL);
163f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(length != NULL);
164f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
165f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	*length = ((file_state_t *)entity->info)->size;
166f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
167f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
168f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
169f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
170f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
171f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Read data from a file on the memmap device */
memmap_block_read(io_entity_t * entity,uintptr_t buffer,size_t length,size_t * length_read)172f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
173f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			     size_t length, size_t *length_read)
174f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
175f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	file_state_t *fp;
176*70cb0bffSYann Gautier 	unsigned long long pos_after;
177f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
178f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(entity != NULL);
179f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(length_read != NULL);
180f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
181f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	fp = (file_state_t *) entity->info;
182f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
183f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Assert that file position is valid for this read operation */
184f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	pos_after = fp->file_pos + length;
185f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
186f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
187f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	//memcpy((void *)buffer, (void *)(fp->base + fp->file_pos), length);
188f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	cad_qspi_read((void *)buffer, fp->base + fp->file_pos, length);
189f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	*length_read = length;
190f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
191f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Set file position after read */
192f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	fp->file_pos = pos_after;
193f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
194f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
195f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
196f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
197f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
198f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Write data to a file on the memmap device */
memmap_block_write(io_entity_t * entity,const uintptr_t buffer,size_t length,size_t * length_written)199f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
200f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 			      size_t length, size_t *length_written)
201f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
202f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	file_state_t *fp;
203*70cb0bffSYann Gautier 	unsigned long long pos_after;
204f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
205f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(entity != NULL);
206f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(length_written != NULL);
207f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
208f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	fp = (file_state_t *) entity->info;
209f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
210f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Assert that file position is valid for this write operation */
211f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	pos_after = fp->file_pos + length;
212f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert((pos_after >= fp->file_pos) && (pos_after <= fp->size));
213f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
214f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	memcpy((void *)(fp->base + fp->file_pos), (void *)buffer, length);
215f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
216f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	*length_written = length;
217f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
218f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* Set file position after write */
219f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	fp->file_pos = pos_after;
220f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
221f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
222f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
223f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
224f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
225f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Close a file on the memmap device */
memmap_block_close(io_entity_t * entity)226f5ba408cSMuhammad Hadi Asyrafi Abdul Halim static int memmap_block_close(io_entity_t *entity)
227f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
228f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(entity != NULL);
229f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
230f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	entity->info = 0;
231f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
232f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	/* This would be a mem free() if we had malloc.*/
233f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	zeromem((void *)&current_file, sizeof(current_file));
234f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
235f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return 0;
236f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
237f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
238f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
239f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Exported functions */
240f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
241f5ba408cSMuhammad Hadi Asyrafi Abdul Halim /* Register the memmap driver with the IO abstraction */
register_io_dev_memmap(const io_dev_connector_t ** dev_con)242f5ba408cSMuhammad Hadi Asyrafi Abdul Halim int register_io_dev_memmap(const io_dev_connector_t **dev_con)
243f5ba408cSMuhammad Hadi Asyrafi Abdul Halim {
244f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	int result;
245f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
246f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	assert(dev_con != NULL);
247f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
248f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	result = io_register_device(&memmap_dev_info);
249f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	if (result == 0)
250f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 		*dev_con = &memmap_dev_connector;
251f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 
252f5ba408cSMuhammad Hadi Asyrafi Abdul Halim 	return result;
253f5ba408cSMuhammad Hadi Asyrafi Abdul Halim }
254