1 /*
2 * Copyright 2021 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #include <common/debug.h>
9 #include <lib/mmio.h>
10 #include <nxp_gpio.h>
11
12 static gpio_init_info_t *gpio_init_info;
13
gpio_init(gpio_init_info_t * gpio_init_data)14 void gpio_init(gpio_init_info_t *gpio_init_data)
15 {
16 gpio_init_info = gpio_init_data;
17 }
18
19 /* This function set GPIO pin for raising POVDD. */
set_gpio_bit(uint32_t * gpio_base_addr,uint32_t bit_num)20 int set_gpio_bit(uint32_t *gpio_base_addr,
21 uint32_t bit_num)
22 {
23 uint32_t val = 0U;
24 uint32_t *gpdir = NULL;
25 uint32_t *gpdat = NULL;
26
27 if (gpio_init_info == NULL) {
28 ERROR("GPIO is not initialized.\n");
29 return GPIO_FAILURE;
30 }
31
32 gpdir = gpio_base_addr + GPDIR_REG_OFFSET;
33 gpdat = gpio_base_addr + (GPDAT_REG_OFFSET >> 2);
34
35 /*
36 * Set the corresponding bit in direction register
37 * to configure the GPIO as output.
38 */
39 val = gpio_read32(gpdir);
40 val = val | bit_num;
41 gpio_write32(gpdir, val);
42
43 /* Set the corresponding bit in GPIO data register */
44 val = gpio_read32(gpdat);
45 val = val | bit_num;
46 gpio_write32(gpdat, val);
47
48 val = gpio_read32(gpdat);
49
50 if ((val & bit_num) == 0U) {
51 return GPIO_FAILURE;
52 }
53
54 return GPIO_SUCCESS;
55 }
56
57 /* This function reset GPIO pin set for raising POVDD. */
clr_gpio_bit(uint32_t * gpio_base_addr,uint32_t bit_num)58 int clr_gpio_bit(uint32_t *gpio_base_addr, uint32_t bit_num)
59 {
60 uint32_t val = 0U;
61 uint32_t *gpdir = NULL;
62 uint32_t *gpdat = NULL;
63
64
65 if (gpio_init_info == NULL) {
66 ERROR("GPIO is not initialized.\n");
67 return GPIO_FAILURE;
68 }
69
70 gpdir = gpio_base_addr + GPDIR_REG_OFFSET;
71 gpdat = gpio_base_addr + GPDAT_REG_OFFSET;
72
73 /*
74 * Reset the corresponding bit in direction and data register
75 * to configure the GPIO as input.
76 */
77 val = gpio_read32(gpdat);
78 val = val & ~(bit_num);
79 gpio_write32(gpdat, val);
80
81 val = gpio_read32(gpdat);
82
83 val = gpio_read32(gpdir);
84 val = val & ~(bit_num);
85 gpio_write32(gpdir, val);
86
87 val = gpio_read32(gpdat);
88
89 if ((val & bit_num) != 0U) {
90 return GPIO_FAILURE;
91 }
92
93 return GPIO_SUCCESS;
94 }
95
select_gpio_n_bitnum(uint32_t povdd_gpio,uint32_t * bit_num)96 uint32_t *select_gpio_n_bitnum(uint32_t povdd_gpio, uint32_t *bit_num)
97 {
98 uint32_t *ret_gpio;
99 uint32_t povdd_gpio_val = 0U;
100 uint32_t gpio_num = 0U;
101
102 if (gpio_init_info == NULL) {
103 ERROR("GPIO is not initialized.\n");
104 }
105 /*
106 * Subtract 1 from fuse_hdr povdd_gpio value as
107 * for 0x1 value, bit 0 is to be set
108 * for 0x20 value i.e 32, bit 31 i.e. 0x1f is to be set.
109 * 0x1f - 0x00 : GPIO_1
110 * 0x3f - 0x20 : GPIO_2
111 * 0x5f - 0x40 : GPIO_3
112 * 0x7f - 0x60 : GPIO_4
113 */
114 povdd_gpio_val = (povdd_gpio - 1U) & GPIO_SEL_MASK;
115
116 /* Right shift by 5 to divide by 32 */
117 gpio_num = povdd_gpio_val >> GPIO_ID_BASE_ADDR_SHIFT;
118 *bit_num = 1U << (GPIO_BITS_PER_BASE_REG
119 - (povdd_gpio_val & GPIO_BIT_MASK)
120 - 1U);
121
122 switch (gpio_num) {
123 case GPIO_0:
124 ret_gpio = (uint32_t *) gpio_init_info->gpio1_base_addr;
125 break;
126 case GPIO_1:
127 ret_gpio = (uint32_t *) gpio_init_info->gpio2_base_addr;
128 break;
129 case GPIO_2:
130 ret_gpio = (uint32_t *) gpio_init_info->gpio3_base_addr;
131 break;
132 case GPIO_3:
133 ret_gpio = (uint32_t *) gpio_init_info->gpio4_base_addr;
134 break;
135 default:
136 ret_gpio = NULL;
137 }
138
139 if (ret_gpio == NULL) {
140 INFO("GPIO_NUM = %d doesn't exist.\n", gpio_num);
141 }
142
143 return ret_gpio;
144 }
145