Skip to content

Instantly share code, notes, and snippets.

@magcius
Created October 19, 2015 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magcius/a226cf3bc2a8b7b1c3b0 to your computer and use it in GitHub Desktop.
Save magcius/a226cf3bc2a8b7b1c3b0 to your computer and use it in GitHub Desktop.
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