drivers: video: tegra: Add blacklist for a user TV
[linux-3.10.git] / drivers / video / tegra / dc / edid.h
1 /*
2  * drivers/video/tegra/dc/edid.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  * Author: Erik Gilling <konkers@android.com>
6  *
7  * Copyright (c) 2011-2015, NVIDIA CORPORATION.  All rights reserved.
8  *
9  * This software is licensed under the terms of the GNU General Public
10  * License version 2, as published by the Free Software Foundation, and
11  * may be copied, distributed, and modified under those terms.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  */
19
20 #ifndef __DRIVERS_VIDEO_TEGRA_DC_EDID_H
21 #define __DRIVERS_VIDEO_TEGRA_DC_EDID_H
22
23 #include <linux/i2c.h>
24 #include <linux/wait.h>
25 #include <mach/dc.h>
26
27 #define TEGRA_DC_Y420_30        1       /* YCbCr 4:2:0 deep color 30bpp */
28 #define TEGRA_DC_Y420_36        2       /* YCbCr 4:2:0 deep color 36bpp */
29 #define TEGRA_DC_Y420_48        4       /* YCbCr 4:2:0 deep color 48bpp */
30 #define TEGRA_DC_Y420_MASK      (TEGRA_DC_Y420_30 | \
31                                 TEGRA_DC_Y420_36 | TEGRA_DC_Y420_48)
32
33 #define TEGRA_EDID_MAX_RETRY 5
34 #define TEGRA_EDID_MIN_RETRY_DELAY_US 200
35 #define TEGRA_EDID_MAX_RETRY_DELAY_US (TEGRA_EDID_MIN_RETRY_DELAY_US + 200)
36
37 enum {
38         CEA_DATA_BLOCK_RSVD0,
39         CEA_DATA_BLOCK_AUDIO,
40         CEA_DATA_BLOCK_VIDEO,
41         CEA_DATA_BLOCK_VENDOR,
42         CEA_DATA_BLOCK_SPEAKER_ALLOC,
43         CEA_DATA_BLOCK_VESA_DISP_TRANS_CHAR,
44         CEA_DATA_BLOCK_RSVD1,
45         CEA_DATA_BLOCK_EXT,
46         CEA_DATA_BLOCK_MAX_CNT,
47 };
48
49 enum {
50         /* video blocks */
51         CEA_DATA_BLOCK_EXT_VCDB = 0, /* video capability data block */
52         CEA_DATA_BLOCK_EXT_VSVDB = 1, /* vendor specific video data block */
53         CEA_DATA_BLOCK_EXT_VESA_DDDB = 2, /* VESA display device data block */
54         CEA_DATA_BLOCK_EXT_VESA_VTBE = 3, /* VESA video timing block ext */
55         CEA_DATA_BLOCK_EXT_HDMI_VDB = 4, /* rsvd for HDMI video data block */
56         CEA_DATA_BLOCK_EXT_CDB = 5, /* colorimetry data block */
57         CEA_DATA_BLOCK_EXT_HDR = 6, /* HDR data block */
58         /* 7-12 rsvd for other video related blocks */
59         CEA_DATA_BLOCK_EXT_VFPDB = 13, /* video format preference data block */
60         CEA_DATA_BLOCK_EXT_Y420VDB = 14, /* YCbCr 4:2:0 video data block */
61         CEA_DATA_BLOCK_EXT_Y420CMDB = 15, /* YCbCr 4:2:0 cap map data block */
62
63         /* audio blocks */
64         CEA_DATA_BLOCK_EXT_CEA_MAF = 16, /* rsvd CEA misc audio fields */
65         CEA_DATA_BLOCK_EXT_VSADB = 17, /* vendor specific audio data block */
66         CEA_DATA_BLOCK_EXT_HDMI_ADB = 18, /* rsvd HDMI audio data block */
67         /* 19-31 rsvd for other audio related blocks */
68
69         CEA_DATA_BLOCK_EXT_IDB = 32, /* infoframe data block */
70         /* 33-255 rsvd */
71 };
72
73 #define ELD_MAX_MNL     16
74 #define ELD_MAX_SAD     16
75 #define ELD_MAX_SAD_BYTES (ELD_MAX_SAD * 3)
76
77 struct tegra_edid_pvt;
78
79 #define EDID_BASE_HEADER_SIZE 8
80 static const unsigned char edid_base_header[EDID_BASE_HEADER_SIZE] = {
81         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
82 };
83
84 typedef int (*i2c_transfer_func_t)(struct tegra_dc *dc, struct i2c_msg *msgs,
85         int num);
86
87 struct tegra_dc_i2c_ops {
88         i2c_transfer_func_t i2c_transfer;
89 };
90
91 enum {
92         EDID_SRC_PANEL,
93         EDID_SRC_DT,
94 };
95
96 /* Flag panel edid checksum is corrupted.
97  * SW fixes checksum before passing on the
98  * edid block to parser. For now just represent checksum
99  * corruption on any of the edid blocks.
100  */
101 #define EDID_ERRORS_CHECKSUM_CORRUPTED  0x01
102
103 /* Flag edid read failed after all retries. */
104 #define EDID_ERRORS_READ_FAILED         0x02
105
106 /* Flag fallback edid is in use. */
107 #define EDID_ERRORS_USING_FALLBACK      0x04
108
109 #define TEGRA_EDID_QUIRK_NONE      (0)
110 /* TV doesn't support YUV420, but declares support */
111 #define TEGRA_EDID_QUIRK_NO_YUV (1 << 0)
112
113 struct tegra_edid {
114         struct tegra_edid_pvt   *data;
115
116         struct mutex            lock;
117         struct tegra_dc_i2c_ops i2c_ops;
118         struct tegra_dc         *dc;
119
120         /* Bitmap to flag EDID reading / parsing error conditions. */
121         u8 errors;
122 };
123
124 /*
125  * ELD: EDID Like Data
126  */
127 struct tegra_edid_hdmi_eld {
128         u8      baseline_len;
129         u8      eld_ver;
130         u8      cea_edid_ver;
131         char    monitor_name[ELD_MAX_MNL + 1];
132         u8      mnl;
133         u8      manufacture_id[2];
134         u8      product_id[2];
135         u8      port_id[8];
136         u8      support_hdcp;
137         u8      support_ai;
138         u8      conn_type;
139         u8      aud_synch_delay;
140         u8      spk_alloc;
141         u8      sad_count;
142         u8      sad[ELD_MAX_SAD_BYTES];
143 };
144
145 struct tegra_edid *tegra_edid_create(struct tegra_dc *dc,
146         i2c_transfer_func_t func);
147 void tegra_edid_destroy(struct tegra_edid *edid);
148 int tegra_edid_get_monspecs(struct tegra_edid *edid,
149                                 struct fb_monspecs *specs);
150 u16 tegra_edid_get_cd_flag(struct tegra_edid *edid);
151 u16 tegra_edid_get_ex_hdr_cap(struct tegra_edid *edid);
152 u16 tegra_edid_get_max_clk_rate(struct tegra_edid *edid);
153 bool tegra_edid_is_scdc_present(struct tegra_edid *edid);
154 bool tegra_edid_is_420db_present(struct tegra_edid *edid);
155 bool tegra_edid_is_hfvsdb_present(struct tegra_edid *edid);
156 u16 tegra_edid_get_ex_colorimetry(struct tegra_edid *edid);
157 int tegra_edid_get_eld(struct tegra_edid *edid, struct tegra_edid_hdmi_eld *elddata);
158 u32 tegra_edid_get_quirks(struct tegra_edid *edid);
159 u32 tegra_edid_lookup_quirks(const char *manufacturer, u32 model,
160         const char *monitor_name);
161 struct tegra_dc_edid *tegra_edid_get_data(struct tegra_edid *edid);
162 void tegra_edid_put_data(struct tegra_dc_edid *data);
163 int tegra_dc_edid_blob(struct tegra_dc *dc, struct i2c_msg *msgs, int num);
164
165 int tegra_edid_underscan_supported(struct tegra_edid *edid);
166 int tegra_edid_i2c_adap_change_rate(struct i2c_adapter *i2c_adap, int rate);
167 int tegra_edid_read_block(struct tegra_edid *edid, int block, u8 *data);
168 int tegra_edid_audio_supported(struct tegra_edid *edid);
169 #endif