static void sun4i_hdmi_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { struct sun4i_hdmi *hdmi = drm_encoder_to_sun4i_hdmi(encoder); struct sun4i_crtc *crtc = drm_crtc_to_sun4i_crtc(encoder->crtc); struct sun4i_tcon *tcon = crtc->tcon; unsigned int x, y; u32 val; sun4i_tcon1_mode_set(tcon, mode); sun4i_tcon_set_mux(tcon, 1, encoder); clk_set_rate(tcon->sclk1, mode->crtc_clock * 1000); clk_set_rate(hdmi->mod_clk, mode->crtc_clock * 1000); clk_set_rate(hdmi->tmds_clk, mode->crtc_clock * 1000); /* Set input sync enable */ writel(SUN4I_HDMI_UNKNOWN_INPUT_SYNC, hdmi->base + SUN4I_HDMI_UNKNOWN_REG); /* Setup timing registers */ writel(SUN4I_HDMI_VID_TIMING_X(mode->hdisplay) | SUN4I_HDMI_VID_TIMING_Y(mode->vdisplay), hdmi->base + SUN4I_HDMI_VID_TIMING_ACT_REG); x = mode->htotal - mode->hsync_start; y = mode->vtotal - mode->vsync_start; writel(SUN4I_HDMI_VID_TIMING_X(x) | SUN4I_HDMI_VID_TIMING_Y(y), hdmi->base + SUN4I_HDMI_VID_TIMING_BP_REG); x = mode->hsync_start - mode->hdisplay; y = mode->vsync_start - mode->vdisplay; writel(SUN4I_HDMI_VID_TIMING_X(x) | SUN4I_HDMI_VID_TIMING_Y(y), hdmi->base + SUN4I_HDMI_VID_TIMING_FP_REG); x = mode->hsync_end - mode->hsync_start; y = mode->vsync_end - mode->vsync_start; writel(SUN4I_HDMI_VID_TIMING_X(x) | SUN4I_HDMI_VID_TIMING_Y(y), hdmi->base + SUN4I_HDMI_VID_TIMING_SPW_REG); val = SUN4I_HDMI_VID_TIMING_POL_TX_CLK; if (mode->flags & DRM_MODE_FLAG_PHSYNC) val |= SUN4I_HDMI_VID_TIMING_POL_HSYNC; if (mode->flags & DRM_MODE_FLAG_PVSYNC) val |= SUN4I_HDMI_VID_TIMING_POL_VSYNC; writel(val, hdmi->base + SUN4I_HDMI_VID_TIMING_POL_REG); }
void sun4i_tcon_mode_set(struct sun4i_tcon *tcon, const struct drm_encoder *encoder, const struct drm_display_mode *mode) { switch (encoder->encoder_type) { case DRM_MODE_ENCODER_NONE: sun4i_tcon0_mode_set_rgb(tcon, mode); sun4i_tcon_set_mux(tcon, 0, encoder); break; case DRM_MODE_ENCODER_TVDAC: case DRM_MODE_ENCODER_TMDS: sun4i_tcon1_mode_set(tcon, mode); sun4i_tcon_set_mux(tcon, 1, encoder); break; default: DRM_DEBUG_DRIVER("Unknown encoder type, doing nothing...\n"); } }