• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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