1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4 * Zheng Yang <zhengyang@rock-chips.com>
7 #include <drm/drm_of.h>
8 #include <drm/drm_probe_helper.h>
10 #include <linux/clk.h>
11 #include <linux/mfd/syscon.h>
12 #include <linux/platform_device.h>
13 #include <linux/regmap.h>
15 #include "rk3066_hdmi.h"
17 #include "rockchip_drm_drv.h"
18 #include "rockchip_drm_vop.h"
20 #define DEFAULT_PLLA_RATE 30000000
22 struct hdmi_data_info
{
23 int vic
; /* The CEA Video ID (VIC) of the current drm display mode. */
25 unsigned int enc_out_format
;
26 unsigned int colorimetry
;
29 struct rk3066_hdmi_i2c
{
30 struct i2c_adapter adap
;
36 struct mutex i2c_lock
; /* For i2c operation. */
37 struct completion cmpltn
;
42 struct drm_device
*drm_dev
;
43 struct regmap
*grf_regmap
;
48 struct drm_connector connector
;
49 struct drm_encoder encoder
;
51 struct rk3066_hdmi_i2c
*i2c
;
52 struct i2c_adapter
*ddc
;
56 struct hdmi_data_info hdmi_data
;
57 struct drm_display_mode previous_mode
;
60 #define to_rk3066_hdmi(x) container_of(x, struct rk3066_hdmi, x)
62 static inline u8
hdmi_readb(struct rk3066_hdmi
*hdmi
, u16 offset
)
64 return readl_relaxed(hdmi
->regs
+ offset
);
67 static inline void hdmi_writeb(struct rk3066_hdmi
*hdmi
, u16 offset
, u32 val
)
69 writel_relaxed(val
, hdmi
->regs
+ offset
);
72 static inline void hdmi_modb(struct rk3066_hdmi
*hdmi
, u16 offset
,
75 u8 temp
= hdmi_readb(hdmi
, offset
) & ~msk
;
78 hdmi_writeb(hdmi
, offset
, temp
);
81 static void rk3066_hdmi_i2c_init(struct rk3066_hdmi
*hdmi
)
85 ddc_bus_freq
= (hdmi
->tmdsclk
>> 2) / HDMI_SCL_RATE
;
87 hdmi_writeb(hdmi
, HDMI_DDC_BUS_FREQ_L
, ddc_bus_freq
& 0xFF);
88 hdmi_writeb(hdmi
, HDMI_DDC_BUS_FREQ_H
, (ddc_bus_freq
>> 8) & 0xFF);
90 /* Clear the EDID interrupt flag and mute the interrupt. */
91 hdmi_modb(hdmi
, HDMI_INTR_MASK1
, HDMI_INTR_EDID_MASK
, 0);
92 hdmi_writeb(hdmi
, HDMI_INTR_STATUS1
, HDMI_INTR_EDID_MASK
);
95 static inline u8
rk3066_hdmi_get_power_mode(struct rk3066_hdmi
*hdmi
)
97 return hdmi_readb(hdmi
, HDMI_SYS_CTRL
) & HDMI_SYS_POWER_MODE_MASK
;
100 static void rk3066_hdmi_set_power_mode(struct rk3066_hdmi
*hdmi
, int mode
)
102 u8 current_mode
, next_mode
;
105 current_mode
= rk3066_hdmi_get_power_mode(hdmi
);
107 DRM_DEV_DEBUG(hdmi
->dev
, "mode :%d\n", mode
);
108 DRM_DEV_DEBUG(hdmi
->dev
, "current_mode :%d\n", current_mode
);
110 if (current_mode
== mode
)
114 if (current_mode
> mode
) {
115 next_mode
= current_mode
/ 2;
117 if (current_mode
< HDMI_SYS_POWER_MODE_A
)
118 next_mode
= HDMI_SYS_POWER_MODE_A
;
120 next_mode
= current_mode
* 2;
123 DRM_DEV_DEBUG(hdmi
->dev
, "%d: next_mode :%d\n", i
, next_mode
);
125 if (next_mode
!= HDMI_SYS_POWER_MODE_D
) {
126 hdmi_modb(hdmi
, HDMI_SYS_CTRL
,
127 HDMI_SYS_POWER_MODE_MASK
, next_mode
);
129 hdmi_writeb(hdmi
, HDMI_SYS_CTRL
,
130 HDMI_SYS_POWER_MODE_D
|
131 HDMI_SYS_PLL_RESET_MASK
);
132 usleep_range(90, 100);
133 hdmi_writeb(hdmi
, HDMI_SYS_CTRL
,
134 HDMI_SYS_POWER_MODE_D
|
135 HDMI_SYS_PLLB_RESET
);
136 usleep_range(90, 100);
137 hdmi_writeb(hdmi
, HDMI_SYS_CTRL
,
138 HDMI_SYS_POWER_MODE_D
);
140 current_mode
= next_mode
;
142 } while ((next_mode
!= mode
) && (i
< 5));
145 * When the IP controller isn't configured with accurate video timing,
146 * DDC_CLK should be equal to the PLLA frequency, which is 30MHz,
147 * so we need to init the TMDS rate to the PCLK rate and reconfigure
150 if (mode
< HDMI_SYS_POWER_MODE_D
)
151 hdmi
->tmdsclk
= DEFAULT_PLLA_RATE
;
155 rk3066_hdmi_upload_frame(struct rk3066_hdmi
*hdmi
, int setup_rc
,
156 union hdmi_infoframe
*frame
, u32 frame_index
,
157 u32 mask
, u32 disable
, u32 enable
)
160 hdmi_modb(hdmi
, HDMI_CP_AUTO_SEND_CTRL
, mask
, disable
);
162 hdmi_writeb(hdmi
, HDMI_CP_BUF_INDEX
, frame_index
);
165 u8 packed_frame
[HDMI_MAXIMUM_INFO_FRAME_SIZE
];
168 rc
= hdmi_infoframe_pack(frame
, packed_frame
,
169 sizeof(packed_frame
));
173 for (i
= 0; i
< rc
; i
++)
174 hdmi_writeb(hdmi
, HDMI_CP_BUF_ACC_HB0
+ i
* 4,
178 hdmi_modb(hdmi
, HDMI_CP_AUTO_SEND_CTRL
, mask
, enable
);
184 static int rk3066_hdmi_config_avi(struct rk3066_hdmi
*hdmi
,
185 struct drm_display_mode
*mode
)
187 union hdmi_infoframe frame
;
190 rc
= drm_hdmi_avi_infoframe_from_display_mode(&frame
.avi
,
191 &hdmi
->connector
, mode
);
193 if (hdmi
->hdmi_data
.enc_out_format
== HDMI_COLORSPACE_YUV444
)
194 frame
.avi
.colorspace
= HDMI_COLORSPACE_YUV444
;
195 else if (hdmi
->hdmi_data
.enc_out_format
== HDMI_COLORSPACE_YUV422
)
196 frame
.avi
.colorspace
= HDMI_COLORSPACE_YUV422
;
198 frame
.avi
.colorspace
= HDMI_COLORSPACE_RGB
;
200 frame
.avi
.colorimetry
= hdmi
->hdmi_data
.colorimetry
;
201 frame
.avi
.scan_mode
= HDMI_SCAN_MODE_NONE
;
203 return rk3066_hdmi_upload_frame(hdmi
, rc
, &frame
,
204 HDMI_INFOFRAME_AVI
, 0, 0, 0);
207 static int rk3066_hdmi_config_video_timing(struct rk3066_hdmi
*hdmi
,
208 struct drm_display_mode
*mode
)
210 int value
, vsync_offset
;
212 /* Set the details for the external polarity and interlace mode. */
213 value
= HDMI_EXT_VIDEO_SET_EN
;
214 value
|= mode
->flags
& DRM_MODE_FLAG_PHSYNC
?
215 HDMI_VIDEO_HSYNC_ACTIVE_HIGH
: HDMI_VIDEO_HSYNC_ACTIVE_LOW
;
216 value
|= mode
->flags
& DRM_MODE_FLAG_PVSYNC
?
217 HDMI_VIDEO_VSYNC_ACTIVE_HIGH
: HDMI_VIDEO_VSYNC_ACTIVE_LOW
;
218 value
|= mode
->flags
& DRM_MODE_FLAG_INTERLACE
?
219 HDMI_VIDEO_MODE_INTERLACE
: HDMI_VIDEO_MODE_PROGRESSIVE
;
221 if (hdmi
->hdmi_data
.vic
== 2 || hdmi
->hdmi_data
.vic
== 3)
226 value
|= vsync_offset
<< HDMI_VIDEO_VSYNC_OFFSET_SHIFT
;
227 hdmi_writeb(hdmi
, HDMI_EXT_VIDEO_PARA
, value
);
229 /* Set the details for the external video timing. */
230 value
= mode
->htotal
;
231 hdmi_writeb(hdmi
, HDMI_EXT_HTOTAL_L
, value
& 0xFF);
232 hdmi_writeb(hdmi
, HDMI_EXT_HTOTAL_H
, (value
>> 8) & 0xFF);
234 value
= mode
->htotal
- mode
->hdisplay
;
235 hdmi_writeb(hdmi
, HDMI_EXT_HBLANK_L
, value
& 0xFF);
236 hdmi_writeb(hdmi
, HDMI_EXT_HBLANK_H
, (value
>> 8) & 0xFF);
238 value
= mode
->htotal
- mode
->hsync_start
;
239 hdmi_writeb(hdmi
, HDMI_EXT_HDELAY_L
, value
& 0xFF);
240 hdmi_writeb(hdmi
, HDMI_EXT_HDELAY_H
, (value
>> 8) & 0xFF);
242 value
= mode
->hsync_end
- mode
->hsync_start
;
243 hdmi_writeb(hdmi
, HDMI_EXT_HDURATION_L
, value
& 0xFF);
244 hdmi_writeb(hdmi
, HDMI_EXT_HDURATION_H
, (value
>> 8) & 0xFF);
246 value
= mode
->vtotal
;
247 hdmi_writeb(hdmi
, HDMI_EXT_VTOTAL_L
, value
& 0xFF);
248 hdmi_writeb(hdmi
, HDMI_EXT_VTOTAL_H
, (value
>> 8) & 0xFF);
250 value
= mode
->vtotal
- mode
->vdisplay
;
251 hdmi_writeb(hdmi
, HDMI_EXT_VBLANK_L
, value
& 0xFF);
253 value
= mode
->vtotal
- mode
->vsync_start
+ vsync_offset
;
254 hdmi_writeb(hdmi
, HDMI_EXT_VDELAY
, value
& 0xFF);
256 value
= mode
->vsync_end
- mode
->vsync_start
;
257 hdmi_writeb(hdmi
, HDMI_EXT_VDURATION
, value
& 0xFF);
263 rk3066_hdmi_phy_write(struct rk3066_hdmi
*hdmi
, u16 offset
, u8 value
)
265 hdmi_writeb(hdmi
, offset
, value
);
266 hdmi_modb(hdmi
, HDMI_SYS_CTRL
,
267 HDMI_SYS_PLL_RESET_MASK
, HDMI_SYS_PLL_RESET
);
268 usleep_range(90, 100);
269 hdmi_modb(hdmi
, HDMI_SYS_CTRL
, HDMI_SYS_PLL_RESET_MASK
, 0);
270 usleep_range(900, 1000);
273 static void rk3066_hdmi_config_phy(struct rk3066_hdmi
*hdmi
)
275 /* TMDS uses the same frequency as dclk. */
276 hdmi_writeb(hdmi
, HDMI_DEEP_COLOR_MODE
, 0x22);
279 * The semi-public documentation does not describe the hdmi registers
280 * used by the function rk3066_hdmi_phy_write(), so we keep using
281 * these magic values for now.
283 if (hdmi
->tmdsclk
> 100000000) {
284 rk3066_hdmi_phy_write(hdmi
, 0x158, 0x0E);
285 rk3066_hdmi_phy_write(hdmi
, 0x15c, 0x00);
286 rk3066_hdmi_phy_write(hdmi
, 0x160, 0x60);
287 rk3066_hdmi_phy_write(hdmi
, 0x164, 0x00);
288 rk3066_hdmi_phy_write(hdmi
, 0x168, 0xDA);
289 rk3066_hdmi_phy_write(hdmi
, 0x16c, 0xA1);
290 rk3066_hdmi_phy_write(hdmi
, 0x170, 0x0e);
291 rk3066_hdmi_phy_write(hdmi
, 0x174, 0x22);
292 rk3066_hdmi_phy_write(hdmi
, 0x178, 0x00);
293 } else if (hdmi
->tmdsclk
> 50000000) {
294 rk3066_hdmi_phy_write(hdmi
, 0x158, 0x06);
295 rk3066_hdmi_phy_write(hdmi
, 0x15c, 0x00);
296 rk3066_hdmi_phy_write(hdmi
, 0x160, 0x60);
297 rk3066_hdmi_phy_write(hdmi
, 0x164, 0x00);
298 rk3066_hdmi_phy_write(hdmi
, 0x168, 0xCA);
299 rk3066_hdmi_phy_write(hdmi
, 0x16c, 0xA3);
300 rk3066_hdmi_phy_write(hdmi
, 0x170, 0x0e);
301 rk3066_hdmi_phy_write(hdmi
, 0x174, 0x20);
302 rk3066_hdmi_phy_write(hdmi
, 0x178, 0x00);
304 rk3066_hdmi_phy_write(hdmi
, 0x158, 0x02);
305 rk3066_hdmi_phy_write(hdmi
, 0x15c, 0x00);
306 rk3066_hdmi_phy_write(hdmi
, 0x160, 0x60);
307 rk3066_hdmi_phy_write(hdmi
, 0x164, 0x00);
308 rk3066_hdmi_phy_write(hdmi
, 0x168, 0xC2);
309 rk3066_hdmi_phy_write(hdmi
, 0x16c, 0xA2);
310 rk3066_hdmi_phy_write(hdmi
, 0x170, 0x0e);
311 rk3066_hdmi_phy_write(hdmi
, 0x174, 0x20);
312 rk3066_hdmi_phy_write(hdmi
, 0x178, 0x00);
316 static int rk3066_hdmi_setup(struct rk3066_hdmi
*hdmi
,
317 struct drm_display_mode
*mode
)
319 hdmi
->hdmi_data
.vic
= drm_match_cea_mode(mode
);
320 hdmi
->hdmi_data
.enc_out_format
= HDMI_COLORSPACE_RGB
;
322 if (hdmi
->hdmi_data
.vic
== 6 || hdmi
->hdmi_data
.vic
== 7 ||
323 hdmi
->hdmi_data
.vic
== 21 || hdmi
->hdmi_data
.vic
== 22 ||
324 hdmi
->hdmi_data
.vic
== 2 || hdmi
->hdmi_data
.vic
== 3 ||
325 hdmi
->hdmi_data
.vic
== 17 || hdmi
->hdmi_data
.vic
== 18)
326 hdmi
->hdmi_data
.colorimetry
= HDMI_COLORIMETRY_ITU_601
;
328 hdmi
->hdmi_data
.colorimetry
= HDMI_COLORIMETRY_ITU_709
;
330 hdmi
->tmdsclk
= mode
->clock
* 1000;
332 /* Mute video and audio output. */
333 hdmi_modb(hdmi
, HDMI_VIDEO_CTRL2
, HDMI_VIDEO_AUDIO_DISABLE_MASK
,
334 HDMI_AUDIO_DISABLE
| HDMI_VIDEO_DISABLE
);
336 /* Set power state to mode B. */
337 if (rk3066_hdmi_get_power_mode(hdmi
) != HDMI_SYS_POWER_MODE_B
)
338 rk3066_hdmi_set_power_mode(hdmi
, HDMI_SYS_POWER_MODE_B
);
340 /* Input video mode is RGB 24 bit. Use external data enable signal. */
341 hdmi_modb(hdmi
, HDMI_AV_CTRL1
,
342 HDMI_VIDEO_DE_MASK
, HDMI_VIDEO_EXTERNAL_DE
);
343 hdmi_writeb(hdmi
, HDMI_VIDEO_CTRL1
,
344 HDMI_VIDEO_OUTPUT_RGB444
|
345 HDMI_VIDEO_INPUT_DATA_DEPTH_8BIT
|
346 HDMI_VIDEO_INPUT_COLOR_RGB
);
347 hdmi_writeb(hdmi
, HDMI_DEEP_COLOR_MODE
, 0x20);
349 rk3066_hdmi_config_video_timing(hdmi
, mode
);
351 if (hdmi
->hdmi_data
.sink_is_hdmi
) {
352 hdmi_modb(hdmi
, HDMI_HDCP_CTRL
, HDMI_VIDEO_MODE_MASK
,
353 HDMI_VIDEO_MODE_HDMI
);
354 rk3066_hdmi_config_avi(hdmi
, mode
);
356 hdmi_modb(hdmi
, HDMI_HDCP_CTRL
, HDMI_VIDEO_MODE_MASK
, 0);
359 rk3066_hdmi_config_phy(hdmi
);
361 rk3066_hdmi_set_power_mode(hdmi
, HDMI_SYS_POWER_MODE_E
);
364 * When the IP controller is configured with accurate video
365 * timing, the TMDS clock source should be switched to
366 * DCLK_LCDC, so we need to init the TMDS rate to the pixel mode
367 * clock rate and reconfigure the DDC clock.
369 rk3066_hdmi_i2c_init(hdmi
);
371 /* Unmute video output. */
372 hdmi_modb(hdmi
, HDMI_VIDEO_CTRL2
,
373 HDMI_VIDEO_AUDIO_DISABLE_MASK
, HDMI_AUDIO_DISABLE
);
378 rk3066_hdmi_encoder_mode_set(struct drm_encoder
*encoder
,
379 struct drm_display_mode
*mode
,
380 struct drm_display_mode
*adj_mode
)
382 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(encoder
);
384 /* Store the display mode for plugin/DPMS poweron events. */
385 memcpy(&hdmi
->previous_mode
, adj_mode
, sizeof(hdmi
->previous_mode
));
388 static void rk3066_hdmi_encoder_enable(struct drm_encoder
*encoder
)
390 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(encoder
);
393 mux
= drm_of_encoder_active_endpoint_id(hdmi
->dev
->of_node
, encoder
);
395 val
= (HDMI_VIDEO_SEL
<< 16) | HDMI_VIDEO_SEL
;
397 val
= HDMI_VIDEO_SEL
<< 16;
399 regmap_write(hdmi
->grf_regmap
, GRF_SOC_CON0
, val
);
401 DRM_DEV_DEBUG(hdmi
->dev
, "hdmi encoder enable select: vop%s\n",
404 rk3066_hdmi_setup(hdmi
, &hdmi
->previous_mode
);
407 static void rk3066_hdmi_encoder_disable(struct drm_encoder
*encoder
)
409 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(encoder
);
411 DRM_DEV_DEBUG(hdmi
->dev
, "hdmi encoder disable\n");
413 if (rk3066_hdmi_get_power_mode(hdmi
) == HDMI_SYS_POWER_MODE_E
) {
414 hdmi_writeb(hdmi
, HDMI_VIDEO_CTRL2
,
415 HDMI_VIDEO_AUDIO_DISABLE_MASK
);
416 hdmi_modb(hdmi
, HDMI_VIDEO_CTRL2
,
417 HDMI_AUDIO_CP_LOGIC_RESET_MASK
,
418 HDMI_AUDIO_CP_LOGIC_RESET
);
419 usleep_range(500, 510);
421 rk3066_hdmi_set_power_mode(hdmi
, HDMI_SYS_POWER_MODE_A
);
425 rk3066_hdmi_encoder_mode_fixup(struct drm_encoder
*encoder
,
426 const struct drm_display_mode
*mode
,
427 struct drm_display_mode
*adj_mode
)
433 rk3066_hdmi_encoder_atomic_check(struct drm_encoder
*encoder
,
434 struct drm_crtc_state
*crtc_state
,
435 struct drm_connector_state
*conn_state
)
437 struct rockchip_crtc_state
*s
= to_rockchip_crtc_state(crtc_state
);
439 s
->output_mode
= ROCKCHIP_OUT_MODE_P888
;
440 s
->output_type
= DRM_MODE_CONNECTOR_HDMIA
;
446 struct drm_encoder_helper_funcs rk3066_hdmi_encoder_helper_funcs
= {
447 .enable
= rk3066_hdmi_encoder_enable
,
448 .disable
= rk3066_hdmi_encoder_disable
,
449 .mode_fixup
= rk3066_hdmi_encoder_mode_fixup
,
450 .mode_set
= rk3066_hdmi_encoder_mode_set
,
451 .atomic_check
= rk3066_hdmi_encoder_atomic_check
,
454 static const struct drm_encoder_funcs rk3066_hdmi_encoder_funcs
= {
455 .destroy
= drm_encoder_cleanup
,
458 static enum drm_connector_status
459 rk3066_hdmi_connector_detect(struct drm_connector
*connector
, bool force
)
461 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(connector
);
463 return (hdmi_readb(hdmi
, HDMI_HPG_MENS_STA
) & HDMI_HPG_IN_STATUS_HIGH
) ?
464 connector_status_connected
: connector_status_disconnected
;
467 static int rk3066_hdmi_connector_get_modes(struct drm_connector
*connector
)
469 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(connector
);
476 edid
= drm_get_edid(connector
, hdmi
->ddc
);
478 hdmi
->hdmi_data
.sink_is_hdmi
= drm_detect_hdmi_monitor(edid
);
479 drm_connector_update_edid_property(connector
, edid
);
480 ret
= drm_add_edid_modes(connector
, edid
);
487 static enum drm_mode_status
488 rk3066_hdmi_connector_mode_valid(struct drm_connector
*connector
,
489 struct drm_display_mode
*mode
)
491 u32 vic
= drm_match_cea_mode(mode
);
499 static struct drm_encoder
*
500 rk3066_hdmi_connector_best_encoder(struct drm_connector
*connector
)
502 struct rk3066_hdmi
*hdmi
= to_rk3066_hdmi(connector
);
504 return &hdmi
->encoder
;
508 rk3066_hdmi_probe_single_connector_modes(struct drm_connector
*connector
,
509 uint32_t maxX
, uint32_t maxY
)
516 return drm_helper_probe_single_connector_modes(connector
, maxX
, maxY
);
519 static void rk3066_hdmi_connector_destroy(struct drm_connector
*connector
)
521 drm_connector_unregister(connector
);
522 drm_connector_cleanup(connector
);
525 static const struct drm_connector_funcs rk3066_hdmi_connector_funcs
= {
526 .fill_modes
= rk3066_hdmi_probe_single_connector_modes
,
527 .detect
= rk3066_hdmi_connector_detect
,
528 .destroy
= rk3066_hdmi_connector_destroy
,
529 .reset
= drm_atomic_helper_connector_reset
,
530 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
531 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
535 struct drm_connector_helper_funcs rk3066_hdmi_connector_helper_funcs
= {
536 .get_modes
= rk3066_hdmi_connector_get_modes
,
537 .mode_valid
= rk3066_hdmi_connector_mode_valid
,
538 .best_encoder
= rk3066_hdmi_connector_best_encoder
,
542 rk3066_hdmi_register(struct drm_device
*drm
, struct rk3066_hdmi
*hdmi
)
544 struct drm_encoder
*encoder
= &hdmi
->encoder
;
545 struct device
*dev
= hdmi
->dev
;
547 encoder
->possible_crtcs
=
548 drm_of_find_possible_crtcs(drm
, dev
->of_node
);
551 * If we failed to find the CRTC(s) which this encoder is
552 * supposed to be connected to, it's because the CRTC has
553 * not been registered yet. Defer probing, and hope that
554 * the required CRTC is added later.
556 if (encoder
->possible_crtcs
== 0)
557 return -EPROBE_DEFER
;
559 drm_encoder_helper_add(encoder
, &rk3066_hdmi_encoder_helper_funcs
);
560 drm_encoder_init(drm
, encoder
, &rk3066_hdmi_encoder_funcs
,
561 DRM_MODE_ENCODER_TMDS
, NULL
);
563 hdmi
->connector
.polled
= DRM_CONNECTOR_POLL_HPD
;
565 drm_connector_helper_add(&hdmi
->connector
,
566 &rk3066_hdmi_connector_helper_funcs
);
567 drm_connector_init_with_ddc(drm
, &hdmi
->connector
,
568 &rk3066_hdmi_connector_funcs
,
569 DRM_MODE_CONNECTOR_HDMIA
,
572 drm_connector_attach_encoder(&hdmi
->connector
, encoder
);
577 static irqreturn_t
rk3066_hdmi_hardirq(int irq
, void *dev_id
)
579 struct rk3066_hdmi
*hdmi
= dev_id
;
580 irqreturn_t ret
= IRQ_NONE
;
583 if (rk3066_hdmi_get_power_mode(hdmi
) == HDMI_SYS_POWER_MODE_A
)
584 hdmi_writeb(hdmi
, HDMI_SYS_CTRL
, HDMI_SYS_POWER_MODE_B
);
586 interrupt
= hdmi_readb(hdmi
, HDMI_INTR_STATUS1
);
588 hdmi_writeb(hdmi
, HDMI_INTR_STATUS1
, interrupt
);
590 if (interrupt
& HDMI_INTR_EDID_MASK
) {
591 hdmi
->i2c
->stat
= interrupt
;
592 complete(&hdmi
->i2c
->cmpltn
);
595 if (interrupt
& (HDMI_INTR_HOTPLUG
| HDMI_INTR_MSENS
))
596 ret
= IRQ_WAKE_THREAD
;
601 static irqreturn_t
rk3066_hdmi_irq(int irq
, void *dev_id
)
603 struct rk3066_hdmi
*hdmi
= dev_id
;
605 drm_helper_hpd_irq_event(hdmi
->connector
.dev
);
610 static int rk3066_hdmi_i2c_read(struct rk3066_hdmi
*hdmi
, struct i2c_msg
*msgs
)
612 int length
= msgs
->len
;
616 ret
= wait_for_completion_timeout(&hdmi
->i2c
->cmpltn
, HZ
/ 10);
617 if (!ret
|| hdmi
->i2c
->stat
& HDMI_INTR_EDID_ERR
)
621 *buf
++ = hdmi_readb(hdmi
, HDMI_DDC_READ_FIFO_ADDR
);
626 static int rk3066_hdmi_i2c_write(struct rk3066_hdmi
*hdmi
, struct i2c_msg
*msgs
)
629 * The DDC module only supports read EDID message, so
630 * we assume that each word write to this i2c adapter
631 * should be the offset of the EDID word address.
633 if (msgs
->len
!= 1 ||
634 (msgs
->addr
!= DDC_ADDR
&& msgs
->addr
!= DDC_SEGMENT_ADDR
))
637 reinit_completion(&hdmi
->i2c
->cmpltn
);
639 if (msgs
->addr
== DDC_SEGMENT_ADDR
)
640 hdmi
->i2c
->segment_addr
= msgs
->buf
[0];
641 if (msgs
->addr
== DDC_ADDR
)
642 hdmi
->i2c
->ddc_addr
= msgs
->buf
[0];
644 /* Set edid fifo first address. */
645 hdmi_writeb(hdmi
, HDMI_EDID_FIFO_ADDR
, 0x00);
647 /* Set edid word address 0x00/0x80. */
648 hdmi_writeb(hdmi
, HDMI_EDID_WORD_ADDR
, hdmi
->i2c
->ddc_addr
);
650 /* Set edid segment pointer. */
651 hdmi_writeb(hdmi
, HDMI_EDID_SEGMENT_POINTER
, hdmi
->i2c
->segment_addr
);
656 static int rk3066_hdmi_i2c_xfer(struct i2c_adapter
*adap
,
657 struct i2c_msg
*msgs
, int num
)
659 struct rk3066_hdmi
*hdmi
= i2c_get_adapdata(adap
);
660 struct rk3066_hdmi_i2c
*i2c
= hdmi
->i2c
;
663 mutex_lock(&i2c
->i2c_lock
);
665 rk3066_hdmi_i2c_init(hdmi
);
667 /* Unmute HDMI EDID interrupt. */
668 hdmi_modb(hdmi
, HDMI_INTR_MASK1
,
669 HDMI_INTR_EDID_MASK
, HDMI_INTR_EDID_MASK
);
672 for (i
= 0; i
< num
; i
++) {
673 DRM_DEV_DEBUG(hdmi
->dev
,
674 "xfer: num: %d/%d, len: %d, flags: %#x\n",
675 i
+ 1, num
, msgs
[i
].len
, msgs
[i
].flags
);
677 if (msgs
[i
].flags
& I2C_M_RD
)
678 ret
= rk3066_hdmi_i2c_read(hdmi
, &msgs
[i
]);
680 ret
= rk3066_hdmi_i2c_write(hdmi
, &msgs
[i
]);
689 /* Mute HDMI EDID interrupt. */
690 hdmi_modb(hdmi
, HDMI_INTR_MASK1
, HDMI_INTR_EDID_MASK
, 0);
692 mutex_unlock(&i2c
->i2c_lock
);
697 static u32
rk3066_hdmi_i2c_func(struct i2c_adapter
*adapter
)
699 return I2C_FUNC_I2C
| I2C_FUNC_SMBUS_EMUL
;
702 static const struct i2c_algorithm rk3066_hdmi_algorithm
= {
703 .master_xfer
= rk3066_hdmi_i2c_xfer
,
704 .functionality
= rk3066_hdmi_i2c_func
,
707 static struct i2c_adapter
*rk3066_hdmi_i2c_adapter(struct rk3066_hdmi
*hdmi
)
709 struct i2c_adapter
*adap
;
710 struct rk3066_hdmi_i2c
*i2c
;
713 i2c
= devm_kzalloc(hdmi
->dev
, sizeof(*i2c
), GFP_KERNEL
);
715 return ERR_PTR(-ENOMEM
);
717 mutex_init(&i2c
->i2c_lock
);
718 init_completion(&i2c
->cmpltn
);
721 adap
->class = I2C_CLASS_DDC
;
722 adap
->owner
= THIS_MODULE
;
723 adap
->dev
.parent
= hdmi
->dev
;
724 adap
->dev
.of_node
= hdmi
->dev
->of_node
;
725 adap
->algo
= &rk3066_hdmi_algorithm
;
726 strlcpy(adap
->name
, "RK3066 HDMI", sizeof(adap
->name
));
727 i2c_set_adapdata(adap
, hdmi
);
729 ret
= i2c_add_adapter(adap
);
731 DRM_DEV_ERROR(hdmi
->dev
, "cannot add %s I2C adapter\n",
733 devm_kfree(hdmi
->dev
, i2c
);
739 DRM_DEV_DEBUG(hdmi
->dev
, "registered %s I2C bus driver\n", adap
->name
);
744 static int rk3066_hdmi_bind(struct device
*dev
, struct device
*master
,
747 struct platform_device
*pdev
= to_platform_device(dev
);
748 struct drm_device
*drm
= data
;
749 struct rk3066_hdmi
*hdmi
;
753 hdmi
= devm_kzalloc(dev
, sizeof(*hdmi
), GFP_KERNEL
);
759 hdmi
->regs
= devm_platform_ioremap_resource(pdev
, 0);
760 if (IS_ERR(hdmi
->regs
))
761 return PTR_ERR(hdmi
->regs
);
763 irq
= platform_get_irq(pdev
, 0);
767 hdmi
->hclk
= devm_clk_get(dev
, "hclk");
768 if (IS_ERR(hdmi
->hclk
)) {
769 DRM_DEV_ERROR(dev
, "unable to get HDMI hclk clock\n");
770 return PTR_ERR(hdmi
->hclk
);
773 ret
= clk_prepare_enable(hdmi
->hclk
);
775 DRM_DEV_ERROR(dev
, "cannot enable HDMI hclk clock: %d\n", ret
);
779 hdmi
->grf_regmap
= syscon_regmap_lookup_by_phandle(dev
->of_node
,
781 if (IS_ERR(hdmi
->grf_regmap
)) {
782 DRM_DEV_ERROR(dev
, "unable to get rockchip,grf\n");
783 ret
= PTR_ERR(hdmi
->grf_regmap
);
784 goto err_disable_hclk
;
787 /* internal hclk = hdmi_hclk / 25 */
788 hdmi_writeb(hdmi
, HDMI_INTERNAL_CLK_DIVIDER
, 25);
790 hdmi
->ddc
= rk3066_hdmi_i2c_adapter(hdmi
);
791 if (IS_ERR(hdmi
->ddc
)) {
792 ret
= PTR_ERR(hdmi
->ddc
);
794 goto err_disable_hclk
;
797 rk3066_hdmi_set_power_mode(hdmi
, HDMI_SYS_POWER_MODE_B
);
798 usleep_range(999, 1000);
799 hdmi_writeb(hdmi
, HDMI_INTR_MASK1
, HDMI_INTR_HOTPLUG
);
800 hdmi_writeb(hdmi
, HDMI_INTR_MASK2
, 0);
801 hdmi_writeb(hdmi
, HDMI_INTR_MASK3
, 0);
802 hdmi_writeb(hdmi
, HDMI_INTR_MASK4
, 0);
803 rk3066_hdmi_set_power_mode(hdmi
, HDMI_SYS_POWER_MODE_A
);
805 ret
= rk3066_hdmi_register(drm
, hdmi
);
807 goto err_disable_i2c
;
809 dev_set_drvdata(dev
, hdmi
);
811 ret
= devm_request_threaded_irq(dev
, irq
, rk3066_hdmi_hardirq
,
812 rk3066_hdmi_irq
, IRQF_SHARED
,
813 dev_name(dev
), hdmi
);
815 DRM_DEV_ERROR(dev
, "failed to request hdmi irq: %d\n", ret
);
816 goto err_cleanup_hdmi
;
822 hdmi
->connector
.funcs
->destroy(&hdmi
->connector
);
823 hdmi
->encoder
.funcs
->destroy(&hdmi
->encoder
);
825 i2c_put_adapter(hdmi
->ddc
);
827 clk_disable_unprepare(hdmi
->hclk
);
832 static void rk3066_hdmi_unbind(struct device
*dev
, struct device
*master
,
835 struct rk3066_hdmi
*hdmi
= dev_get_drvdata(dev
);
837 hdmi
->connector
.funcs
->destroy(&hdmi
->connector
);
838 hdmi
->encoder
.funcs
->destroy(&hdmi
->encoder
);
840 i2c_put_adapter(hdmi
->ddc
);
841 clk_disable_unprepare(hdmi
->hclk
);
844 static const struct component_ops rk3066_hdmi_ops
= {
845 .bind
= rk3066_hdmi_bind
,
846 .unbind
= rk3066_hdmi_unbind
,
849 static int rk3066_hdmi_probe(struct platform_device
*pdev
)
851 return component_add(&pdev
->dev
, &rk3066_hdmi_ops
);
854 static int rk3066_hdmi_remove(struct platform_device
*pdev
)
856 component_del(&pdev
->dev
, &rk3066_hdmi_ops
);
861 static const struct of_device_id rk3066_hdmi_dt_ids
[] = {
862 { .compatible
= "rockchip,rk3066-hdmi" },
865 MODULE_DEVICE_TABLE(of
, rk3066_hdmi_dt_ids
);
867 struct platform_driver rk3066_hdmi_driver
= {
868 .probe
= rk3066_hdmi_probe
,
869 .remove
= rk3066_hdmi_remove
,
871 .name
= "rockchip-rk3066-hdmi",
872 .of_match_table
= rk3066_hdmi_dt_ids
,