1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2022, Microchip 4 */ 5 6 #include <drivers/gpio.h> 7 #include <libfdt.h> 8 #include <stdio.h> 9 #include <tee_api_defines.h> 10 #include <tee_api_types.h> 11 #include <util.h> 12 13 TEE_Result gpio_dt_alloc_pin(struct dt_pargs *pargs, struct gpio **out_gpio) 14 { 15 struct gpio *gpio = NULL; 16 17 if (pargs->args_count != 2) 18 return TEE_ERROR_BAD_PARAMETERS; 19 20 gpio = calloc(1, sizeof(struct gpio)); 21 if (!gpio) 22 return TEE_ERROR_OUT_OF_MEMORY; 23 24 gpio->pin = pargs->args[0]; 25 gpio->dt_flags = pargs->args[1]; 26 27 *out_gpio = gpio; 28 29 return TEE_SUCCESS; 30 } 31 32 static char *gpio_get_dt_prop_name(const char *gpio_name) 33 { 34 int ret = 0; 35 char *prop_name = NULL; 36 size_t max_len = strlen(gpio_name) + strlen("-gpios") + 1; 37 38 prop_name = calloc(1, max_len); 39 if (!prop_name) 40 return NULL; 41 42 ret = snprintf(prop_name, max_len, "%s-gpios", gpio_name); 43 if (ret < 0 || (size_t)ret >= max_len) { 44 free(prop_name); 45 return NULL; 46 } 47 48 return prop_name; 49 } 50 51 TEE_Result gpio_dt_get_by_index(const void *fdt, int nodeoffset, 52 unsigned int index, const char *gpio_name, 53 struct gpio **gpio) 54 { 55 TEE_Result res = TEE_ERROR_GENERIC; 56 char *prop_name = NULL; 57 void *out_gpio = NULL; 58 59 prop_name = gpio_get_dt_prop_name(gpio_name); 60 if (!prop_name) 61 return TEE_ERROR_OUT_OF_MEMORY; 62 63 res = dt_driver_device_from_node_idx_prop(prop_name, fdt, nodeoffset, 64 index, DT_DRIVER_GPIO, 65 &out_gpio); 66 free(prop_name); 67 if (!res) 68 *gpio = out_gpio; 69 70 return res; 71 } 72