tegrakernel/kernel/nvidia/drivers/video/tegra/dc/bridge/hdmi2dsi_tc358870.h

127 lines
3.2 KiB
C

/*
* tc358870.h: HDMI to DSI bridge driver.
*
* Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _HDMI2DSI_TC358870_
#define _HDMI2DSI_TC358870_
#include "panel/board-panel.h"
#define MAX_BRIDGE_INSTANCES 2
#define NUMOF_BIT_PER_BYTE 8
#define REG_LEN 2
#define MHZ_500 500000000
#define MHZ_250 250000000
#define MHZ_125 125000000
#define MHZ 1000000
/* DCS */
#define DATA0_MASK 0x00FF
#define DATA1_MASK 0xFF00
#define LONG_PKT_MASK 0x8000
#ifdef CONFIG_TEGRA_HDMI2DSI_TC358870
extern struct tegra_hdmi_out_ops tegra_hdmi2dsi_ops;
#else
#define tegra_hdmi2dsi_ops (*(struct tegra_hdmi_out_ops *) NULL)
#endif /* CONFIG_TEGRA_HDMI2DSI_TC358870 */
enum tc358870_dsi_port {
DSI_TX_NONE = 0,
DSI_TX_0,
DSI_TX_1,
DSI_TX_BOTH
};
enum tc358870_clock_mode {
DSI_NON_CONT_CLK = 0,
DSI_CONT_CLK
};
enum tc358870_ddc5v_delays {
DDC5V_DELAY_0MS,
DDC5V_DELAY_50MS,
DDC5V_DELAY_100MS,
DDC5V_DELAY_200MS,
DDC5V_DELAY_MAX = DDC5V_DELAY_200MS,
};
struct panel_out {
u8 n_data_lanes;
u8 pixel_format;
u8 refresh_rate;
struct tegra_dsi_cmd *dsi_init_cmd;
u16 n_init_cmd;
struct tegra_dsi_cmd *dsi_suspend_cmd;
u16 n_suspend_cmd;
struct tegra_dsi_cmd *dsi_postvideo_cmd;
u16 n_postvideo_cmd;
};
struct tc358870_platform_data {
struct regulator *dvdd;
struct regulator *iovdd;
int reset_gpio; /* GPIOs Pin K8 */
int bridge_instance; /* bridge instance */
int panel_connected; /* panel connected */
u32 refclk_hz; /* 40 - 50 MHz */
/* DDC +5V debounce delay */
enum tc358870_ddc5v_delays ddc5v_delay;
enum tc358870_dsi_port dsi_port;/* DSI output */
bool enable_hdcp; /* HDCP not yet implemented */
/* DSI */
/* The values in brackets can serve as a starting point. */
u32 lineinitcnt; /* (0x00000FA0) */
u32 lptxtimecnt; /* (0x00000004) */
u32 tclk_headercnt; /* (0x00180203) */
u32 tclk_trailcnt; /* (0x00040005) */
u32 ths_headercnt; /* (0x000D0004) */
u32 twakeup; /* (0x00003E80) */
u32 tclk_postcnt; /* (0x0000000A) */
u32 ths_trailcnt; /* (0x00080006) */
u32 hstxvregcnt; /* (0x00000020) */
u32 btacnt; /* (0x00000020) */
/* PLL */
/* Bps pr lane is (refclk_hz / pll_prd) * pll_fbd */
u16 pll_prd; /* PRD from Macro + 1 (0x0A) */
u16 pll_fbd; /* FBD from Macro + 1 (0x7D) */
};
struct tc358870_state {
struct tc358870_platform_data pdata; /* Bridge structure */
struct panel_out pout; /* Panel structure */
struct tegra_hdmi *hdmi;
struct i2c_client *i2c_client;
struct tegra_dc_mode *mode;
struct tegra_panel_ops *out_ops;
struct dentry *debugdir;
bool enabled;
bool power_down;
struct mutex lock;
/* edid */
u8 edid_blocks_written;
};
#endif /* _HDMI2DSI_TC358870_ */