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