xref: /optee_os/core/drivers/amd/gpio_common.c (revision 82a84a88ae5cc840ad50ef088beaa416b1e86a2c)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (C) 2002-2021 Xilinx, Inc.  All rights reserved.
4  * Copyright (c) 2022 Foundries.io Ltd. (jorge@foundries.io)
5  * Copyright (c) 2024-2025, Advanced Micro Devices, Inc. All rights reserved.
6  *
7  */
8 
9 #include <assert.h>
10 #include <kernel/panic.h>
11 #include <malloc.h>
12 #include <trace.h>
13 
14 #include "gpio_private.h"
15 
16 void amd_gpio_get_bank_and_pin(struct amd_gbank_data *bdata, uint32_t gpio,
17 			       uint32_t *bank, uint32_t *pin)
18 {
19 	uint32_t i = 0;
20 
21 	assert(gpio < bdata->ngpio);
22 
23 	for (i = 0; i < bdata->max_bank; i++) {
24 		if (gpio >= bdata->bank_min[i] &&
25 		    gpio <= bdata->bank_max[i]) {
26 			*bank = i;
27 			*pin = gpio - bdata->bank_min[i];
28 			return;
29 		}
30 	}
31 
32 	/* Ideally, should never reach over here */
33 	EMSG("Invalid GPIO pin number: %"PRIu32, gpio);
34 	panic();
35 }
36 
37 TEE_Result amd_gpio_get_dt(struct dt_pargs *pargs, void *data,
38 			   struct gpio **out_gpio)
39 {
40 	TEE_Result res = TEE_ERROR_GENERIC;
41 	struct amd_gpio_info *amd = (struct amd_gpio_info *)data;
42 	struct gpio *gpio = NULL;
43 
44 	res = gpio_dt_alloc_pin(pargs, &gpio);
45 	if (res)
46 		return res;
47 
48 	if (gpio->pin >= amd->bdata->ngpio) {
49 		DMSG("GPIO is outside of GPIO Range");
50 		free(gpio);
51 		return TEE_ERROR_GENERIC;
52 	}
53 
54 	gpio->chip = &amd->chip;
55 	*out_gpio = gpio;
56 
57 	return TEE_SUCCESS;
58 }
59