1 /*
2  * Copyright 2012-15 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #ifndef __DAL_GPIO_TYPES_H__
27 #define __DAL_GPIO_TYPES_H__
28 
29 #define BUNDLE_A_MASK 0x00FFF000L
30 #define BUNDLE_B_MASK 0x00000FFFL
31 
32 /*
33  * gpio_result
34  *
35  * @brief
36  * The possible return codes that the GPIO object can return.
37  * These return codes can be generated
38  * directly by the GPIO object or from the GPIOPin object.
39  */
40 enum gpio_result {
41 	GPIO_RESULT_OK,
42 	GPIO_RESULT_NULL_HANDLE,
43 	GPIO_RESULT_INVALID_DATA,
44 	GPIO_RESULT_DEVICE_BUSY,
45 	GPIO_RESULT_OPEN_FAILED,
46 	GPIO_RESULT_ALREADY_OPENED,
47 	GPIO_RESULT_NON_SPECIFIC_ERROR
48 };
49 
50 /*
51  * @brief
52  * Used to identify the specific GPIO device
53  *
54  * @notes
55  * These constants are used as indices in a vector.
56  * Thus they should start from zero and be contiguous.
57  */
58 enum gpio_id {
59 	GPIO_ID_UNKNOWN = (-1),
60 	GPIO_ID_DDC_DATA,
61 	GPIO_ID_DDC_CLOCK,
62 	GPIO_ID_GENERIC,
63 	GPIO_ID_HPD,
64 	GPIO_ID_GPIO_PAD,
65 	GPIO_ID_VIP_PAD,
66 	GPIO_ID_SYNC,
67 	GPIO_ID_GSL, /* global swap lock */
68 	GPIO_ID_COUNT,
69 	GPIO_ID_MIN = GPIO_ID_DDC_DATA,
70 	GPIO_ID_MAX = GPIO_ID_GSL
71 };
72 
73 #define GPIO_ENUM_UNKNOWN \
74 	32
75 
76 struct gpio_pin_info {
77 	uint32_t offset;
78 	uint32_t offset_y;
79 	uint32_t offset_en;
80 	uint32_t offset_mask;
81 
82 	uint32_t mask;
83 	uint32_t mask_y;
84 	uint32_t mask_en;
85 	uint32_t mask_mask;
86 };
87 
88 enum gpio_pin_output_state {
89 	GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW,
90 	GPIO_PIN_OUTPUT_STATE_ACTIVE_HIGH,
91 	GPIO_PIN_OUTPUT_STATE_DEFAULT = GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW
92 };
93 
94 enum gpio_generic {
95 	GPIO_GENERIC_UNKNOWN = (-1),
96 	GPIO_GENERIC_A,
97 	GPIO_GENERIC_B,
98 	GPIO_GENERIC_C,
99 	GPIO_GENERIC_D,
100 	GPIO_GENERIC_E,
101 	GPIO_GENERIC_F,
102 	GPIO_GENERIC_G,
103 	GPIO_GENERIC_COUNT,
104 	GPIO_GENERIC_MIN = GPIO_GENERIC_A,
105 	GPIO_GENERIC_MAX = GPIO_GENERIC_B
106 };
107 
108 enum gpio_hpd {
109 	GPIO_HPD_UNKNOWN = (-1),
110 	GPIO_HPD_1,
111 	GPIO_HPD_2,
112 	GPIO_HPD_3,
113 	GPIO_HPD_4,
114 	GPIO_HPD_5,
115 	GPIO_HPD_6,
116 	GPIO_HPD_COUNT,
117 	GPIO_HPD_MIN = GPIO_HPD_1,
118 	GPIO_HPD_MAX = GPIO_HPD_6
119 };
120 
121 enum gpio_gpio_pad {
122 	GPIO_GPIO_PAD_UNKNOWN = (-1),
123 	GPIO_GPIO_PAD_0,
124 	GPIO_GPIO_PAD_1,
125 	GPIO_GPIO_PAD_2,
126 	GPIO_GPIO_PAD_3,
127 	GPIO_GPIO_PAD_4,
128 	GPIO_GPIO_PAD_5,
129 	GPIO_GPIO_PAD_6,
130 	GPIO_GPIO_PAD_7,
131 	GPIO_GPIO_PAD_8,
132 	GPIO_GPIO_PAD_9,
133 	GPIO_GPIO_PAD_10,
134 	GPIO_GPIO_PAD_11,
135 	GPIO_GPIO_PAD_12,
136 	GPIO_GPIO_PAD_13,
137 	GPIO_GPIO_PAD_14,
138 	GPIO_GPIO_PAD_15,
139 	GPIO_GPIO_PAD_16,
140 	GPIO_GPIO_PAD_17,
141 	GPIO_GPIO_PAD_18,
142 	GPIO_GPIO_PAD_19,
143 	GPIO_GPIO_PAD_20,
144 	GPIO_GPIO_PAD_21,
145 	GPIO_GPIO_PAD_22,
146 	GPIO_GPIO_PAD_23,
147 	GPIO_GPIO_PAD_24,
148 	GPIO_GPIO_PAD_25,
149 	GPIO_GPIO_PAD_26,
150 	GPIO_GPIO_PAD_27,
151 	GPIO_GPIO_PAD_28,
152 	GPIO_GPIO_PAD_29,
153 	GPIO_GPIO_PAD_30,
154 	GPIO_GPIO_PAD_COUNT,
155 	GPIO_GPIO_PAD_MIN = GPIO_GPIO_PAD_0,
156 	GPIO_GPIO_PAD_MAX = GPIO_GPIO_PAD_30
157 };
158 
159 enum gpio_vip_pad {
160 	GPIO_VIP_PAD_UNKNOWN = (-1),
161 	/* following never used -
162 	 * GPIO_ID_DDC_CLOCK::GPIO_DDC_LINE_VIP_PAD defined instead */
163 	GPIO_VIP_PAD_SCL,
164 	/* following never used -
165 	 * GPIO_ID_DDC_DATA::GPIO_DDC_LINE_VIP_PAD defined instead */
166 	GPIO_VIP_PAD_SDA,
167 	GPIO_VIP_PAD_VHAD,
168 	GPIO_VIP_PAD_VPHCTL,
169 	GPIO_VIP_PAD_VIPCLK,
170 	GPIO_VIP_PAD_VID,
171 	GPIO_VIP_PAD_VPCLK0,
172 	GPIO_VIP_PAD_DVALID,
173 	GPIO_VIP_PAD_PSYNC,
174 	GPIO_VIP_PAD_COUNT,
175 	GPIO_VIP_PAD_MIN = GPIO_VIP_PAD_SCL,
176 	GPIO_VIP_PAD_MAX = GPIO_VIP_PAD_PSYNC
177 };
178 
179 enum gpio_sync {
180 	GPIO_SYNC_UNKNOWN = (-1),
181 	GPIO_SYNC_HSYNC_A,
182 	GPIO_SYNC_VSYNC_A,
183 	GPIO_SYNC_HSYNC_B,
184 	GPIO_SYNC_VSYNC_B,
185 	GPIO_SYNC_COUNT,
186 	GPIO_SYNC_MIN = GPIO_SYNC_HSYNC_A,
187 	GPIO_SYNC_MAX = GPIO_SYNC_VSYNC_B
188 };
189 
190 enum gpio_gsl {
191 	GPIO_GSL_UNKNOWN = (-1),
192 	GPIO_GSL_GENLOCK_CLOCK,
193 	GPIO_GSL_GENLOCK_VSYNC,
194 	GPIO_GSL_SWAPLOCK_A,
195 	GPIO_GSL_SWAPLOCK_B,
196 	GPIO_GSL_COUNT,
197 	GPIO_GSL_MIN = GPIO_GSL_GENLOCK_CLOCK,
198 	GPIO_GSL_MAX = GPIO_GSL_SWAPLOCK_B
199 };
200 
201 /*
202  * @brief
203  * Unique Id for DDC handle.
204  * Values are meaningful (used as indexes to array)
205  */
206 enum gpio_ddc_line {
207 	GPIO_DDC_LINE_UNKNOWN = (-1),
208 	GPIO_DDC_LINE_DDC1,
209 	GPIO_DDC_LINE_DDC2,
210 	GPIO_DDC_LINE_DDC3,
211 	GPIO_DDC_LINE_DDC4,
212 	GPIO_DDC_LINE_DDC5,
213 	GPIO_DDC_LINE_DDC6,
214 	GPIO_DDC_LINE_DDC_VGA,
215 	GPIO_DDC_LINE_VIP_PAD,
216 	GPIO_DDC_LINE_I2C_PAD = GPIO_DDC_LINE_VIP_PAD,
217 	GPIO_DDC_LINE_COUNT,
218 	GPIO_DDC_LINE_MIN = GPIO_DDC_LINE_DDC1,
219 	GPIO_DDC_LINE_MAX = GPIO_DDC_LINE_I2C_PAD
220 };
221 
222 /*
223  * @brief
224  * Identifies the mode of operation to open a GPIO device.
225  * A GPIO device (pin) can be programmed in only one of these modes at a time.
226  */
227 enum gpio_mode {
228 	GPIO_MODE_UNKNOWN = (-1),
229 	GPIO_MODE_INPUT,
230 	GPIO_MODE_OUTPUT,
231 	GPIO_MODE_FAST_OUTPUT,
232 	GPIO_MODE_HARDWARE,
233 	GPIO_MODE_INTERRUPT
234 };
235 
236 /*
237  * @brief
238  * Identifies the source of the signal when GPIO is in HW mode.
239  * get_signal_source() will return GPIO_SYGNAL_SOURCE__UNKNOWN
240  * when one of the following holds:
241  *    1. GPIO is input GPIO
242  *    2. GPIO is not opened in HW mode
243  *    3. GPIO does not have fixed signal source
244  *    (like DC_GenericA have mux instead fixed)
245  */
246 enum gpio_signal_source {
247 	GPIO_SIGNAL_SOURCE_UNKNOWN = (-1),
248 	GPIO_SIGNAL_SOURCE_DACA_STEREO_SYNC,
249 	GPIO_SIGNAL_SOURCE_PASS_THROUGH_STEREO_SYNC,
250 	GPIO_SIGNAL_SOURCE_DACB_STEREO_SYNC,
251 	GPIO_SIGNAL_SOURCE_DACA_HSYNC,
252 	GPIO_SIGNAL_SOURCE_DACB_HSYNC,
253 	GPIO_SIGNAL_SOURCE_DACA_VSYNC,
254 	GPIO_SIGNAL_SOURCE_DACB_VSYNC,
255 };
256 
257 enum gpio_stereo_source {
258 	GPIO_STEREO_SOURCE_UNKNOWN = (-1),
259 	GPIO_STEREO_SOURCE_D1,
260 	GPIO_STEREO_SOURCE_D2,
261 	GPIO_STEREO_SOURCE_D3,
262 	GPIO_STEREO_SOURCE_D4,
263 	GPIO_STEREO_SOURCE_D5,
264 	GPIO_STEREO_SOURCE_D6
265 };
266 
267 /*
268  * GPIO config
269  */
270 
271 enum gpio_config_type {
272 	GPIO_CONFIG_TYPE_NONE,
273 	GPIO_CONFIG_TYPE_DDC,
274 	GPIO_CONFIG_TYPE_HPD,
275 	GPIO_CONFIG_TYPE_GENERIC_MUX,
276 	GPIO_CONFIG_TYPE_GSL_MUX,
277 	GPIO_CONFIG_TYPE_I2C_AUX_DUAL_MODE
278 };
279 
280 /* DDC configuration */
281 
282 enum gpio_ddc_config_type {
283 	GPIO_DDC_CONFIG_TYPE_MODE_AUX,
284 	GPIO_DDC_CONFIG_TYPE_MODE_I2C,
285 	GPIO_DDC_CONFIG_TYPE_POLL_FOR_CONNECT,
286 	GPIO_DDC_CONFIG_TYPE_POLL_FOR_DISCONNECT,
287 	GPIO_DDC_CONFIG_TYPE_DISABLE_POLLING
288 };
289 
290 struct gpio_ddc_config {
291 	enum gpio_ddc_config_type type;
292 	bool data_en_bit_present;
293 	bool clock_en_bit_present;
294 };
295 
296 /* HPD configuration */
297 
298 struct gpio_hpd_config {
299 	uint32_t delay_on_connect; /* milliseconds */
300 	uint32_t delay_on_disconnect; /* milliseconds */
301 };
302 
303 struct gpio_generic_mux_config {
304 	bool enable_output_from_mux;
305 	enum gpio_signal_source mux_select;
306 	enum gpio_stereo_source stereo_select;
307 };
308 
309 enum gpio_gsl_mux_config_type {
310 	GPIO_GSL_MUX_CONFIG_TYPE_DISABLE,
311 	GPIO_GSL_MUX_CONFIG_TYPE_TIMING_SYNC,
312 	GPIO_GSL_MUX_CONFIG_TYPE_FLIP_SYNC
313 };
314 
315 struct gpio_gsl_mux_config {
316 	enum gpio_gsl_mux_config_type type;
317 	/* Actually sync_source type,
318 	 * however we want to avoid inter-component includes here */
319 	uint32_t gsl_group;
320 };
321 
322 struct gpio_config_data {
323 	enum gpio_config_type type;
324 	union {
325 		struct gpio_ddc_config ddc;
326 		struct gpio_hpd_config hpd;
327 		struct gpio_generic_mux_config generic_mux;
328 		struct gpio_gsl_mux_config gsl_mux;
329 	} config;
330 };
331 
332 #endif
333