blob: e6aca6102605ac1258d3ed5c23111f4847cf6480 [file] [log] [blame]
/* vim: set noet ts=8 sts=8 sw=8 : */
/*
* Copyright © 2010 Saleem Abdulrasool <compnerd@compnerd.org>.
* Copyright © 2010 Genesi USA, Inc. <matt@genesi-usa.com>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef LINUX_DRIVERS_VIDEO_SIIHDMI_H
#define LINUX_DRIVERS_VIDEO_SIIHDMI_H
#include <linux/cea861.h>
#include <linux/ioport.h>
#include <linux/switch.h>
/* TPI registers */
#define SIIHDMI_TPI_REG_VIDEO_MODE_DATA_BASE (0x00)
#define SIIHDMI_TPI_REG_PIXEL_CLOCK_LSB (0x00)
#define SIIHDMI_TPI_REG_PIXEL_CLOCK_MSB (0x01)
#define SIIHDMI_TPI_REG_VFREQ_LSB (0x02)
#define SIIHDMI_TPI_REG_VFREQ_MSB (0x03)
#define SIIHDMI_TPI_REG_PIXELS_LSB (0x04)
#define SIIHDMI_TPI_REG_PIXELS_MSB (0x05)
#define SIIHDMI_TPI_REG_LINES_LSB (0x06)
#define SIIHDMI_TPI_REG_LINES_MSB (0x07)
#define SIIHDMI_TPI_REG_INPUT_BUS_PIXEL_REPETITION (0x08)
#define SIIHDMI_TPI_REG_AVI_INPUT_FORMAT (0x09)
#define SIIHDMI_TPI_REG_AVI_OUTPUT_FORMAT (0x0a)
#define SIIHDMI_TPI_REG_YC_INPUT_MODE (0x0b)
#define SIIHDMI_TPI_REG_AVI_DBYTE0 (0x0c)
#define SIIHDMI_TPI_REG_AVI_DBYTE1 (0x0d)
#define SIIHDMI_TPI_REG_AVI_DBYTE2 (0x0e)
#define SIIHDMI_TPI_REG_AVI_DBYTE3 (0x0f)
#define SIIHDMI_TPI_REG_AVI_DBYTE4 (0x10)
#define SIIHDMI_TPI_REG_AVI_DBYTE5 (0x11)
#define SIIHDMI_TPI_REG_AVI_INFO_END_TOP_BAR_LSB (0x12)
#define SIIHDMI_TPI_REG_AVI_INFO_END_TOP_BAR_MSB (0x13)
#define SIIHDMI_TPI_REG_AVI_INFO_START_BOTTOM_BAR_LSB (0x14)
#define SIIHDMI_TPI_REG_AVI_INFO_START_BOTTOM_BAR_MSB (0x15)
#define SIIHDMI_TPI_REG_AVI_INFO_END_LEFT_BAR_LSB (0x16)
#define SIIHDMI_TPI_REG_AVI_INFO_END_LEFT_BAR_MSB (0x17)
#define SIIHDMI_TPI_REG_AVI_INFO_END_RIGHT_BAR_LSB (0x18)
#define SIIHDMI_TPI_REG_AVI_INFO_END_RIGHT_BAR_MSB (0x19)
#define SIIHDMI_TPI_REG_SYS_CTRL (0x1a)
#define SIIHDMI_TPI_REG_DEVICE_ID (0x1b)
#define SIIHDMI_TPI_REG_DEVICE_REVISION (0x1c)
#define SIIHDMI_TPI_REG_TPI_REVISION (0x1d)
#define SIIHDMI_TPI_REG_PWR_STATE (0x1e)
#define SIIHDMI_TPI_REG_I2S_ENABLE_MAPPING (0x1f)
#define SIIHDMI_TPI_REG_I2S_INPUT_CONFIGURATION (0x20)
#define SIIHDMI_TPI_REG_I2S_STREAM_HEADER_SETTINGS_BASE (0x21)
#define SIIHDMI_TPI_REG_I2S_CHANNEL_STATUS (0x21)
#define SIIHDMI_TPI_REG_I2S_CATEGORY_CODE (0x22)
#define SIIHDMI_TPI_REG_I2S_SOURCE_CHANNEL (0x23)
#define SIIHDMI_TPI_REG_I2S_ACCURACY_SAMPLING_FREQUENCY (0x24)
#define SIIHDMI_TPI_REG_I2S_ORIGINAL_FREQ_SAMPLE_LENGTH (0x25)
#define SIIHDMI_TPI_REG_I2S_AUDIO_CONFIGURATION_BASE (0x26)
#define SIIHDMI_TPI_REG_I2S_AUDIO_PACKET_LAYOUT_CTRL (0x26)
#define SIIHDMI_TPI_REG_I2S_AUDIO_SAMPLING_HBR (0x27)
#define SIIHDMI_TPI_REG_I2S_AUDIO_RESERVED (0x28)
#define SIIHDMI_TPI_REG_HDCP_QUERY_DATA (0x29)
#define SIIHDMI_TPI_REG_HDCP_CONTROL_DATA (0x2a)
#define SIIHDMI_TPI_REG_HDCP_CONTROL_DATA (0x2a)
#define SIIHDMI_TPI_REG_HDCP_BKSV_1 (0x2b)
#define SIIHDMI_TPI_REG_HDCP_BKSV_2 (0x2c)
#define SIIHDMI_TPI_REG_HDCP_BKSV_3 (0x2d)
#define SIIHDMI_TPI_REG_HDCP_BKSV_4 (0x2e)
#define SIIHDMI_TPI_REG_HDCP_BKSV_5 (0x2f)
#define SIIHDMI_TPI_REG_HDCP_REVISION (0x30)
#define SIIHDMI_TPI_REG_HDCP_KSV_V_STAR_VALUE (0x31)
#define SIIHDMI_TPI_REG_HDCP_V_STAR_VALUE_1 (0x32)
#define SIIHDMI_TPI_REG_HDCP_V_STAR_VALUE_2 (0x33)
#define SIIHDMI_TPI_REG_HDCP_V_STAR_VALUE_3 (0x34)
#define SIIHDMI_TPI_REG_HDCP_V_STAR_VALUE_4 (0x35)
#define SIIHDMI_TPI_REG_HDCP_AKSV_1 (0x36)
#define SIIHDMI_TPI_REG_HDCP_AKSV_2 (0x37)
#define SIIHDMI_TPI_REG_HDCP_AKSV_3 (0x38)
#define SIIHDMI_TPI_REG_HDCP_AKSV_4 (0x39)
#define SIIHDMI_TPI_REG_HDCP_AKSV_5 (0x3a)
#define SIIHDMI_TPI_REG_IER (0x3c)
#define SIIHDMI_TPI_REG_ISR (0x3d)
#define SIIHDMI_INTERNAL_REG_SET_PAGE (0xbc)
#define SIIHDMI_INTERNAL_REG_SET_OFFSET (0xbd)
#define SIIHDMI_INTERNAL_REG_ACCESS (0xbe)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_SELECT (0xbf)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_TYPE (0xc0)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_VERSION (0xc1)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_LEN (0xc2)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE0 (0xc3)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE1 (0xc4)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE2 (0xc5)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE3 (0xc6)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE4 (0xc7)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE5 (0xc8)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE6 (0xc9)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE7 (0xca)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE8 (0xcb)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE9 (0xcc)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE10 (0xcd)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE11 (0xce)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE12 (0xcf)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE13 (0xd0)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE14 (0xd1)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE15 (0xd2)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE16 (0xd3)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE17 (0xd4)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE18 (0xd5)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE19 (0xd6)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE20 (0xd7)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE21 (0xd8)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE22 (0xd9)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE23 (0xda)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE24 (0xdb)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE25 (0xdc)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE26 (0xdd)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE27 (0xde)
#define SIIHDMI_TPI_REG_RQB (0xc7)
/* driver constants */
#define SIIHDMI_DEVICE_ID_902x (0xb0)
#define SIIHDMI_BASE_TPI_REVISION (0x29)
#define SIIHDMI_CTRL_INFO_FRAME_DRAIN_TIME (0x80)
#define SIIHDMI_HOTPLUG_HANDLER_TIMEOUT (0x32)
#define SIIHDMI_VERSION_FLAG_VIRTUAL (1 << 7)
/* Input Bus and Pixel Repetition */
#define SIIHDMI_PIXEL_REPETITION_DUAL (1 << 0)
#define SIIHDMI_PIXEL_REPETITION_QUAD (3 << 0)
#define SIIHDMI_INPUT_BUS_EDGE_SELECT_RISING (1 << 4)
#define SIIHDMI_INPUT_BUS_SELECT_FULL_PIXEL_WIDTH (1 << 5)
#define SIIHDMI_INPUT_BUS_TMDS_CLOCK_RATIO_1X (1 << 6)
#define SIIHDMI_INPUT_BUS_TMDS_CLOCK_RATIO_2X (2 << 6)
#define SIIHDMI_INPUT_BUS_TMDS_CLOCK_RATIO_4X (3 << 6)
/* Input Format */
#define SIIHDMI_INPUT_COLOR_SPACE_RGB (0 << 0)
#define SIIHDMI_INPUT_COLOR_SPACE_YUV_444 (1 << 0)
#define SIIHDMI_INPUT_COLOR_SPACE_YUV_422 (2 << 0)
#define SIIHDMI_INPUT_COLOR_SPACE_BLACK (3 << 0)
#define SIIHDMI_INPUT_VIDEO_RANGE_EXPANSION_AUTO (0 << 2)
#define SIIHDMI_INPUT_VIDEO_RANGE_EXPANSION_ON (1 << 2)
#define SIIHDMI_INPUT_VIDEO_RANGE_EXPANSION_OFF (2 << 2)
#define SIIHDMI_INPUT_COLOR_DEPTH_8BIT (0 << 6)
#define SIIHDMI_INPUT_COLOR_DEPTH_10BIT (2 << 6)
#define SIIHDMI_INPUT_COLOR_DEPTH_12BIT (3 << 6)
#define SIIHDMI_INPUT_COLOR_DEPTH_16BIT (1 << 6)
/* Output Format */
#define SIIHDMI_OUTPUT_FORMAT_HDMI_RGB (0 << 0)
#define SIIHDMI_OUTPUT_FORMAT_HDMI_YUV_444 (1 << 0)
#define SIIHDMI_OUTPUT_FORMAT_HDMI_YUV_422 (2 << 0)
#define SIIHDMI_OUTPUT_FORMAT_DVI_RGB (3 << 0)
#define SIIHDMI_OUTPUT_VIDEO_RANGE_COMPRESSION_AUTO (0 << 2)
#define SIIHDMI_OUTPUT_VIDEO_RANGE_COMPRESSION_ON (1 << 2)
#define SIIHDMI_OUTPUT_VIDEO_RANGE_COMPRESSION_OFF (2 << 2)
#define SIIHDMI_OUTPUT_COLOR_STANDARD_BT601 (0 << 4)
#define SIIHDMI_OUTPUT_COLOR_STANDARD_BT709 (1 << 4)
#define SIIHDMI_OUTPUT_DITHERING (1 << 5)
#define SIIHDMI_OUTPUT_COLOR_DEPTH_8BIT (0 << 6)
#define SIIHDMI_OUTPUT_COLOR_DEPTH_10BIT (2 << 6)
#define SIIHDMI_OUTPUT_COLOR_DEPTH_12BIT (3 << 6)
#define SIIHDMI_OUTPUT_COLOR_DEPTH_16BIT (1 << 6)
/* System Control */
#define SIIHDMI_SYS_CTRL_OUTPUT_MODE_SELECT_HDMI (1 << 0)
#define SIIHDMI_SYS_CTRL_DDC_BUS_OWNER_HOST (1 << 1)
#define SIIHDMI_SYS_CTRL_DDC_BUS_GRANTED (1 << 1)
#define SIIHDMI_SYS_CTRL_DDC_BUS_REQUEST (1 << 2)
#define SIIHDMI_SYS_CTRL_AV_MUTE_HDMI (1 << 3)
#define SIIHDMI_SYS_CTRL_TMDS_OUTPUT_POWER_DOWN (1 << 4)
#define SIIHDMI_SYS_CTRL_DYNAMIC_LINK_INTEGRITY (1 << 6)
/* Device Power State Control Data */
#define SIIHDMI_POWER_STATE_D0 (0 << 0)
#define SIIHDMI_POWER_STATE_D1 (1 << 0)
#define SIIHDMI_POWER_STATE_D2 (2 << 0)
#define SIIHDMI_POWER_STATE_D3 (3 << 0)
#define SIIHDMI_WAKEUP_STATE_COLD (1 << 2)
/* Audio Frequency Sampling Length */
#define SIIHDMI_AUDIO_HANDLING_PASS_BASIC_AUDIO (0 << 0)
#define SIIHDMI_AUDIO_HANDLING_PASS_ALL_AUDIO_MODES (1 << 0)
#define SIIHDMI_AUDIO_HANDLING_DOWN_SAMPLE (2 << 0)
#define SIIHDMI_AUDIO_HANDLING_UNCHECKED (3 << 0)
/* Audio Interface Control */
#define SIIHDMI_AUDIO_MUTE (1 << 4)
#define SIIHDMI_AUDIO_DISABLE (0 << 6)
#define SIIHDMI_AUDIO_I2S_ENABLE (2 << 6)
#define SIIHDMI_AUDIO_SPDIF_ENABLE (1 << 6)
/* Audio Sampling HBR */
#define SIIHDMI_AUDIO_SAMPLING_HBR_ENABLE (1 << 2)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_AUTO (0 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_32_KHZ (1 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_44_1_KHZ (2 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_48_KHZ (3 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_88_2_KHZ (4 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_96_KHZ (5 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_176_4_KHZ (6 << 3)
#define SIIHDMI_AUDIO_SAMPLING_FREQUENCY_192_KHZ (7 << 3)
#define SIIHDMI_AUDIO_SAMPLING_DEPTH_AUTO (0 << 6)
#define SIIHDMI_AUDIO_SAMPLING_DEPTH_16_BIT (1 << 6)
#define SIIHDMI_AUDIO_SAMPLING_DEPTH_20_BIT (2 << 6)
#define SIIHDMI_AUDIO_SAMPLING_DEPTH_24_BIT (3 << 6)
/* I²S Enable and Mapping */
#define SIIHDMI_I2S_MAPPING_SELECT_SD_CHANNEL_0 (0 << 0)
#define SIIHDMI_I2S_MAPPING_SELECT_SD_CHANNEL_1 (1 << 0)
#define SIIHDMI_I2S_MAPPING_SELECT_SD_CHANNEL_2 (2 << 0)
#define SIIHDMI_I2S_MAPPING_SELECT_SD_CHANNEL_3 (3 << 0)
#define SIIHDMI_I2S_MAPPING_SWAP_CHANNELS (1 << 3)
#define SIIHDMI_I2S_ENABLE_BASIC_AUDIO_DOWNSAMPLING (1 << 4)
#define SIIHDMI_I2S_MAPPING_SELECT_FIFO_0 (0 << 5)
#define SIIHDMI_I2S_MAPPING_SELECT_FIFO_1 (1 << 5)
#define SIIHDMI_I2S_MAPPING_SELECT_FIFO_2 (2 << 5)
#define SIIHDMI_I2S_MAPPING_SELECT_FIFO_3 (3 << 5)
#define SIIHDMI_I2S_ENABLE_SELECTED_FIFO (1 << 7)
/* I²S Input Configuration */
#define SIIHDMI_I2S_WS_TO_SD_FIRST_BIT_SHIFT (1 << 0)
#define SIIHDMI_I2S_SD_LSB_FIRST (1 << 1)
#define SIIHDMI_I2S_SD_RIGHT_JUSTIFY_DATA (1 << 2)
#define SIIHDMI_I2S_WS_POLARITY_HIGH (1 << 3)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_128 (0 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_256 (1 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_384 (2 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_512 (3 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_768 (4 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_1024 (5 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_1152 (6 << 4)
#define SIIHDMI_I2S_MCLK_MULTIPLIER_192 (7 << 4)
#define SIIHDMI_I2S_SCK_SAMPLE_RISING_EDGE (1 << 7)
/* Interrupt Enable */
#define SIIHDMI_IER_HOT_PLUG_EVENT (1 << 0)
#define SIIHDMI_IER_RECEIVER_SENSE_EVENT (1 << 1)
#define SIIHDMI_IER_CTRL_BUS_EVENT (1 << 2)
#define SIIHDMI_IER_CPI_EVENT (1 << 3)
#define SIIHDMI_IER_AUDIO_EVENT (1 << 4)
#define SIIHDMI_IER_SECURITY_STATUS_CHANGE (1 << 5)
#define SIIHDMI_IER_HDCP_VALUE_READY (1 << 6)
#define SIIHDMI_IER_HDCP_AUTHENTICATION_STATUS_CHANGE (1 << 7)
/* Interrupt Status */
#define SIIHDMI_ISR_HOT_PLUG_EVENT (1 << 0)
#define SIIHDMI_ISR_RECEIVER_SENSE_EVENT (1 << 1)
#define SIIHDMI_ISR_CTRL_BUS_EVENT (1 << 2)
#define SIIHDMI_ISR_DISPLAY_ATTACHED (1 << 2)
#define SIIHDMI_ISR_CPI_EVENT (1 << 3)
#define SIIHDMI_ISR_RECEIVER_SENSE (1 << 3)
#define SIIHDMI_ISR_AUDIO_EVENT (1 << 4)
#define SIIHDMI_ISR_SECURITY_STATUS_CHANGED (1 << 5)
#define SIIHDMI_ISR_HDCP_VALUE_READY (1 << 6)
#define SIIHDMI_ISR_HDCP_AUTHENTICATION_STATUS_CHANGED (1 << 7)
/* Request/Grant/Black Mode */
#define SIIHDMI_RQB_DDC_BUS_REQUEST (1 << 0)
#define SIIHDMI_RQB_DDC_BUS_GRANTED (1 << 1)
#define SIIHDMI_RQB_I2C_ACCESS_DDC_BUS (1 << 2)
#define SIIHDMI_RQB_FORCE_VIDEO_BLANK (1 << 5)
#define SIIHDMI_RQB_TPI_MODE_DISABLE (1 << 7)
/*
* SII HDMI chips have two ways to send HDMI InfoFrames:
* a) AVI InfoFrame is sent via a dedicated TPI register block
* b) Other InfoFrames are sent via a misc TPI register block with a header to
* identifty the InfoFrame data
*/
/* InfoFrame blocks */
#define SIIHDMI_TPI_REG_AVI_INFO_FRAME_BASE (SIIHDMI_TPI_REG_AVI_DBYTE0)
#define SIIHDMI_TPI_REG_AVI_INFO_FRAME_LENGTH (SIIHDMI_TPI_REG_AVI_INFO_END_RIGHT_BAR_MSB - SIIHDMI_TPI_REG_AVI_DBYTE0 + 1)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_BASE (SIIHDMI_TPI_REG_MISC_INFO_FRAME_SELECT)
#define SIIHDMI_TPI_REG_MISC_INFO_FRAME_LENGTH (SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE27 - SIIHDMI_TPI_REG_MISC_INFO_FRAME_SELECT + 1)
#define SIIHDMI_TPI_REG_AUDIO_INFO_FRAME_BASE (SIIHDMI_TPI_REG_MISC_INFO_FRAME_SELECT)
#define SIIHDMI_TPI_REG_AUDIO_INFO_FRAME_LENGTH (SIIHDMI_TPI_REG_MISC_INFO_FRAME_DBYTE10 - SIIHDMI_TPI_REG_MISC_INFO_FRAME_SELECT + 1)
/*
* AVI InfoFrame is handled specially. The type, version, and length fields (1
* byte each) are skipped in transmission. We must offset into the standard
* structure to skip these fields.
*/
#define SIIHDMI_AVI_INFO_FRAME_OFFSET (0x03)
enum siihdmi_info_frame_type {
SIIHDMI_INFO_FRAME_NONE,
SIIHDMI_INFO_FRAME_SPD_ACP,
SIIHDMI_INFO_FRAME_AUDIO,
SIIHDMI_INFO_FRAME_MPEG_GBD,
SIIHDMI_INFO_FRAME_GENERIC1_ISRC1,
SIIHDMI_INFO_FRAME_GENERIC2_ISRC2,
};
struct __packed info_frame_buffer_header {
#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned info_frame : 3;
unsigned : 1;
unsigned : 2;
unsigned repeat : 1;
unsigned enable : 1;
#else
unsigned enable : 1;
unsigned repeat : 1;
unsigned : 2;
unsigned : 1;
unsigned info_frame : 3;
#endif
};
struct siihdmi_spd_info_frame {
struct info_frame_buffer_header header;
struct spd_info_frame info_frame;
u8 padding[2];
};
struct siihdmi_audio_info_frame {
struct info_frame_buffer_header header;
struct audio_info_frame info_frame;
};
struct siihdmi_platform_data {
/* reset function */
void (*reset)(void);
/* HDMI SPD InfoFrame Data */
char *vendor;
char *description;
/* id of the lcd segment */
const char *lcd_id;
/* hotplug IRQ */
struct resource hotplug;
/* maximum pixel clock rate */
int pixclock;
enum {
RGB_24,
YUV_422_8_MUX,
} input_format;
/* Specific method called when a hotplug event is detected*/
void (*on_hotplug)(int screen_attached);
};
struct siihdmi_tx {
struct i2c_client *client;
struct siihdmi_platform_data *platform;
struct fb_monspecs monspecs;
const struct fb_videomode *selected_mode;
struct switch_dev sdev;
struct {
bool enabled;
} hotplug;
struct {
u8 *data;
u32 length;
#if defined(CONFIG_SYSFS)
struct bin_attribute attributes;
#endif
} edid;
struct {
bool available;
#if defined(CONFIG_SYSFS)
struct bin_attribute attributes;
#endif
} audio;
struct {
enum {
SINK_TYPE_DVI,
SINK_TYPE_HDMI,
} type;
enum {
SCANNING_EXACT,
SCANNING_UNDERSCANNED,
SCANNING_OVERSCANNED,
} scanning;
} sink;
};
#endif