[Openchrome-devel] drm-openchrome: Branch 'drm-next-3.19' - 14 commits - drivers/gpu/drm

Kevin Brace kevinbrace at kemper.freedesktop.org
Sun Oct 15 05:33:33 UTC 2017


 drivers/gpu/drm/openchrome/crtc_hw.h     |   28 +++++
 drivers/gpu/drm/openchrome/via_analog.c  |    2 
 drivers/gpu/drm/openchrome/via_display.c |    2 
 drivers/gpu/drm/openchrome/via_drv.c     |   80 ++++++++++++----
 drivers/gpu/drm/openchrome/via_drv.h     |   10 +-
 drivers/gpu/drm/openchrome/via_fp.c      |  153 +++++++++++++++++++++----------
 drivers/gpu/drm/openchrome/via_i2c.c     |   36 +++----
 7 files changed, 226 insertions(+), 85 deletions(-)

New commits:
commit e8a3d76fe5dc939de210dcbd42f148e6c0034b7d
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:32:49 2017 -0700

    Version bumped to 3.0.48
    
    This version is an important version. For the first time, standby resume
    (resume from ACPI S3 State) is working at least on VN896 chipset.
    There are still issues with the code, but they will be addressed soon.
    This hugely advances OpenChrome DRM towards mainlining.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_drv.h b/drivers/gpu/drm/openchrome/via_drv.h
index eb9032410c2b..aa5e9c8f1392 100644
--- a/drivers/gpu/drm/openchrome/via_drv.h
+++ b/drivers/gpu/drm/openchrome/via_drv.h
@@ -34,7 +34,7 @@
 
 #define DRIVER_MAJOR		3
 #define DRIVER_MINOR		0
-#define DRIVER_PATCHLEVEL	47
+#define DRIVER_PATCHLEVEL	48
 
 #include <linux/module.h>
 
commit 49c20a7d6d9f4b98bb8048e2414cca4c1e8ffed9
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:28:40 2017 -0700

    Swap the available display controller for analog (VGA) and FP
    
    This is a temporary solution until a bug that causes IGA2?s (display
    controller 2) display cursor to disappear after standby resume is
    fixed.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_analog.c b/drivers/gpu/drm/openchrome/via_analog.c
index 1c513bdfe6fe..0270b87872eb 100644
--- a/drivers/gpu/drm/openchrome/via_analog.c
+++ b/drivers/gpu/drm/openchrome/via_analog.c
@@ -273,7 +273,7 @@ via_analog_init(struct drm_device *dev)
 	drm_encoder_init(dev, &enc->base, &via_dac_enc_funcs, DRM_MODE_ENCODER_DAC);
 	drm_encoder_helper_add(&enc->base, &via_dac_enc_helper_funcs);
 
-	enc->base.possible_crtcs = BIT(0);
+	enc->base.possible_crtcs = BIT(1);
 	enc->base.possible_clones = 0;
 	enc->di_port = VIA_DI_PORT_NONE;
 
diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index 7da6990ba048..254e1d2b09d3 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -1367,7 +1367,7 @@ via_lvds_init(struct drm_device *dev)
 				DRM_MODE_ENCODER_LVDS);
 	drm_encoder_helper_add(&enc->base, &via_lvds_helper_funcs);
 
-	enc->base.possible_crtcs = BIT(1);
+	enc->base.possible_crtcs = BIT(0);
 
 	if (dev_priv->int_fp1_presence) {
 		enc->di_port = dev_priv->int_fp1_di_port;
commit 35ba43cd064ef43c04cf43eae1b7a604ace49303
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:26:34 2017 -0700

    Initial code for supporting standby resume
    
    After struggling for more than a year trying to figure out how to fix
    standby resume (ACPI S3 State resume), finally figured it out what was
    wrong and how to implement it correctly. Obviously, more fixes have to
    be put in for standby resume to be reliable, but at least for now, it
    is working on Xubuntu 16.04.3 LTS with HP 2133 mini-note (VN896 chipset)
    as long as lid close event is avoided.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_drv.c b/drivers/gpu/drm/openchrome/via_drv.c
index c5af338ede70..0492aa4d617b 100644
--- a/drivers/gpu/drm/openchrome/via_drv.c
+++ b/drivers/gpu/drm/openchrome/via_drv.c
@@ -22,6 +22,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 #include <linux/module.h>
+#include <linux/console.h>
 
 #include <drm/drmP.h>
 #include <drm/via_drm.h>
@@ -457,6 +458,66 @@ static void via_reclaim_buffers_locked(struct drm_device *dev,
 	return;
 }
 
+static int via_pm_ops_suspend(struct device *dev)
+{
+	struct pci_dev *pdev = to_pci_dev(dev);
+	struct drm_device *drm_dev = pci_get_drvdata(pdev);
+	struct via_device *dev_priv = drm_dev->dev_private;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
+
+	console_lock();
+	drm_fb_helper_set_suspend(&dev_priv->via_fbdev->helper, true);
+
+	/* 3X5.3B through 3X5.3F are scratch pad registers.
+	 * They are important for FP detection.
+	 * Their values need to be saved because they get lost
+	 * when resuming from standby. */
+	dev_priv->saved_cr3b = vga_rcrt(VGABASE, 0x3b);
+	dev_priv->saved_cr3c = vga_rcrt(VGABASE, 0x3c);
+	dev_priv->saved_cr3d = vga_rcrt(VGABASE, 0x3d);
+	dev_priv->saved_cr3e = vga_rcrt(VGABASE, 0x3e);
+	dev_priv->saved_cr3f = vga_rcrt(VGABASE, 0x3f);
+
+	console_unlock();
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return 0;
+}
+
+static int via_pm_ops_resume(struct device *dev)
+{
+	struct pci_dev *pdev = to_pci_dev(dev);
+	struct drm_device *drm_dev = pci_get_drvdata(pdev);
+	struct via_device *dev_priv = drm_dev->dev_private;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
+
+	console_lock();
+
+	/* 3X5.3B through 3X5.3F are scratch pad registers.
+	 * They are important for FP detection.
+	 * Their values need to be restored because they are undefined
+	 * after resuming from standby. */
+	vga_wcrt(VGABASE, 0x3b, dev_priv->saved_cr3b);
+	vga_wcrt(VGABASE, 0x3c, dev_priv->saved_cr3c);
+	vga_wcrt(VGABASE, 0x3d, dev_priv->saved_cr3d);
+	vga_wcrt(VGABASE, 0x3e, dev_priv->saved_cr3e);
+	vga_wcrt(VGABASE, 0x3f, dev_priv->saved_cr3f);
+
+	drm_helper_resume_force_mode(drm_dev);
+	drm_fb_helper_set_suspend(&dev_priv->via_fbdev->helper, false);
+	console_unlock();
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return 0;
+}
+
+static const struct dev_pm_ops via_dev_pm_ops = {
+	.suspend = via_pm_ops_suspend,
+	.resume = via_pm_ops_resume,
+};
+
 static const struct file_operations via_driver_fops = {
 	.owner		= THIS_MODULE,
 	.open		= drm_open,
@@ -513,23 +574,10 @@ via_pci_remove(struct pci_dev *pdev)
 	drm_put_dev(dev);
 }
 
-#ifdef CONFIG_PM
-static int
-via_pci_suspend(struct pci_dev *pdev, pm_message_t state)
-{
-	return 0;
-}
-
-static int
-via_pci_resume(struct pci_dev *pdev)
-{
-	return 0;
-}
-#endif /* CONFIG_PM */
-
 static struct pci_driver via_pci_driver = {
 	.name		= DRIVER_NAME,
 	.id_table	= via_pci_table,
+	.driver.pm	= &via_dev_pm_ops,
 };
 
 static int __init via_init(void)
@@ -539,10 +587,6 @@ static int __init via_init(void)
 	if (via_modeset) {
 		via_pci_driver.probe	= via_pci_probe;
 		via_pci_driver.remove	= via_pci_remove;
-#ifdef CONFIG_PM
-		via_pci_driver.suspend	= via_pci_suspend;
-		via_pci_driver.resume	= via_pci_resume;
-#endif
 		via_driver.driver_features |= DRIVER_MODESET;
 	}
 	return pci_register_driver(&via_pci_driver);
diff --git a/drivers/gpu/drm/openchrome/via_drv.h b/drivers/gpu/drm/openchrome/via_drv.h
index 49bf922b1479..eb9032410c2b 100644
--- a/drivers/gpu/drm/openchrome/via_drv.h
+++ b/drivers/gpu/drm/openchrome/via_drv.h
@@ -191,6 +191,14 @@ struct via_device {
 	struct via_crtc iga[2];
 	bool spread_spectrum;
 
+	/* 3X5.3B through 3X5.3F are scratch pad registers.
+	 * They are important for FP detection. */
+	uint8_t saved_cr3b;
+	uint8_t saved_cr3c;
+	uint8_t saved_cr3d;
+	uint8_t saved_cr3e;
+	uint8_t saved_cr3f;
+
 	/* Due to the way VIA NanoBook reference design implemented
 	 * the pin strapping settings, DRM needs to ignore them for
 	 * FP and DVI to be properly detected. */
commit 72fcda775f608c468aee1fdcb11bffe2dcddccd6
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:24:36 2017 -0700

    Temporary implementation in setting FP adjustment value
    
    This is really a temporary solution in setting P4M900 chipset
    family?s (P4M900, VN896, and CN896) FP adjustment value.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index bf8c33b8c780..7da6990ba048 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -737,6 +737,9 @@ via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 	struct via_device *dev_priv = encoder->dev->dev_private;
 	u8 syncreg = 0;
 
+	/* PCI Device ID */
+	u16 chipset = encoder->dev->pdev->device;
+
 	DRM_DEBUG_KMS("Entered via_fp_mode_set.\n");
 
 	if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
@@ -773,6 +776,15 @@ via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 		break;
 	}
 
+	/* Temporary implementation.*/
+	switch (chipset) {
+	case PCI_DEVICE_ID_VIA_P4M900:
+		via_fpdp_low_set_adjustment(VGABASE, 0x08);
+		break;
+	default:
+		break;
+	}
+
 	via_fp_display_source(dev_priv, enc->di_port, iga->index);
 
 	DRM_DEBUG_KMS("Exiting via_fp_mode_set.\n");
commit 13737b6e0efef4c2735838619f13b384bbd2f382
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:18:46 2017 -0700

    Add via_fpdp_high_set_adjustment
    
    This is an inline function.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/crtc_hw.h b/drivers/gpu/drm/openchrome/crtc_hw.h
index 0d0692469415..fe57d1476851 100644
--- a/drivers/gpu/drm/openchrome/crtc_hw.h
+++ b/drivers/gpu/drm/openchrome/crtc_hw.h
@@ -647,6 +647,20 @@ via_fpdp_high_set_io_pad_state(void __iomem *regs, u8 io_pad_state)
 }
 
 /*
+ * Sets FPDP (Flat Panel Display Port) High adjustment register.
+ */
+static inline void
+via_fpdp_high_set_adjustment(void __iomem *regs, u8 adjustment)
+{
+	/* 3X5.97[3:0] - FPDP High Adjustment */
+	svga_wcrt_mask(regs, 0x97,
+			adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0));
+	DRM_DEBUG_KMS("FPDP High Adjustment: %lu\n",
+			(adjustment & (BIT(3) | BIT(2) |
+					BIT(1) | BIT(0))));
+}
+
+/*
  * Sets FPDP (Flat Panel Display Port) High interface display source.
  */
 static inline void
commit 82f17b0285fe92abd193bb1c90cd62c8b9f3c793
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:17:54 2017 -0700

    Add via_fpdp_low_set_adjustment
    
    This is an inline function.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/crtc_hw.h b/drivers/gpu/drm/openchrome/crtc_hw.h
index 54860250f597..0d0692469415 100644
--- a/drivers/gpu/drm/openchrome/crtc_hw.h
+++ b/drivers/gpu/drm/openchrome/crtc_hw.h
@@ -595,6 +595,20 @@ via_fpdp_low_set_io_pad_state(void __iomem *regs, u8 io_pad_state)
 }
 
 /*
+ * Sets FPDP (Flat Panel Display Port) Low adjustment register.
+ */
+static inline void
+via_fpdp_low_set_adjustment(void __iomem *regs, u8 adjustment)
+{
+	/* 3X5.99[3:0] - FPDP Low Adjustment */
+	svga_wcrt_mask(regs, 0x99,
+			adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0));
+	DRM_DEBUG_KMS("FPDP Low Adjustment: %lu\n",
+			(adjustment & (BIT(3) | BIT(2) |
+					BIT(1) | BIT(0))));
+}
+
+/*
  * Sets FPDP (Flat Panel Display Port) Low interface display source.
  */
 static inline void
commit 489ba92d2b79a19de652ac3efbda427db86e774e
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:13:58 2017 -0700

    Renaming via_lcd_set_property to via_fp_set_property
    
    Added error messages to the function.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index 4f58dca6a4b4..bf8c33b8c780 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -837,43 +837,52 @@ via_lcd_detect(struct drm_connector *connector,  bool force)
 	return ret;
 }
 
-static int
-via_lcd_set_property(struct drm_connector *connector,
-			struct drm_property *property, uint64_t value)
+static int via_fp_set_property(struct drm_connector *connector,
+				struct drm_property *property,
+				uint64_t val)
 {
 	struct drm_device *dev = connector->dev;
 	uint64_t orig;
 	int ret;
 
+	DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
 	ret = drm_object_property_get_value(&connector->base, property, &orig);
-	if (!ret && (orig != value)) {
+	if (ret) {
+		DRM_ERROR("FP Property not found!\n");
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (orig != val) {
 		if (property == dev->mode_config.scaling_mode_property) {
-			switch (value) {
+			switch (val) {
 			case DRM_MODE_SCALE_NONE:
 				break;
-
 			case DRM_MODE_SCALE_CENTER:
 				break;
-
 			case DRM_MODE_SCALE_ASPECT:
 				break;
-
 			case DRM_MODE_SCALE_FULLSCREEN:
 				break;
-
 			default:
-				return -EINVAL;
+				DRM_ERROR("Invalid FP property!\n");
+				ret = -EINVAL;
+				break;
 			}
 		}
 	}
-	return 0;
+
+exit:
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+	return ret;
 }
 
 struct drm_connector_funcs via_lcd_connector_funcs = {
 	.dpms = drm_helper_connector_dpms,
 	.detect = via_lcd_detect,
 	.fill_modes = drm_helper_probe_single_connector_modes,
-	.set_property = via_lcd_set_property,
+	.set_property = via_fp_set_property,
 	.destroy = via_connector_destroy,
 };
 
commit 76445eba5a0ab365a4862fa5dfe54159bb1ed72b
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:10:49 2017 -0700

    Add via_fp_disable
    
    A callback function for FP mode setting.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index 56e1cf5da2a8..4f58dca6a4b4 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -778,13 +778,31 @@ via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 	DRM_DEBUG_KMS("Exiting via_fp_mode_set.\n");
 }
 
+static void via_fp_disable(struct drm_encoder *encoder)
+{
+	struct via_encoder *enc = container_of(encoder,
+					struct via_encoder, base);
+	struct drm_device *dev = encoder->dev;
+	struct via_device *dev_priv = encoder->dev->dev_private;
+
+	/* PCI Device ID */
+	u16 chipset = dev->pdev->device;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
+
+	via_fp_power(dev_priv, chipset, enc->di_port, false);
+	via_fp_io_pad_state(dev_priv, enc->di_port, false);
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 const struct drm_encoder_helper_funcs via_lvds_helper_funcs = {
 	.dpms = via_fp_dpms,
 	.mode_fixup = via_lvds_mode_fixup,
 	.prepare = via_fp_prepare,
 	.commit = via_fp_commit,
 	.mode_set = via_fp_mode_set,
-	.disable = via_encoder_disable,
+	.disable = via_fp_disable,
 };
 
 const struct drm_encoder_funcs via_lvds_enc_funcs = {
commit 33bb6a51d0bee9523d01be2309e0cd75940a40c8
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:08:55 2017 -0700

    Add via_fp_commit
    
    A callback function for FP mode setting.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index a14e3228b54e..56e1cf5da2a8 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -710,6 +710,24 @@ static void via_fp_prepare(struct drm_encoder *encoder)
 	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
 }
 
+static void via_fp_commit(struct drm_encoder *encoder)
+{
+	struct via_encoder *enc = container_of(encoder,
+					struct via_encoder, base);
+	struct drm_device *dev = encoder->dev;
+	struct via_device *dev_priv = encoder->dev->dev_private;
+
+	/* PCI Device ID */
+	u16 chipset = dev->pdev->device;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
+
+	via_fp_power(dev_priv, chipset, enc->di_port, true);
+	via_fp_io_pad_state(dev_priv, enc->di_port, true);
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 static void
 via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 		struct drm_display_mode *adjusted_mode)
@@ -764,7 +782,7 @@ const struct drm_encoder_helper_funcs via_lvds_helper_funcs = {
 	.dpms = via_fp_dpms,
 	.mode_fixup = via_lvds_mode_fixup,
 	.prepare = via_fp_prepare,
-	.commit = via_encoder_commit,
+	.commit = via_fp_commit,
 	.mode_set = via_fp_mode_set,
 	.disable = via_encoder_disable,
 };
commit 139bf42919fc78c5e527913701d604afa5895c3d
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:07:53 2017 -0700

    Add via_fp_prepare
    
    A callback function for FP mode setting.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index 8dbc32414cf5..a14e3228b54e 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -692,6 +692,24 @@ via_lvds_mode_fixup(struct drm_encoder *encoder,
 	return true;
 }
 
+static void via_fp_prepare(struct drm_encoder *encoder)
+{
+	struct via_encoder *enc = container_of(encoder,
+					struct via_encoder, base);
+	struct drm_device *dev = encoder->dev;
+	struct via_device *dev_priv = encoder->dev->dev_private;
+
+	/* PCI Device ID */
+	u16 chipset = dev->pdev->device;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
+
+	via_fp_power(dev_priv, chipset, enc->di_port, false);
+	via_fp_io_pad_state(dev_priv, enc->di_port, false);
+
+	DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+}
+
 static void
 via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 		struct drm_display_mode *adjusted_mode)
@@ -745,9 +763,9 @@ via_fp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
 const struct drm_encoder_helper_funcs via_lvds_helper_funcs = {
 	.dpms = via_fp_dpms,
 	.mode_fixup = via_lvds_mode_fixup,
-	.mode_set = via_fp_mode_set,
-	.prepare = via_encoder_prepare,
+	.prepare = via_fp_prepare,
 	.commit = via_encoder_commit,
+	.mode_set = via_fp_mode_set,
 	.disable = via_encoder_disable,
 };
 
commit d3a6410ccdada4a6ea73fa62cf707a916d30fd0d
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 22:04:46 2017 -0700

    Cleaning up via_fp_dpms
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_fp.c b/drivers/gpu/drm/openchrome/via_fp.c
index 473316c0504a..8dbc32414cf5 100644
--- a/drivers/gpu/drm/openchrome/via_fp.c
+++ b/drivers/gpu/drm/openchrome/via_fp.c
@@ -597,48 +597,34 @@ via_fp_display_source(struct via_device *dev_priv, u32 di_port, int index)
 	DRM_DEBUG_KMS("Exiting via_fp_display_source.\n");
 }
 
-static void
-via_fp_dpms(struct drm_encoder *encoder, int mode)
+static void via_fp_dpms(struct drm_encoder *encoder, int mode)
 {
-	struct via_encoder *enc = container_of(encoder, struct via_encoder, base);
-	struct via_device *dev_priv = encoder->dev->dev_private;
+	struct via_encoder *enc = container_of(encoder,
+					struct via_encoder, base);
 	struct drm_device *dev = encoder->dev;
+	struct via_device *dev_priv = encoder->dev->dev_private;
+
+	/* PCI Device ID */
+	u16 chipset = dev->pdev->device;
+
+	DRM_DEBUG_KMS("Entered %s.", __func__);
 
 	switch (mode) {
 	case DRM_MODE_DPMS_ON:
-		if (encoder->crtc == NULL)
-			return;
-
-		/* when using the EPIA-EX board, if we do not set this bit,
-		 * light LCD will failed in nonRandR structure,
-		 * So, when light LCD this bit is always setted */
-		svga_wcrt_mask(VGABASE, 0x6A, BIT(3), BIT(3));
-
-		if (dev_priv->spread_spectrum) {
-			if ((dev->pdev->device == PCI_DEVICE_ID_VIA_VT1122) ||
-			    (dev->pdev->device == PCI_DEVICE_ID_VIA_VX875) ||
-			    (dev->pdev->device == PCI_DEVICE_ID_VIA_VX900_VGA)) {
-				/* GPIO-4/5 are used for spread spectrum,
-				 * we must clear SR3D[7:6] to disable
-				 * GPIO-4/5 output */
-				svga_wseq_mask(VGABASE, 0x3D, BIT(0), 0xC1);
-			} else {
-				svga_wseq_mask(VGABASE, 0x2C, BIT(0), BIT(0));
-			}
-			svga_wseq_mask(VGABASE, 0x1E, BIT(3), BIT(3));
-		}
-
-		via_fp_power(dev_priv, dev->pdev->device, enc->di_port, true);
-	        via_fp_io_pad_state(dev_priv, enc->di_port, true);
+		via_fp_power(dev_priv, chipset, enc->di_port, true);
+		via_fp_io_pad_state(dev_priv, enc->di_port, true);
 		break;
-
 	case DRM_MODE_DPMS_STANDBY:
 	case DRM_MODE_DPMS_SUSPEND:
 	case DRM_MODE_DPMS_OFF:
-		via_fp_power(dev_priv, dev->pdev->device, enc->di_port, false);
+		via_fp_power(dev_priv, chipset, enc->di_port, false);
 		via_fp_io_pad_state(dev_priv, enc->di_port, false);
 		break;
+	default:
+		break;
 	}
+
+	DRM_DEBUG_KMS("Exiting %s.", __func__);
 }
 
 static bool
commit e5b566b597bee64cc50e7c1ba02e33753cb8129c
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 21:10:41 2017 -0700

    Version bumped to 3.0.47
    
    Improvement made in making sure hardware based I2C buses are always
    enabled.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_drv.h b/drivers/gpu/drm/openchrome/via_drv.h
index 7fdec63d80e7..49bf922b1479 100644
--- a/drivers/gpu/drm/openchrome/via_drv.h
+++ b/drivers/gpu/drm/openchrome/via_drv.h
@@ -34,7 +34,7 @@
 
 #define DRIVER_MAJOR		3
 #define DRIVER_MINOR		0
-#define DRIVER_PATCHLEVEL	46
+#define DRIVER_PATCHLEVEL	47
 
 #include <linux/module.h>
 
commit e215b8f360bc67d8fd4e4e695315816eb38a4056
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 21:09:24 2017 -0700

    Rearranging code inside via_i2c.c
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_i2c.c b/drivers/gpu/drm/openchrome/via_i2c.c
index 742362570028..15361edc5be8 100644
--- a/drivers/gpu/drm/openchrome/via_i2c.c
+++ b/drivers/gpu/drm/openchrome/via_i2c.c
@@ -26,7 +26,7 @@ enum viafb_i2c_adap;
 
 static struct via_i2c_stuff via_i2c_par[5];
 
-static void via_i2c_setscl(void *data, int state)
+static void via_i2c_setsda(void *data, int state)
 {
 	struct via_i2c_stuff *i2c = data;
 	struct drm_device *dev = i2c_get_adapdata(&i2c->adapter);
@@ -34,23 +34,32 @@ static void via_i2c_setscl(void *data, int state)
 	u8 value, mask;
 
 	if (i2c->is_active == GPIO) {
-		mask = state ? BIT(7) : BIT(7) | BIT(5);
-		value = state ? 0x00 : BIT(7);
+		mask = state ? BIT(6) : BIT(6) | BIT(4);
+		value = state ? 0x00 : BIT(6);
 	} else {
-		value = state ? BIT(5) | BIT(0) : BIT(0);
-		mask = BIT(5) | BIT(0);
+		value = state ? BIT(4) | BIT(0) : BIT(0);
+		mask = BIT(4) | BIT(0);
 	}
 
 	svga_wseq_mask(VGABASE, i2c->i2c_port, value, mask);
 }
 
-static int via_i2c_getscl(void *data)
+static void via_i2c_setscl(void *data, int state)
 {
 	struct via_i2c_stuff *i2c = data;
 	struct drm_device *dev = i2c_get_adapdata(&i2c->adapter);
 	struct via_device *dev_priv = dev->dev_private;
+	u8 value, mask;
 
-	return vga_rseq(VGABASE, i2c->i2c_port) & BIT(3);
+	if (i2c->is_active == GPIO) {
+		mask = state ? BIT(7) : BIT(7) | BIT(5);
+		value = state ? 0x00 : BIT(7);
+	} else {
+		value = state ? BIT(5) | BIT(0) : BIT(0);
+		mask = BIT(5) | BIT(0);
+	}
+
+	svga_wseq_mask(VGABASE, i2c->i2c_port, value, mask);
 }
 
 static int via_i2c_getsda(void *data)
@@ -62,22 +71,13 @@ static int via_i2c_getsda(void *data)
 	return vga_rseq(VGABASE, i2c->i2c_port) & BIT(2);
 }
 
-static void via_i2c_setsda(void *data, int state)
+static int via_i2c_getscl(void *data)
 {
 	struct via_i2c_stuff *i2c = data;
 	struct drm_device *dev = i2c_get_adapdata(&i2c->adapter);
 	struct via_device *dev_priv = dev->dev_private;
-	u8 value, mask;
-
-	if (i2c->is_active == GPIO) {
-		mask = state ? BIT(6) : BIT(6) | BIT(4);
-		value = state ? 0x00 : BIT(6);
-	} else {
-		value = state ? BIT(4) | BIT(0) : BIT(0);
-		mask = BIT(4) | BIT(0);
-	}
 
-	svga_wseq_mask(VGABASE, i2c->i2c_port, value, mask);
+	return vga_rseq(VGABASE, i2c->i2c_port) & BIT(3);
 }
 
 struct i2c_adapter *via_find_ddc_bus(int port)
commit 934b8065b1db888f51f716fc27d1d9a1a020eecc
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Sat Oct 14 21:08:03 2017 -0700

    Always enable hardware based I2C ports when sending data
    
    Due to an overlook by the past developer, hardware based I2C buses
    (3C5.26 and 3C5.31) were only enabled once in the code (i.e., when
    the DRM is initialized). This does not work out well when standby
    resume support is taken into consideration since register bits that
    enable hardware based I2C buses are undefined after standby resume.
    The easiest way to solve this problem is to always enable it whenever
    data is being sent.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/drivers/gpu/drm/openchrome/via_display.c b/drivers/gpu/drm/openchrome/via_display.c
index 52e1c2d2a2d8..74655a12d268 100644
--- a/drivers/gpu/drm/openchrome/via_display.c
+++ b/drivers/gpu/drm/openchrome/via_display.c
@@ -391,9 +391,7 @@ via_init_td_timing_regs(struct drm_device *dev)
 static void
 via_i2c_reg_init(struct via_device *dev_priv)
 {
-	vga_wseq(VGABASE, 0x31, 0x01);
 	svga_wseq_mask(VGABASE, 0x31, 0x30, 0x30);
-	vga_wseq(VGABASE, 0x26, 0x01);
 	svga_wseq_mask(VGABASE, 0x26, 0x30, 0x30);
 	vga_wseq(VGABASE, 0x2C, 0xc2);
 	vga_wseq(VGABASE, 0x3D, 0xc0);
diff --git a/drivers/gpu/drm/openchrome/via_i2c.c b/drivers/gpu/drm/openchrome/via_i2c.c
index 96114f40b037..742362570028 100644
--- a/drivers/gpu/drm/openchrome/via_i2c.c
+++ b/drivers/gpu/drm/openchrome/via_i2c.c
@@ -37,9 +37,10 @@ static void via_i2c_setscl(void *data, int state)
 		mask = state ? BIT(7) : BIT(7) | BIT(5);
 		value = state ? 0x00 : BIT(7);
 	} else {
-		value = state ? BIT(5) : 0x00;
-		mask = BIT(5);
+		value = state ? BIT(5) | BIT(0) : BIT(0);
+		mask = BIT(5) | BIT(0);
 	}
+
 	svga_wseq_mask(VGABASE, i2c->i2c_port, value, mask);
 }
 
@@ -72,9 +73,10 @@ static void via_i2c_setsda(void *data, int state)
 		mask = state ? BIT(6) : BIT(6) | BIT(4);
 		value = state ? 0x00 : BIT(6);
 	} else {
-		value = state ? BIT(4) : 0x00;
-		mask = BIT(4);
+		value = state ? BIT(4) | BIT(0) : BIT(0);
+		mask = BIT(4) | BIT(0);
 	}
+
 	svga_wseq_mask(VGABASE, i2c->i2c_port, value, mask);
 }
 


More information about the Openchrome-devel mailing list