19 #include <linux/module.h>
22 #include <linux/slab.h>
23 #include <linux/types.h>
35 #define HDMI_SYSTEM_CTRL 0x00
36 #define HDMI_L_R_DATA_SWAP_CTRL_RPKT 0x01
38 #define HDMI_20_BIT_N_FOR_AUDIO_RPKT_15_8 0x02
39 #define HDMI_20_BIT_N_FOR_AUDIO_RPKT_7_0 0x03
40 #define HDMI_SPDIF_AUDIO_SAMP_FREQ_CTS 0x04
42 #define HDMI_INTERNAL_CTS_15_8 0x05
43 #define HDMI_INTERNAL_CTS_7_0 0x06
44 #define HDMI_EXTERNAL_CTS_19_16 0x07
45 #define HDMI_EXTERNAL_CTS_15_8 0x08
46 #define HDMI_EXTERNAL_CTS_7_0 0x09
47 #define HDMI_AUDIO_SETTING_1 0x0A
48 #define HDMI_AUDIO_SETTING_2 0x0B
49 #define HDMI_I2S_AUDIO_SET 0x0C
50 #define HDMI_DSD_AUDIO_SET 0x0D
51 #define HDMI_DEBUG_MONITOR_1 0x0E
52 #define HDMI_DEBUG_MONITOR_2 0x0F
53 #define HDMI_I2S_INPUT_PIN_SWAP 0x10
54 #define HDMI_AUDIO_STATUS_BITS_SETTING_1 0x11
55 #define HDMI_AUDIO_STATUS_BITS_SETTING_2 0x12
56 #define HDMI_CATEGORY_CODE 0x13
57 #define HDMI_SOURCE_NUM_AUDIO_WORD_LEN 0x14
58 #define HDMI_AUDIO_VIDEO_SETTING_1 0x15
59 #define HDMI_VIDEO_SETTING_1 0x16
60 #define HDMI_DEEP_COLOR_MODES 0x17
63 #define HDMI_COLOR_SPACE_CONVERSION_PARAMETERS 0x18
65 #define HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS 0x30
66 #define HDMI_EXTERNAL_H_TOTAL_7_0 0x31
67 #define HDMI_EXTERNAL_H_TOTAL_11_8 0x32
68 #define HDMI_EXTERNAL_H_BLANK_7_0 0x33
69 #define HDMI_EXTERNAL_H_BLANK_9_8 0x34
70 #define HDMI_EXTERNAL_H_DELAY_7_0 0x35
71 #define HDMI_EXTERNAL_H_DELAY_9_8 0x36
72 #define HDMI_EXTERNAL_H_DURATION_7_0 0x37
73 #define HDMI_EXTERNAL_H_DURATION_9_8 0x38
74 #define HDMI_EXTERNAL_V_TOTAL_7_0 0x39
75 #define HDMI_EXTERNAL_V_TOTAL_9_8 0x3A
76 #define HDMI_AUDIO_VIDEO_SETTING_2 0x3B
77 #define HDMI_EXTERNAL_V_BLANK 0x3D
78 #define HDMI_EXTERNAL_V_DELAY 0x3E
79 #define HDMI_EXTERNAL_V_DURATION 0x3F
80 #define HDMI_CTRL_PKT_MANUAL_SEND_CONTROL 0x40
81 #define HDMI_CTRL_PKT_AUTO_SEND 0x41
82 #define HDMI_AUTO_CHECKSUM_OPTION 0x42
83 #define HDMI_VIDEO_SETTING_2 0x45
84 #define HDMI_OUTPUT_OPTION 0x46
85 #define HDMI_SLIPHDMIT_PARAM_OPTION 0x51
86 #define HDMI_HSYNC_PMENT_AT_EMB_7_0 0x52
87 #define HDMI_HSYNC_PMENT_AT_EMB_15_8 0x53
88 #define HDMI_VSYNC_PMENT_AT_EMB_7_0 0x54
89 #define HDMI_VSYNC_PMENT_AT_EMB_14_8 0x55
90 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_1 0x56
91 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_2 0x57
92 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_3 0x58
93 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_5 0x59
94 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_6 0x5A
95 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_7 0x5B
96 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_8 0x5C
97 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_9 0x5D
98 #define HDMI_SLIPHDMIT_PARAM_SETTINGS_10 0x5E
99 #define HDMI_CTRL_PKT_BUF_INDEX 0x5F
100 #define HDMI_CTRL_PKT_BUF_ACCESS_HB0 0x60
101 #define HDMI_CTRL_PKT_BUF_ACCESS_HB1 0x61
102 #define HDMI_CTRL_PKT_BUF_ACCESS_HB2 0x62
103 #define HDMI_CTRL_PKT_BUF_ACCESS_PB0 0x63
104 #define HDMI_CTRL_PKT_BUF_ACCESS_PB1 0x64
105 #define HDMI_CTRL_PKT_BUF_ACCESS_PB2 0x65
106 #define HDMI_CTRL_PKT_BUF_ACCESS_PB3 0x66
107 #define HDMI_CTRL_PKT_BUF_ACCESS_PB4 0x67
108 #define HDMI_CTRL_PKT_BUF_ACCESS_PB5 0x68
109 #define HDMI_CTRL_PKT_BUF_ACCESS_PB6 0x69
110 #define HDMI_CTRL_PKT_BUF_ACCESS_PB7 0x6A
111 #define HDMI_CTRL_PKT_BUF_ACCESS_PB8 0x6B
112 #define HDMI_CTRL_PKT_BUF_ACCESS_PB9 0x6C
113 #define HDMI_CTRL_PKT_BUF_ACCESS_PB10 0x6D
114 #define HDMI_CTRL_PKT_BUF_ACCESS_PB11 0x6E
115 #define HDMI_CTRL_PKT_BUF_ACCESS_PB12 0x6F
116 #define HDMI_CTRL_PKT_BUF_ACCESS_PB13 0x70
117 #define HDMI_CTRL_PKT_BUF_ACCESS_PB14 0x71
118 #define HDMI_CTRL_PKT_BUF_ACCESS_PB15 0x72
119 #define HDMI_CTRL_PKT_BUF_ACCESS_PB16 0x73
120 #define HDMI_CTRL_PKT_BUF_ACCESS_PB17 0x74
121 #define HDMI_CTRL_PKT_BUF_ACCESS_PB18 0x75
122 #define HDMI_CTRL_PKT_BUF_ACCESS_PB19 0x76
123 #define HDMI_CTRL_PKT_BUF_ACCESS_PB20 0x77
124 #define HDMI_CTRL_PKT_BUF_ACCESS_PB21 0x78
125 #define HDMI_CTRL_PKT_BUF_ACCESS_PB22 0x79
126 #define HDMI_CTRL_PKT_BUF_ACCESS_PB23 0x7A
127 #define HDMI_CTRL_PKT_BUF_ACCESS_PB24 0x7B
128 #define HDMI_CTRL_PKT_BUF_ACCESS_PB25 0x7C
129 #define HDMI_CTRL_PKT_BUF_ACCESS_PB26 0x7D
130 #define HDMI_CTRL_PKT_BUF_ACCESS_PB27 0x7E
131 #define HDMI_EDID_KSV_FIFO_ACCESS_WINDOW 0x80
132 #define HDMI_DDC_BUS_ACCESS_FREQ_CTRL_7_0 0x81
133 #define HDMI_DDC_BUS_ACCESS_FREQ_CTRL_15_8 0x82
134 #define HDMI_INTERRUPT_MASK_1 0x92
135 #define HDMI_INTERRUPT_MASK_2 0x93
136 #define HDMI_INTERRUPT_STATUS_1 0x94
137 #define HDMI_INTERRUPT_STATUS_2 0x95
138 #define HDMI_INTERRUPT_MASK_3 0x96
139 #define HDMI_INTERRUPT_MASK_4 0x97
140 #define HDMI_INTERRUPT_STATUS_3 0x98
141 #define HDMI_INTERRUPT_STATUS_4 0x99
142 #define HDMI_SOFTWARE_HDCP_CONTROL_1 0x9A
143 #define HDMI_FRAME_COUNTER 0x9C
144 #define HDMI_FRAME_COUNTER_FOR_RI_CHECK 0x9D
145 #define HDMI_HDCP_CONTROL 0xAF
146 #define HDMI_RI_FRAME_COUNT_REGISTER 0xB2
147 #define HDMI_DDC_BUS_CONTROL 0xB7
148 #define HDMI_HDCP_STATUS 0xB8
149 #define HDMI_SHA0 0xB9
150 #define HDMI_SHA1 0xBA
151 #define HDMI_SHA2 0xBB
152 #define HDMI_SHA3 0xBC
153 #define HDMI_SHA4 0xBD
154 #define HDMI_BCAPS_READ 0xBE
155 #define HDMI_AKSV_BKSV_7_0_MONITOR 0xBF
156 #define HDMI_AKSV_BKSV_15_8_MONITOR 0xC0
157 #define HDMI_AKSV_BKSV_23_16_MONITOR 0xC1
158 #define HDMI_AKSV_BKSV_31_24_MONITOR 0xC2
159 #define HDMI_AKSV_BKSV_39_32_MONITOR 0xC3
160 #define HDMI_EDID_SEGMENT_POINTER 0xC4
161 #define HDMI_EDID_WORD_ADDRESS 0xC5
162 #define HDMI_EDID_DATA_FIFO_ADDRESS 0xC6
163 #define HDMI_NUM_OF_HDMI_DEVICES 0xC7
164 #define HDMI_HDCP_ERROR_CODE 0xC8
165 #define HDMI_100MS_TIMER_SET 0xC9
166 #define HDMI_5SEC_TIMER_SET 0xCA
167 #define HDMI_RI_READ_COUNT 0xCB
168 #define HDMI_AN_SEED 0xCC
169 #define HDMI_MAX_NUM_OF_RCIVRS_ALLOWED 0xCD
170 #define HDMI_HDCP_MEMORY_ACCESS_CONTROL_1 0xCE
171 #define HDMI_HDCP_MEMORY_ACCESS_CONTROL_2 0xCF
172 #define HDMI_HDCP_CONTROL_2 0xD0
173 #define HDMI_HDCP_KEY_MEMORY_CONTROL 0xD2
174 #define HDMI_COLOR_SPACE_CONV_CONFIG_1 0xD3
175 #define HDMI_VIDEO_SETTING_3 0xD4
176 #define HDMI_RI_7_0 0xD5
177 #define HDMI_RI_15_8 0xD6
179 #define HDMI_SHA_RD 0xD8
180 #define HDMI_RI_7_0_SAVED 0xD9
181 #define HDMI_RI_15_8_SAVED 0xDA
182 #define HDMI_PJ_SAVED 0xDB
183 #define HDMI_NUM_OF_DEVICES 0xDC
184 #define HDMI_HOT_PLUG_MSENS_STATUS 0xDF
185 #define HDMI_BCAPS_WRITE 0xE0
186 #define HDMI_BSTAT_7_0 0xE1
187 #define HDMI_BSTAT_15_8 0xE2
188 #define HDMI_BKSV_7_0 0xE3
189 #define HDMI_BKSV_15_8 0xE4
190 #define HDMI_BKSV_23_16 0xE5
191 #define HDMI_BKSV_31_24 0xE6
192 #define HDMI_BKSV_39_32 0xE7
193 #define HDMI_AN_7_0 0xE8
194 #define HDMI_AN_15_8 0xE9
195 #define HDMI_AN_23_16 0xEA
196 #define HDMI_AN_31_24 0xEB
197 #define HDMI_AN_39_32 0xEC
198 #define HDMI_AN_47_40 0xED
199 #define HDMI_AN_55_48 0xEE
200 #define HDMI_AN_63_56 0xEF
201 #define HDMI_PRODUCT_ID 0xF0
202 #define HDMI_REVISION_ID 0xF1
203 #define HDMI_TEST_MODE 0xFE
206 #define HDMI_HTOP1_TEST_MODE 0x0000
207 #define HDMI_HTOP1_VIDEO_INPUT 0x0008
208 #define HDMI_HTOP1_CORE_RSTN 0x000C
209 #define HDMI_HTOP1_PLLBW 0x0018
210 #define HDMI_HTOP1_CLK_TO_PHY 0x001C
211 #define HDMI_HTOP1_VIDEO_INPUT2 0x0020
212 #define HDMI_HTOP1_TISEMP0_1 0x0024
213 #define HDMI_HTOP1_TISEMP2_C 0x0028
214 #define HDMI_HTOP1_TISIDRV 0x002C
215 #define HDMI_HTOP1_TISEN 0x0034
216 #define HDMI_HTOP1_TISDREN 0x0038
217 #define HDMI_HTOP1_CISRANGE 0x003C
218 #define HDMI_HTOP1_ENABLE_SELECTOR 0x0040
219 #define HDMI_HTOP1_MACRO_RESET 0x0044
220 #define HDMI_HTOP1_PLL_CALIBRATION 0x0048
221 #define HDMI_HTOP1_RE_CALIBRATION 0x004C
222 #define HDMI_HTOP1_CURRENT 0x0050
223 #define HDMI_HTOP1_PLL_LOCK_DETECT 0x0054
224 #define HDMI_HTOP1_PHY_TEST_MODE 0x0058
225 #define HDMI_HTOP1_CLK_SET 0x0080
226 #define HDMI_HTOP1_DDC_FAIL_SAFE 0x0084
227 #define HDMI_HTOP1_PRBS 0x0088
228 #define HDMI_HTOP1_EDID_AINC_CONTROL 0x008C
229 #define HDMI_HTOP1_HTOP_DCL_MODE 0x00FC
230 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF0 0x0100
231 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF1 0x0104
232 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF2 0x0108
233 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF3 0x010C
234 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF0_C 0x0110
235 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF1_C 0x0114
236 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF2_C 0x0118
237 #define HDMI_HTOP1_HTOP_DCL_FRC_COEF3_C 0x011C
238 #define HDMI_HTOP1_HTOP_DCL_FRC_MODE 0x0120
239 #define HDMI_HTOP1_HTOP_DCL_RECT_START1 0x0124
240 #define HDMI_HTOP1_HTOP_DCL_RECT_SIZE1 0x0128
241 #define HDMI_HTOP1_HTOP_DCL_RECT_START2 0x012C
242 #define HDMI_HTOP1_HTOP_DCL_RECT_SIZE2 0x0130
243 #define HDMI_HTOP1_HTOP_DCL_RECT_START3 0x0134
244 #define HDMI_HTOP1_HTOP_DCL_RECT_SIZE3 0x0138
245 #define HDMI_HTOP1_HTOP_DCL_RECT_START4 0x013C
246 #define HDMI_HTOP1_HTOP_DCL_RECT_SIZE4 0x0140
247 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y1_1 0x0144
248 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y1_2 0x0148
249 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB1_1 0x014C
250 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB1_2 0x0150
251 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR1_1 0x0154
252 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR1_2 0x0158
253 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y2_1 0x015C
254 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_Y2_2 0x0160
255 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB2_1 0x0164
256 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CB2_2 0x0168
257 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR2_1 0x016C
258 #define HDMI_HTOP1_HTOP_DCL_FIL_PARA_CR2_2 0x0170
259 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_Y1 0x0174
260 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_CB1 0x0178
261 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_CR1 0x017C
262 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_Y2 0x0180
263 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_CB2 0x0184
264 #define HDMI_HTOP1_HTOP_DCL_COR_PARA_CR2 0x0188
265 #define HDMI_HTOP1_EDID_DATA_READ 0x0200
295 #define entity_to_sh_hdmi(e) container_of(e, struct sh_hdmi, entity)
313 static u8 __hdmi_read32(
struct sh_hdmi *hdmi,
u8 reg)
318 static void hdmi_write(
struct sh_hdmi *hdmi,
u8 data,
u8 reg)
320 hdmi->
write(hdmi, data, reg);
325 return hdmi->
read(hdmi, reg);
330 u8 val = hdmi_read(hdmi, reg);
333 val |= (data &
mask);
335 hdmi_write(hdmi, val, reg);
338 static void hdmi_htop1_write(
struct sh_hdmi *hdmi,
u32 data,
u32 reg)
355 struct sh_hdmi *hdmi = snd_soc_codec_get_drvdata(codec);
357 return hdmi_read(hdmi, reg);
364 struct sh_hdmi *hdmi = snd_soc_codec_get_drvdata(codec);
366 hdmi_write(hdmi, value, reg);
371 .name =
"sh_mobile_hdmi-hifi",
373 .stream_name =
"Playback",
386 dev_info(codec->
dev,
"SH Mobile HDMI Audio Codec");
392 .probe = sh_hdmi_snd_probe,
393 .read = sh_hdmi_snd_read,
394 .write = sh_hdmi_snd_write,
402 static void sh_hdmi_external_video_param(
struct sh_hdmi *hdmi)
405 u16 htotal, hblank, hdelay, vtotal, vblank, vdelay, voffset;
434 dev_dbg(hdmi->
dev,
"H: %u, %u, %u, %u; V: %u, %u, %u, %u; sync 0x%x\n",
436 vtotal, vblank, vdelay, mode->
vsync_len, sync);
463 hdmi_write(hdmi, sync | 1 | (voffset << 4),
470 static void sh_hdmi_video_config(
struct sh_hdmi *hdmi)
498 static void sh_hdmi_audio_config(
struct sh_hdmi *hdmi)
584 static void sh_hdmi_phy_config(
struct sh_hdmi *hdmi)
586 if (hdmi->
mode.pixclock < 10000) {
597 }
else if (hdmi->
mode.pixclock < 30000) {
653 static void sh_hdmi_avi_infoframe_setup(
struct sh_hdmi *hdmi)
736 static void sh_hdmi_audio_infoframe_setup(
struct sh_hdmi *hdmi)
779 static void sh_hdmi_configure(
struct sh_hdmi *hdmi)
782 sh_hdmi_video_config(hdmi);
785 sh_hdmi_audio_config(hdmi);
788 sh_hdmi_phy_config(hdmi);
791 sh_hdmi_avi_infoframe_setup(hdmi);
794 sh_hdmi_audio_infoframe_setup(hdmi);
813 static unsigned long sh_hdmi_rate_error(
struct sh_hdmi *hdmi,
815 unsigned long *hdmi_rate,
unsigned long *parent_rate)
821 if ((
long)*hdmi_rate < 0)
830 dev_dbg(hdmi->
dev,
"%u-%u-%u-%u x %u-%u-%u-%u\n",
836 dev_dbg(hdmi->
dev,
"\t@%lu(+/-%lu)Hz, e=%lu / 1000, r=%uHz, p=%luHz\n", target,
837 rate_error, rate_error ? 10000 / (10 * target / rate_error) : 0,
843 static int sh_hdmi_read_edid(
struct sh_hdmi *hdmi,
unsigned long *hdmi_rate,
844 unsigned long *parent_rate)
848 unsigned int f_width = 0, f_height = 0, f_refresh = 0;
849 unsigned long found_rate_error =
ULONG_MAX;
850 bool scanning =
false, preferred_bad =
false;
851 bool use_edid_mode =
false;
858 for (i = 0; i < 128; i++) {
879 dev_dbg(hdmi->
dev,
"%d main modes, %d extension blocks\n",
882 dev_dbg(hdmi->
dev,
"Extension %u detected, DTD start %u\n",
909 if (forced && *forced) {
911 i =
sscanf(forced,
"%ux%u@%u",
912 &f_width, &f_height, &f_refresh);
920 dev_dbg(hdmi->
dev,
"Forced mode %ux%u@%uHz\n",
921 f_width, f_height, f_refresh);
925 for (i = 0, mode = hdmi->
monspec.modedb;
926 i < hdmi->monspec.modedb_len && scanning;
928 unsigned long rate_error;
930 if (!f_width && !f_height) {
941 }
else if (f_width != mode->
xres || f_height != mode->
yres) {
946 rate_error = sh_hdmi_rate_error(hdmi, mode, hdmi_rate, parent_rate);
949 if (f_refresh == mode->
refresh || (!f_refresh && !rate_error))
957 else if (found && found_rate_error <= rate_error)
972 preferred_bad =
true;
977 found_rate_error = rate_error;
978 use_edid_mode =
true;
987 if (!found && hdmi->
entity.def_mode.xres != 0) {
988 found = &hdmi->
entity.def_mode;
989 found_rate_error = sh_hdmi_rate_error(hdmi, found, hdmi_rate,
999 else if (found->
xres == 720 && found->
yres == 480 && found->
refresh == 60)
1001 else if (found->
xres == 720 && found->
yres == 576 && found->
refresh == 50)
1003 else if (found->
xres == 1280 && found->
yres == 720 && found->
refresh == 60)
1005 else if (found->
xres == 1920 && found->
yres == 1080 && found->
refresh == 24)
1007 else if (found->
xres == 1920 && found->
yres == 1080 && found->
refresh == 50)
1009 else if (found->
xres == 1920 && found->
yres == 1080 && found->
refresh == 60)
1014 dev_dbg(hdmi->
dev,
"Using %s %s mode %ux%u@%uHz (%luHz), "
1015 "clock error %luHz\n", use_edid_mode ?
"EDID" :
"default",
1020 hdmi->
mode = *found;
1021 sh_hdmi_external_video_param(hdmi);
1050 if (printk_ratelimit())
1051 dev_dbg(hdmi->
dev,
"IRQ #%d: Status #1: 0x%x & 0x%x, #2: 0x%x & 0x%x\n",
1052 irq, status1, mask1, status2, mask2);
1054 if (!((status1 & mask1) | (status2 & mask2))) {
1056 }
else if (status1 & 0xc0) {
1065 if ((msens & 0xC0) == 0xC0) {
1078 }
else if (!(status1 & 0x80)) {
1086 }
else if (status1 & 2) {
1092 }
else if (status1 & 4) {
1105 dev_dbg(hdmi->
dev,
"%s(%p): state %x\n", __func__, hdmi,
1129 dev_dbg(hdmi->
dev,
"%s(%p)\n", __func__, hdmi);
1135 .display_on = sh_hdmi_display_on,
1136 .display_off = sh_hdmi_display_off,
1148 static long sh_hdmi_clk_configure(
struct sh_hdmi *hdmi,
unsigned long hdmi_rate,
1149 unsigned long parent_rate)
1156 dev_warn(hdmi->
dev,
"Cannot set parent rate %ld: %d\n", parent_rate, ret);
1159 dev_dbg(hdmi->
dev,
"HDMI set parent frequency %lu\n", parent_rate);
1165 dev_warn(hdmi->
dev,
"Cannot set rate %ld: %d\n", hdmi_rate, ret);
1168 dev_dbg(hdmi->
dev,
"HDMI set frequency %lu\n", hdmi_rate);
1181 dev_dbg(hdmi->
dev,
"%s(%p): begin, hotplug status %d\n", __func__, hdmi,
1185 unsigned long parent_rate = 0, hdmi_rate;
1187 ret = sh_hdmi_read_edid(hdmi, &hdmi_rate, &parent_rate);
1194 ret = sh_hdmi_clk_configure(hdmi, hdmi_rate, parent_rate);
1199 sh_hdmi_configure(hdmi);
1219 if (ret < 0 && ret != -
EAGAIN)
1222 dev_dbg(hdmi->
dev,
"%s(%p): end\n", __func__, hdmi);
1225 static void sh_hdmi_htop1_init(
struct sh_hdmi *hdmi)
1228 hdmi_htop1_write(hdmi, 0x0000000b, 0x0010);
1281 if (!res || !pdata || irq < 0)
1288 dev_err(&pdev->
dev,
"htop1 needs register base\n");
1295 dev_err(&pdev->
dev,
"Cannot allocate device data\n");
1301 hdmi->
entity.ops = &sh_hdmi_ops;
1306 dev_err(&pdev->
dev,
"Unable to get clock: %d\n", ret);
1312 hdmi->
write = __hdmi_write32;
1313 hdmi->
read = __hdmi_read32;
1315 hdmi->
write = __hdmi_write8;
1316 hdmi->
read = __hdmi_read8;
1322 rate = sh_hdmi_clk_configure(hdmi, rate, 0);
1331 dev_err(hdmi->
dev,
"Cannot enable clock: %d\n", ret);
1335 dev_dbg(&pdev->
dev,
"Enabled HDMI clock at %luHz\n", rate);
1338 dev_err(&pdev->
dev,
"HDMI register region already claimed\n");
1345 dev_err(&pdev->
dev,
"HDMI register region already claimed\n");
1350 platform_set_drvdata(pdev, &hdmi->
entity);
1355 pm_runtime_get_sync(&pdev->
dev);
1368 dev_err(&pdev->
dev,
"control register region already claimed\n");
1372 sh_hdmi_htop1_init(hdmi);
1376 dev_info(&pdev->
dev,
"Detected HDMI controller 0x%x:0x%x\n",
1380 dev_name(&pdev->
dev), hdmi);
1382 dev_err(&pdev->
dev,
"Unable to request irq: %d\n", ret);
1387 &soc_codec_dev_sh_hdmi, &sh_hdmi_dai, 1);
1389 dev_err(&pdev->
dev,
"codec registration failed\n");
1401 pm_runtime_put(&pdev->
dev);
1402 pm_runtime_disable(&pdev->
dev);
1428 pm_runtime_put(&pdev->
dev);
1429 pm_runtime_disable(&pdev->
dev);
1442 .remove =
__exit_p(sh_hdmi_remove),
1444 .name =
"sh-mobile-hdmi",
1448 static int __init sh_hdmi_init(
void)
1454 static void __exit sh_hdmi_exit(
void)