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
amd_gpio_get_bank_and_pin(struct amd_gbank_data * bdata,uint32_t gpio,uint32_t * bank,uint32_t * pin)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
amd_gpio_get_dt(struct dt_pargs * pargs,void * data,struct gpio ** out_gpio)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