drivers/gpu/drm/via/via_analog.c | 17 ------- drivers/gpu/drm/via/via_display.c | 90 +++++++++++++++++++++++++++----------- drivers/gpu/drm/via/via_display.h | 3 + 3 files changed, 69 insertions(+), 41 deletions(-)
New commits: commit ffedb4af49579710a82bed5fa1fb2451bae2317c Author: James Simmons <jsimm...@infradead.org> Date: Mon Dec 17 20:42:39 2012 -0500 Implement handling sync flags for resolution setting diff --git a/drivers/gpu/drm/via/via_analog.c b/drivers/gpu/drm/via/via_analog.c index bb77fa2..286ec51 100644 --- a/drivers/gpu/drm/via/via_analog.c +++ b/drivers/gpu/drm/via/via_analog.c @@ -77,26 +77,11 @@ via_dac_prepare(struct drm_encoder *encoder) encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); } -static void -via_dac_mode_set(struct drm_encoder *encoder, - struct drm_display_mode *mode, - struct drm_display_mode *adjusted_mode) -{ - struct drm_via_private *dev_priv = encoder->dev->dev_private; - u8 polarity = 0; - - if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) - polarity |= BIT(6); - if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) - polarity |= BIT(7); - svga_wmisc_mask(VGABASE, polarity, BIT(7) | BIT(6)); -} - static const struct drm_encoder_helper_funcs via_dac_enc_helper_funcs = { .dpms = via_dac_dpms, .mode_fixup = via_dac_mode_fixup, .prepare = via_dac_prepare, - .mode_set = via_dac_mode_set, + .mode_set = via_set_sync_polarity, .commit = via_encoder_commit, .disable = via_encoder_disable, }; diff --git a/drivers/gpu/drm/via/via_display.c b/drivers/gpu/drm/via/via_display.c index 8d5c384..2446aa6 100644 --- a/drivers/gpu/drm/via/via_display.c +++ b/drivers/gpu/drm/via/via_display.c @@ -136,7 +136,7 @@ via_encoder_commit(struct drm_encoder *encoder) break; default: - DRM_DEBUG("Unsupported DIPort.\n"); + DRM_ERROR("Unsupported DIPort.\n"); break; } @@ -162,19 +162,19 @@ via_encoder_disable(struct drm_encoder *encoder) switch (enc->diPort) { case DISP_DI_DVP0: - svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(6) | BIT(7)); + svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(7) | BIT(6)); break; case DISP_DI_DVP1: - svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(4) | BIT(5)); + svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(5) | BIT(4)); break; case DISP_DI_DFPH: - svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(2) | BIT(3)); + svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(3) | BIT(2)); break; case DISP_DI_DFPL: - svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(0) | BIT(1)); + svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(1) | BIT(0)); break; case DISP_DI_DFP: @@ -184,12 +184,12 @@ via_encoder_disable(struct drm_encoder *encoder) /* TTL LCD, Quanta case */ case DISP_DI_DFPL + DISP_DI_DVP1: - svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(4) | BIT(5)); - svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(0) | BIT(1)); + svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(5) | BIT(4)); + svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(1) | BIT(0)); break; case DISP_DI_DFPH + DISP_DI_DFPL + DISP_DI_DVP1: - svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(4) | BIT(5)); + svga_wseq_mask(VGABASE, 0x1E, 0x00, BIT(5) | BIT(4)); svga_wseq_mask(VGABASE, 0x2A, 0x00, BIT(3) | BIT(2) | BIT(1) | BIT(0)); break; @@ -199,12 +199,52 @@ via_encoder_disable(struct drm_encoder *encoder) break; default: - DRM_DEBUG("Unsupported DIPort.\n"); + DRM_ERROR("Unsupported DIPort.\n"); break; } } -struct drm_encoder* +void +via_set_sync_polarity(struct drm_encoder *encoder, struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + struct via_encoder *enc = container_of(encoder, struct via_encoder, base); + struct drm_via_private *dev_priv = encoder->dev->dev_private; + u8 syncreg = 0; + + if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) + syncreg |= BIT(6); + if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) + syncreg |= BIT(5); + + switch (enc->diPort) { + case DISP_DI_DAC: + svga_wmisc_mask(VGABASE, (syncreg << 1), BIT(7) | BIT(6)); + break; + + case DISP_DI_DVP0: + svga_wcrt_mask(VGABASE, 0x96, syncreg, BIT(6) | BIT(5)); + break; + + case DISP_DI_DVP1: + svga_wcrt_mask(VGABASE, 0x9B, syncreg, BIT(6) | BIT(5)); + break; + + case DISP_DI_DFPH: + svga_wcrt_mask(VGABASE, 0x97, syncreg, BIT(6) | BIT(5)); + break; + + case DISP_DI_DFPL: + svga_wcrt_mask(VGABASE, 0x99, syncreg, BIT(6) | BIT(5)); + break; + + default: + DRM_ERROR("No DIPort.\n"); + break; + } +} + +struct drm_encoder * via_best_encoder(struct drm_connector *connector) { int enc_id = connector->encoder_ids[0]; @@ -213,14 +253,23 @@ via_best_encoder(struct drm_connector *connector) /* pick the encoder ids */ if (enc_id) { - obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER); - if (!obj) - return NULL; - encoder = obj_to_encoder(obj); + obj = drm_mode_object_find(connector->dev, enc_id, + DRM_MODE_OBJECT_ENCODER); + if (obj) + encoder = obj_to_encoder(obj); } return encoder; } +int +via_get_edid_modes(struct drm_connector *connector) +{ + struct via_connector *con = container_of(connector, struct via_connector, base); + struct edid *edid = drm_get_edid(&con->base, con->ddc_bus); + + return drm_add_edid_modes(connector, edid); +} + void via_connector_destroy(struct drm_connector *connector) { @@ -232,15 +281,6 @@ via_connector_destroy(struct drm_connector *connector) kfree(con); } -int -via_get_edid_modes(struct drm_connector *connector) -{ - struct via_connector *con = container_of(connector, struct via_connector, base); - struct edid *edid = drm_get_edid(&con->base, con->ddc_bus); - - return drm_add_edid_modes(connector, edid); -} - static void via_i2c_reg_init(struct drm_via_private *dev_priv) { @@ -278,7 +318,7 @@ via_init_crtc_regs(struct drm_device *dev) { struct drm_via_private *dev_priv = dev->dev_private; - via_unlock_crtc(VGABASE, dev->pdev->device); + via_unlock_crtc(VGABASE, dev->pdev->device); /* always set to 1 */ svga_wcrt_mask(VGABASE, 0x03, BIT(7), BIT(7)); @@ -308,7 +348,7 @@ via_init_crtc_regs(struct drm_device *dev) (dev_priv->revision == CLE266_REVISION_AX)) svga_wseq_mask(VGABASE, 0x1A, BIT(1), BIT(1)); - via_lock_crtc(VGABASE); + via_lock_crtc(VGABASE); } static void diff --git a/drivers/gpu/drm/via/via_display.h b/drivers/gpu/drm/via/via_display.h index 4cb87e9..6f5128a 100644 --- a/drivers/gpu/drm/via/via_display.h +++ b/drivers/gpu/drm/via/via_display.h @@ -117,6 +117,9 @@ extern void via_framebuffer_fini(struct drm_fb_helper *helper); extern void via_crtc_init(struct drm_device *dev, int index); /* encoders */ +extern void via_set_sync_polarity(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode); extern struct drm_encoder* via_best_encoder(struct drm_connector *connector); extern void via_encoder_disable(struct drm_encoder *encoder); extern void via_encoder_commit(struct drm_encoder *encoder); _______________________________________________ Openchrome-devel mailing list Openchrome-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/openchrome-devel