-
-
Save magcius/a226cf3bc2a8b7b1c3b0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 80a843db21ecda9666cd8fb18a185517fbf7ebaf Mon Sep 17 00:00:00 2001 | |
From: "Jasper St. Pierre" <jstpierre@mecheye.net> | |
Date: Wed, 30 Sep 2015 15:04:33 -0700 | |
Subject: [PATCH] drm/meson: Add back 1x scaling modes | |
--- | |
drivers/gpu/drm/meson/meson_cvbs.c | 25 +++++++++++++++++++------ | |
drivers/gpu/drm/meson/meson_cvbs.h | 3 ++- | |
drivers/gpu/drm/meson/meson_drv.c | 32 ++++++++++++++++++++------------ | |
drivers/gpu/drm/meson/meson_modes.c | 5 +++++ | |
4 files changed, 46 insertions(+), 19 deletions(-) | |
diff --git a/drivers/gpu/drm/meson/meson_cvbs.c b/drivers/gpu/drm/meson/meson_cvbs.c | |
index b5bda52..f3e1cb3 100644 | |
--- a/drivers/gpu/drm/meson/meson_cvbs.c | |
+++ b/drivers/gpu/drm/meson/meson_cvbs.c | |
@@ -115,14 +115,19 @@ struct meson_connector { | |
struct drm_connector base; | |
struct drm_encoder *encoder; | |
bool enabled; | |
- struct drm_display_mode *mode; | |
+ | |
+ struct drm_display_mode modes[2]; | |
+ int nmodes; | |
}; | |
#define to_meson_connector(x) container_of(x, struct meson_connector, base) | |
static void meson_connector_destroy(struct drm_connector *connector) | |
{ | |
struct meson_connector *meson_connector = to_meson_connector(connector); | |
- drm_mode_destroy(connector->dev, meson_connector->mode); | |
+ | |
+ /* XXX: Leak for now. */ | |
+ /* drm_mode_destroy(connector->dev, meson_connector->mode); */ | |
+ | |
drm_connector_cleanup(connector); | |
kfree(meson_connector); | |
} | |
@@ -147,8 +152,12 @@ static int meson_connector_get_modes(struct drm_connector *connector) | |
{ | |
struct meson_connector *meson_connector = to_meson_connector(connector); | |
struct drm_device *dev = connector->dev; | |
- drm_mode_probed_add(connector, drm_mode_duplicate(dev, meson_connector->mode)); | |
- return 1; | |
+ | |
+ int i; | |
+ for (i = 0; i < meson_connector->nmodes; i++) | |
+ drm_mode_probed_add(connector, drm_mode_duplicate(dev, &meson_connector->modes[i])); | |
+ | |
+ return i; | |
} | |
static int meson_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) | |
@@ -180,7 +189,8 @@ static const struct drm_connector_helper_funcs meson_connector_helper_funcs = { | |
struct drm_connector *meson_cvbs_connector_create(struct drm_device *dev, | |
bool enabled, | |
- struct drm_display_mode *mode) | |
+ struct drm_display_mode **mode, | |
+ int nmode) | |
{ | |
struct meson_connector *meson_connector; | |
struct drm_connector *connector; | |
@@ -198,7 +208,10 @@ struct drm_connector *meson_cvbs_connector_create(struct drm_device *dev, | |
connector = &meson_connector->base; | |
meson_connector->encoder = encoder; | |
meson_connector->enabled = enabled; | |
- meson_connector->mode = mode; | |
+ | |
+ meson_connector->modes[0] = *mode[0]; | |
+ meson_connector->modes[1] = *mode[1]; | |
+ meson_connector->nmodes = nmode; | |
drm_connector_init(dev, connector, &meson_connector_funcs, DRM_MODE_CONNECTOR_Composite); | |
drm_connector_helper_add(connector, &meson_connector_helper_funcs); | |
diff --git a/drivers/gpu/drm/meson/meson_cvbs.h b/drivers/gpu/drm/meson/meson_cvbs.h | |
index fc7afde..299d470 100644 | |
--- a/drivers/gpu/drm/meson/meson_cvbs.h | |
+++ b/drivers/gpu/drm/meson/meson_cvbs.h | |
@@ -30,6 +30,7 @@ | |
struct drm_connector *meson_cvbs_connector_create(struct drm_device *dev, | |
bool enabled, | |
- struct drm_display_mode *mode); | |
+ struct drm_display_mode **mode, | |
+ int nmode); | |
#endif | |
diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c | |
index e521cff..b88c19b 100644 | |
--- a/drivers/gpu/drm/meson/meson_drv.c | |
+++ b/drivers/gpu/drm/meson/meson_drv.c | |
@@ -953,21 +953,29 @@ static int meson_load(struct drm_device *dev, unsigned long flags) | |
meson_hdmi_connector_create(dev, !!(enabled_connectors & MESON_CONNECTORS_HDMI)); | |
{ | |
- struct drm_display_mode *mode = drm_cvt_mode(dev, | |
- CVBS_HACK_MODE_SIZE(720), | |
- CVBS_HACK_MODE_SIZE(480), | |
- 60, false, true, false); | |
- mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; | |
- meson_cvbs_connector_create(dev, !!(enabled_connectors & MESON_CONNECTORS_CVBS_NTSC), mode); | |
+ struct drm_display_mode *mode[2]; | |
+ | |
+ mode[0] = drm_cvt_mode(dev, CVBS_HACK_MODE_SIZE(720), CVBS_HACK_MODE_SIZE(480), | |
+ 60, false, true, false); | |
+ mode[0]->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; | |
+ | |
+ mode[1] = drm_cvt_mode(dev, 720, 480, 50, false, false, false); | |
+ mode[1]->type |= DRM_MODE_TYPE_DRIVER; | |
+ | |
+ meson_cvbs_connector_create(dev, !!(enabled_connectors & MESON_CONNECTORS_CVBS_NTSC), mode, 2); | |
} | |
{ | |
- struct drm_display_mode *mode = drm_cvt_mode(dev, | |
- CVBS_HACK_MODE_SIZE(720), | |
- CVBS_HACK_MODE_SIZE(576), | |
- 50, false, true, false); | |
- mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; | |
- meson_cvbs_connector_create(dev, !!(enabled_connectors & MESON_CONNECTORS_CVBS_PAL), mode); | |
+ struct drm_display_mode *mode[2]; | |
+ | |
+ mode[0] = drm_cvt_mode(dev, CVBS_HACK_MODE_SIZE(720), CVBS_HACK_MODE_SIZE(576), | |
+ 50, false, true, false); | |
+ mode[0]->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; | |
+ | |
+ mode[1] = drm_cvt_mode(dev, 720, 576, 50, false, false, false); | |
+ mode[1]->type |= DRM_MODE_TYPE_DRIVER; | |
+ | |
+ meson_cvbs_connector_create(dev, !!(enabled_connectors & MESON_CONNECTORS_CVBS_PAL), mode, 2); | |
} | |
ret = drm_vblank_init(dev, dev->mode_config.num_crtc); | |
diff --git a/drivers/gpu/drm/meson/meson_modes.c b/drivers/gpu/drm/meson/meson_modes.c | |
index 2ecd858..768fd3f 100644 | |
--- a/drivers/gpu/drm/meson/meson_modes.c | |
+++ b/drivers/gpu/drm/meson/meson_modes.c | |
@@ -94,10 +94,15 @@ static const struct { | |
* incorrect refresh rates. The original algorithm comes from an Excel | |
* spreadsheet from 2003, which I really don't want to debug. */ | |
+ /* Hack scaler modes */ | |
{ CVBS_HACK_MODE_SIZE(720), CVBS_HACK_MODE_SIZE(480), | |
120, VMODE_480CVBS, MESON_MODES_CVBS }, | |
{ CVBS_HACK_MODE_SIZE(720), CVBS_HACK_MODE_SIZE(576), | |
100, VMODE_576CVBS, MESON_MODES_CVBS }, | |
+ | |
+ /* Normal modes */ | |
+ { 720, 480, 120, VMODE_480CVBS, MESON_MODES_CVBS }, | |
+ { 720, 576, 100, VMODE_576CVBS, MESON_MODES_CVBS }, | |
}; | |
vmode_t drm_mode_to_vmode(const struct drm_display_mode *mode, | |
-- | |
2.4.3 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment