/*
|
* Copyright 2012-15 Advanced Micro Devices, Inc.
|
*
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
* copy of this software and associated documentation files (the "Software"),
|
* to deal in the Software without restriction, including without limitation
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* and/or sell copies of the Software, and to permit persons to whom the
|
* Software is furnished to do so, subject to the following conditions:
|
*
|
* The above copyright notice and this permission notice shall be included in
|
* all copies or substantial portions of the Software.
|
*
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
* OTHER DEALINGS IN THE SOFTWARE.
|
*
|
* Authors: AMD
|
*
|
*/
|
|
#ifndef __DAL_GPIO_TYPES_H__
|
#define __DAL_GPIO_TYPES_H__
|
|
#define BUNDLE_A_MASK 0x00FFF000L
|
#define BUNDLE_B_MASK 0x00000FFFL
|
|
/*
|
* gpio_result
|
*
|
* @brief
|
* The possible return codes that the GPIO object can return.
|
* These return codes can be generated
|
* directly by the GPIO object or from the GPIOPin object.
|
*/
|
enum gpio_result {
|
GPIO_RESULT_OK,
|
GPIO_RESULT_NULL_HANDLE,
|
GPIO_RESULT_INVALID_DATA,
|
GPIO_RESULT_DEVICE_BUSY,
|
GPIO_RESULT_OPEN_FAILED,
|
GPIO_RESULT_ALREADY_OPENED,
|
GPIO_RESULT_NON_SPECIFIC_ERROR
|
};
|
|
/*
|
* @brief
|
* Used to identify the specific GPIO device
|
*
|
* @notes
|
* These constants are used as indices in a vector.
|
* Thus they should start from zero and be contiguous.
|
*/
|
enum gpio_id {
|
GPIO_ID_UNKNOWN = (-1),
|
GPIO_ID_DDC_DATA,
|
GPIO_ID_DDC_CLOCK,
|
GPIO_ID_GENERIC,
|
GPIO_ID_HPD,
|
GPIO_ID_GPIO_PAD,
|
GPIO_ID_VIP_PAD,
|
GPIO_ID_SYNC,
|
GPIO_ID_GSL, /* global swap lock */
|
GPIO_ID_COUNT,
|
GPIO_ID_MIN = GPIO_ID_DDC_DATA,
|
GPIO_ID_MAX = GPIO_ID_GSL
|
};
|
|
#define GPIO_ENUM_UNKNOWN \
|
32
|
|
struct gpio_pin_info {
|
uint32_t offset;
|
uint32_t offset_y;
|
uint32_t offset_en;
|
uint32_t offset_mask;
|
|
uint32_t mask;
|
uint32_t mask_y;
|
uint32_t mask_en;
|
uint32_t mask_mask;
|
};
|
|
enum gpio_pin_output_state {
|
GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW,
|
GPIO_PIN_OUTPUT_STATE_ACTIVE_HIGH,
|
GPIO_PIN_OUTPUT_STATE_DEFAULT = GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW
|
};
|
|
enum gpio_generic {
|
GPIO_GENERIC_UNKNOWN = (-1),
|
GPIO_GENERIC_A,
|
GPIO_GENERIC_B,
|
GPIO_GENERIC_C,
|
GPIO_GENERIC_D,
|
GPIO_GENERIC_E,
|
GPIO_GENERIC_F,
|
GPIO_GENERIC_G,
|
GPIO_GENERIC_COUNT,
|
GPIO_GENERIC_MIN = GPIO_GENERIC_A,
|
GPIO_GENERIC_MAX = GPIO_GENERIC_B
|
};
|
|
enum gpio_hpd {
|
GPIO_HPD_UNKNOWN = (-1),
|
GPIO_HPD_1,
|
GPIO_HPD_2,
|
GPIO_HPD_3,
|
GPIO_HPD_4,
|
GPIO_HPD_5,
|
GPIO_HPD_6,
|
GPIO_HPD_COUNT,
|
GPIO_HPD_MIN = GPIO_HPD_1,
|
GPIO_HPD_MAX = GPIO_HPD_6
|
};
|
|
enum gpio_gpio_pad {
|
GPIO_GPIO_PAD_UNKNOWN = (-1),
|
GPIO_GPIO_PAD_0,
|
GPIO_GPIO_PAD_1,
|
GPIO_GPIO_PAD_2,
|
GPIO_GPIO_PAD_3,
|
GPIO_GPIO_PAD_4,
|
GPIO_GPIO_PAD_5,
|
GPIO_GPIO_PAD_6,
|
GPIO_GPIO_PAD_7,
|
GPIO_GPIO_PAD_8,
|
GPIO_GPIO_PAD_9,
|
GPIO_GPIO_PAD_10,
|
GPIO_GPIO_PAD_11,
|
GPIO_GPIO_PAD_12,
|
GPIO_GPIO_PAD_13,
|
GPIO_GPIO_PAD_14,
|
GPIO_GPIO_PAD_15,
|
GPIO_GPIO_PAD_16,
|
GPIO_GPIO_PAD_17,
|
GPIO_GPIO_PAD_18,
|
GPIO_GPIO_PAD_19,
|
GPIO_GPIO_PAD_20,
|
GPIO_GPIO_PAD_21,
|
GPIO_GPIO_PAD_22,
|
GPIO_GPIO_PAD_23,
|
GPIO_GPIO_PAD_24,
|
GPIO_GPIO_PAD_25,
|
GPIO_GPIO_PAD_26,
|
GPIO_GPIO_PAD_27,
|
GPIO_GPIO_PAD_28,
|
GPIO_GPIO_PAD_29,
|
GPIO_GPIO_PAD_30,
|
GPIO_GPIO_PAD_COUNT,
|
GPIO_GPIO_PAD_MIN = GPIO_GPIO_PAD_0,
|
GPIO_GPIO_PAD_MAX = GPIO_GPIO_PAD_30
|
};
|
|
enum gpio_vip_pad {
|
GPIO_VIP_PAD_UNKNOWN = (-1),
|
/* following never used -
|
* GPIO_ID_DDC_CLOCK::GPIO_DDC_LINE_VIP_PAD defined instead */
|
GPIO_VIP_PAD_SCL,
|
/* following never used -
|
* GPIO_ID_DDC_DATA::GPIO_DDC_LINE_VIP_PAD defined instead */
|
GPIO_VIP_PAD_SDA,
|
GPIO_VIP_PAD_VHAD,
|
GPIO_VIP_PAD_VPHCTL,
|
GPIO_VIP_PAD_VIPCLK,
|
GPIO_VIP_PAD_VID,
|
GPIO_VIP_PAD_VPCLK0,
|
GPIO_VIP_PAD_DVALID,
|
GPIO_VIP_PAD_PSYNC,
|
GPIO_VIP_PAD_COUNT,
|
GPIO_VIP_PAD_MIN = GPIO_VIP_PAD_SCL,
|
GPIO_VIP_PAD_MAX = GPIO_VIP_PAD_PSYNC
|
};
|
|
enum gpio_sync {
|
GPIO_SYNC_UNKNOWN = (-1),
|
GPIO_SYNC_HSYNC_A,
|
GPIO_SYNC_VSYNC_A,
|
GPIO_SYNC_HSYNC_B,
|
GPIO_SYNC_VSYNC_B,
|
GPIO_SYNC_COUNT,
|
GPIO_SYNC_MIN = GPIO_SYNC_HSYNC_A,
|
GPIO_SYNC_MAX = GPIO_SYNC_VSYNC_B
|
};
|
|
enum gpio_gsl {
|
GPIO_GSL_UNKNOWN = (-1),
|
GPIO_GSL_GENLOCK_CLOCK,
|
GPIO_GSL_GENLOCK_VSYNC,
|
GPIO_GSL_SWAPLOCK_A,
|
GPIO_GSL_SWAPLOCK_B,
|
GPIO_GSL_COUNT,
|
GPIO_GSL_MIN = GPIO_GSL_GENLOCK_CLOCK,
|
GPIO_GSL_MAX = GPIO_GSL_SWAPLOCK_B
|
};
|
|
/*
|
* @brief
|
* Unique Id for DDC handle.
|
* Values are meaningful (used as indexes to array)
|
*/
|
enum gpio_ddc_line {
|
GPIO_DDC_LINE_UNKNOWN = (-1),
|
GPIO_DDC_LINE_DDC1,
|
GPIO_DDC_LINE_DDC2,
|
GPIO_DDC_LINE_DDC3,
|
GPIO_DDC_LINE_DDC4,
|
GPIO_DDC_LINE_DDC5,
|
GPIO_DDC_LINE_DDC6,
|
GPIO_DDC_LINE_DDC_VGA,
|
GPIO_DDC_LINE_VIP_PAD,
|
GPIO_DDC_LINE_I2C_PAD = GPIO_DDC_LINE_VIP_PAD,
|
GPIO_DDC_LINE_COUNT,
|
GPIO_DDC_LINE_MIN = GPIO_DDC_LINE_DDC1,
|
GPIO_DDC_LINE_MAX = GPIO_DDC_LINE_I2C_PAD
|
};
|
|
/*
|
* @brief
|
* Identifies the mode of operation to open a GPIO device.
|
* A GPIO device (pin) can be programmed in only one of these modes at a time.
|
*/
|
enum gpio_mode {
|
GPIO_MODE_UNKNOWN = (-1),
|
GPIO_MODE_INPUT,
|
GPIO_MODE_OUTPUT,
|
GPIO_MODE_FAST_OUTPUT,
|
GPIO_MODE_HARDWARE,
|
GPIO_MODE_INTERRUPT
|
};
|
|
/*
|
* @brief
|
* Identifies the source of the signal when GPIO is in HW mode.
|
* get_signal_source() will return GPIO_SYGNAL_SOURCE__UNKNOWN
|
* when one of the following holds:
|
* 1. GPIO is input GPIO
|
* 2. GPIO is not opened in HW mode
|
* 3. GPIO does not have fixed signal source
|
* (like DC_GenericA have mux instead fixed)
|
*/
|
enum gpio_signal_source {
|
GPIO_SIGNAL_SOURCE_UNKNOWN = (-1),
|
GPIO_SIGNAL_SOURCE_DACA_STEREO_SYNC,
|
GPIO_SIGNAL_SOURCE_PASS_THROUGH_STEREO_SYNC,
|
GPIO_SIGNAL_SOURCE_DACB_STEREO_SYNC,
|
GPIO_SIGNAL_SOURCE_DACA_HSYNC,
|
GPIO_SIGNAL_SOURCE_DACB_HSYNC,
|
GPIO_SIGNAL_SOURCE_DACA_VSYNC,
|
GPIO_SIGNAL_SOURCE_DACB_VSYNC,
|
};
|
|
enum gpio_stereo_source {
|
GPIO_STEREO_SOURCE_UNKNOWN = (-1),
|
GPIO_STEREO_SOURCE_D1,
|
GPIO_STEREO_SOURCE_D2,
|
GPIO_STEREO_SOURCE_D3,
|
GPIO_STEREO_SOURCE_D4,
|
GPIO_STEREO_SOURCE_D5,
|
GPIO_STEREO_SOURCE_D6
|
};
|
|
/*
|
* GPIO config
|
*/
|
|
enum gpio_config_type {
|
GPIO_CONFIG_TYPE_NONE,
|
GPIO_CONFIG_TYPE_DDC,
|
GPIO_CONFIG_TYPE_HPD,
|
GPIO_CONFIG_TYPE_GENERIC_MUX,
|
GPIO_CONFIG_TYPE_GSL_MUX,
|
GPIO_CONFIG_TYPE_I2C_AUX_DUAL_MODE
|
};
|
|
/* DDC configuration */
|
|
enum gpio_ddc_config_type {
|
GPIO_DDC_CONFIG_TYPE_MODE_AUX,
|
GPIO_DDC_CONFIG_TYPE_MODE_I2C,
|
GPIO_DDC_CONFIG_TYPE_POLL_FOR_CONNECT,
|
GPIO_DDC_CONFIG_TYPE_POLL_FOR_DISCONNECT,
|
GPIO_DDC_CONFIG_TYPE_DISABLE_POLLING
|
};
|
|
struct gpio_ddc_config {
|
enum gpio_ddc_config_type type;
|
bool data_en_bit_present;
|
bool clock_en_bit_present;
|
};
|
|
/* HPD configuration */
|
|
struct gpio_hpd_config {
|
uint32_t delay_on_connect; /* milliseconds */
|
uint32_t delay_on_disconnect; /* milliseconds */
|
};
|
|
struct gpio_generic_mux_config {
|
bool enable_output_from_mux;
|
enum gpio_signal_source mux_select;
|
enum gpio_stereo_source stereo_select;
|
};
|
|
enum gpio_gsl_mux_config_type {
|
GPIO_GSL_MUX_CONFIG_TYPE_DISABLE,
|
GPIO_GSL_MUX_CONFIG_TYPE_TIMING_SYNC,
|
GPIO_GSL_MUX_CONFIG_TYPE_FLIP_SYNC
|
};
|
|
struct gpio_gsl_mux_config {
|
enum gpio_gsl_mux_config_type type;
|
/* Actually sync_source type,
|
* however we want to avoid inter-component includes here */
|
uint32_t gsl_group;
|
};
|
|
struct gpio_config_data {
|
enum gpio_config_type type;
|
union {
|
struct gpio_ddc_config ddc;
|
struct gpio_hpd_config hpd;
|
struct gpio_generic_mux_config generic_mux;
|
struct gpio_gsl_mux_config gsl_mux;
|
} config;
|
};
|
|
#endif
|