xref: /optee_os/core/drivers/i2c/i2c.c (revision 8bc9c9e22aca4d69ffb2f3e46ba6bb1f80726261)
1*8bc9c9e2SClément Léger // SPDX-License-Identifier: BSD-2-Clause
2*8bc9c9e2SClément Léger /*
3*8bc9c9e2SClément Léger  * Copyright 2023 Microchip
4*8bc9c9e2SClément Léger  */
5*8bc9c9e2SClément Léger 
6*8bc9c9e2SClément Léger #include <drivers/i2c.h>
7*8bc9c9e2SClément Léger #include <kernel/dt.h>
8*8bc9c9e2SClément Léger #include <kernel/dt_driver.h>
9*8bc9c9e2SClément Léger #include <libfdt.h>
10*8bc9c9e2SClément Léger #include <malloc.h>
11*8bc9c9e2SClément Léger #include <tee_api_defines_extensions.h>
12*8bc9c9e2SClément Léger #include <tee_api_types.h>
13*8bc9c9e2SClément Léger #include <trace.h>
14*8bc9c9e2SClément Léger #include <types_ext.h>
15*8bc9c9e2SClément Léger 
16*8bc9c9e2SClément Léger struct i2c_dev *i2c_create_dev(struct i2c_ctrl *i2c_ctrl, const void *fdt,
17*8bc9c9e2SClément Léger 			       int node)
18*8bc9c9e2SClément Léger {
19*8bc9c9e2SClément Léger 	struct i2c_dev *i2c_dev = NULL;
20*8bc9c9e2SClément Léger 	paddr_t addr = _fdt_reg_base_address(fdt, node);
21*8bc9c9e2SClément Léger 
22*8bc9c9e2SClément Léger 	if (addr == DT_INFO_INVALID_REG)
23*8bc9c9e2SClément Léger 		return NULL;
24*8bc9c9e2SClément Léger 
25*8bc9c9e2SClément Léger 	i2c_dev = calloc(1, sizeof(struct i2c_dev));
26*8bc9c9e2SClément Léger 	if (!i2c_dev)
27*8bc9c9e2SClément Léger 		return NULL;
28*8bc9c9e2SClément Léger 
29*8bc9c9e2SClément Léger 	i2c_dev->addr = addr;
30*8bc9c9e2SClément Léger 	i2c_dev->ctrl = i2c_ctrl;
31*8bc9c9e2SClément Léger 
32*8bc9c9e2SClément Léger 	return i2c_dev;
33*8bc9c9e2SClément Léger }
34