drivers/gpu/drm/via/crtc_hw.h | 91 ++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/via/via_display.c | 17 +++---- drivers/gpu/drm/via/via_drv.h | 4 - drivers/gpu/drm/via/via_tmds.c | 75 +++++++++++++++---------------- 4 files changed, 139 insertions(+), 48 deletions(-)
New commits: commit c321fd0786cda0ffc2910e298dab5ebf5cad8203 Author: Kevin Brace <kevinbr...@gmx.com> Date: Thu Mar 30 00:41:08 2017 -0700 Version bumped to 3.0.25 This version adds initial support for CX700 / VX700 and VX800 chipsets' integrated TMDS (DVI) transmitter. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h index 5968ad003cb..781d2a5572e 100644 --- a/drivers/gpu/drm/via/via_drv.h +++ b/drivers/gpu/drm/via/via_drv.h @@ -30,11 +30,11 @@ #define DRIVER_AUTHOR "The OpenChrome Project" #define DRIVER_NAME "via" #define DRIVER_DESC "OpenChrome DRM for VIA Technologies Chrome IGP" -#define DRIVER_DATE "20170302" +#define DRIVER_DATE "20170329" #define DRIVER_MAJOR 3 #define DRIVER_MINOR 0 -#define DRIVER_PATCHLEVEL 24 +#define DRIVER_PATCHLEVEL 25 #include <linux/module.h> commit 59afeeb741393b0348bf13f347ae7cc941d772d4 Author: Kevin Brace <kevinbr...@gmx.com> Date: Thu Mar 30 00:39:24 2017 -0700 Updating copyright notice of via_tmds.c Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/via_tmds.c b/drivers/gpu/drm/via/via_tmds.c index 31399a3fb88..d5f244acb7b 100644 --- a/drivers/gpu/drm/via/via_tmds.c +++ b/drivers/gpu/drm/via/via_tmds.c @@ -1,4 +1,5 @@ /* + * Copyright (C) 2016-2017 Kevin Brace * Copyright © 2013 James Simmons * * Permission is hereby granted, free of charge, to any person obtaining a @@ -21,6 +22,7 @@ * DEALINGS IN THE SOFTWARE. * * Authors: + * Kevin Brace <kevinbr...@gmx.com> * James Simmons <jsimm...@infradead.org> */ commit c7e4f1e122e8497d900cd53da83d8a4e9dd72a7f Author: Kevin Brace <kevinbr...@gmx.com> Date: Thu Mar 30 00:36:29 2017 -0700 Fix for CX700 / VX700 and VX800 integrated TMDS (DVI) transmitter There were number of issues related to correctly initializing CX700 / VX700 and VX800 chipsetsâ integrated TMDS (DVI) transmitter. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/via_display.c b/drivers/gpu/drm/via/via_display.c index 236470a2e4a..b40109cb267 100644 --- a/drivers/gpu/drm/via/via_display.c +++ b/drivers/gpu/drm/via/via_display.c @@ -532,20 +532,21 @@ via_modeset_init(struct drm_device *dev) via_lvds_init(dev); switch (dev->pdev->device) { - /* CX700 can support HDMI and non HDMI based DVI ports */ + /* Only CX700 / VX700 and VX800 have an integrated TMDS (DVI) + * transmitter. */ case PCI_DEVICE_ID_VIA_VT3157: - if (!via_tmds_init(dev)) - break; - - /* Newer platforms use HDMI encoder */ case PCI_DEVICE_ID_VIA_VT1122: - case PCI_DEVICE_ID_VIA_VX875: + via_tmds_init(dev); + break; + default: + break; + } + + switch (dev->pdev->device) { case PCI_DEVICE_ID_VIA_VX900_VGA: via_hdmi_init(dev, DISP_DI_NONE); break; - default: - via_tmds_init(dev); break; } diff --git a/drivers/gpu/drm/via/via_tmds.c b/drivers/gpu/drm/via/via_tmds.c index 3ea1b187932..31399a3fb88 100644 --- a/drivers/gpu/drm/via/via_tmds.c +++ b/drivers/gpu/drm/via/via_tmds.c @@ -150,7 +150,7 @@ via_tmds_init(struct drm_device *dev) struct via_device *dev_priv = dev->dev_private; struct via_connector *con; struct via_encoder *enc; - int i2c_port = 0x3D; + int i2c_port = 0x31; if (!(vga_rseq(VGABASE, 0x3E) & BIT(5))) { DRM_INFO("Internal DVI not detected\n"); @@ -178,18 +178,6 @@ via_tmds_init(struct drm_device *dev) drm_connector_helper_add(&con->base, &via_dvi_connector_helper_funcs); drm_connector_register(&con->base); - switch (dev->pdev->device) { - case PCI_DEVICE_ID_VIA_VT1122: - if (dev_priv->revision < VX800_REVISION_B1) - break; - - case PCI_DEVICE_ID_VIA_VX875: - case PCI_DEVICE_ID_VIA_VX900_VGA: - i2c_port = 0x31; - break; - default: - break; - } con->ddc_bus = via_find_ddc_bus(i2c_port); con->base.doublescan_allowed = false; con->base.interlace_allowed = true; commit f28a7cb1f91f2ee87da1dc844bd08cfc91a81e9b Author: Kevin Brace <kevinbr...@gmx.com> Date: Thu Mar 30 00:35:16 2017 -0700 Added viaTMDSPower This function was added to via_tmds.c. Also, via_tmds_dpms callback function's code was updated to utilize viaTMDSPower function. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/via_tmds.c b/drivers/gpu/drm/via/via_tmds.c index d325860ca73..3ea1b187932 100644 --- a/drivers/gpu/drm/via/via_tmds.c +++ b/drivers/gpu/drm/via/via_tmds.c @@ -26,6 +26,34 @@ #include "via_drv.h" +static void +viaTMDSPower(struct via_device *dev_priv, + bool powerState) +{ + DRM_DEBUG("Entered viaTMDSPower.\n"); + + if (powerState) { + /* Software control for LVDS1 power sequence. */ + viaLVDS1SetPowerSeq(VGABASE, true); + + viaLVDS1SetSoftDisplayPeriod(VGABASE, true); + viaLVDS1SetSoftData(VGABASE, true); + viaTMDSSetPower(VGABASE, true); + } else { + /* Software control for LVDS1 power sequence. */ + viaLVDS1SetPowerSeq(VGABASE, true); + + viaTMDSSetPower(VGABASE, false); + viaLVDS1SetSoftData(VGABASE, false); + viaLVDS1SetSoftDisplayPeriod(VGABASE, false); + } + + DRM_INFO("Integrated TMDS (DVI) Power: %s\n", + powerState ? "On" : "Off"); + + DRM_DEBUG("Exiting viaTMDSPower.\n"); +} + /* * Routines for controlling stuff on the TMDS port */ @@ -39,28 +67,23 @@ via_tmds_dpms(struct drm_encoder *encoder, int mode) { struct via_device *dev_priv = encoder->dev->dev_private; + DRM_DEBUG("Entered via_tmds_dpms.\n"); + switch (mode) { case DRM_MODE_DPMS_SUSPEND: case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_OFF: - svga_wcrt_mask(VGABASE, 0xD2, BIT(4), BIT(4)); - svga_wcrt_mask(VGABASE, 0x91, 0x00, BIT(0)); - - /* Internal TMDS only use DFP_L */ - /* Turn on DVI panel path(Only for internal), - * otherwise, the screen of DVI will be black. */ - svga_wcrt_mask(VGABASE, 0x91, 0x00, BIT(7)); - /* Power on TMDS */ - svga_wcrt_mask(VGABASE, 0xD2, 0x00, BIT(3)); + viaTMDSPower(dev_priv, false); break; - case DRM_MODE_DPMS_ON: - default: - svga_wcrt_mask(VGABASE, 0x91, BIT(7), BIT(7)); - /* Power off TMDS */ - svga_wcrt_mask(VGABASE, 0xD2, BIT(3), BIT(3)); + viaTMDSPower(dev_priv, true); break; + default: + DRM_ERROR("Bad DPMS mode."); + break; } + + DRM_DEBUG("Exiting via_tmds_dpms.\n"); } /* Pass our mode to the connectors and the CRTC to give them a chance to commit b7b9182da83906e06ca611bc5ca3f9b9373cc024 Author: Kevin Brace <kevinbr...@gmx.com> Date: Thu Mar 30 00:15:04 2017 -0700 Added viaTMDSSetPower This inline function was added to crtc_hw.h. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index b3868392344..a893f516486 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -149,6 +149,21 @@ viaLVDS1SetSoftDisplayPeriod(void __iomem *regs, bool softOn) softOn ? "On" : "Off"); } +/* + * Sets CX700 / VX700 and VX800 chipsets' TMDS (DVI) power state. + */ +static inline void +viaTMDSSetPower(void __iomem *regs, bool powerState) +{ + /* Set TMDS (DVI) power state. */ + /* 3X5.D2[3] - Power Down (Active High) for DVI + * 0: TMDS power on + * 1: TMDS power down */ + svga_wcrt_mask(regs, 0xD2, powerState ? 0 : BIT(3), BIT(3)); + DRM_DEBUG("TMDS (DVI) Power State: %s\n", + powerState ? "On" : "Off"); +} + extern void load_register_tables(void __iomem *regbase, struct vga_registers *regs); extern void load_value_to_registers(void __iomem *regbase, struct vga_registers *regs, commit 98144190b9e8ae6fae8a6433b8e7145536af2988 Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Mar 29 20:32:37 2017 -0700 Added viaLVDS1SetSoftDisplayPeriod This inline function was added to crtc_hw.h. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index 1d96a10c6ad..b3868392344 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -132,6 +132,23 @@ viaLVDS1SetSoftVdd(void __iomem *regs, bool softOn) softOn ? "On" : "Off"); } +/* + * Sets CX700 or later single chipset's LVDS1 software controlled + * display period. + */ +static inline void +viaLVDS1SetSoftDisplayPeriod(void __iomem *regs, bool softOn) +{ + /* Set LVDS1 software controlled display period state. */ + /* 3X5.91[7] - Software Direct On / Off Display Period + * in the Panel Path + * 0: On + * 1: Off */ + svga_wcrt_mask(regs, 0x91, softOn ? 0 : BIT(7), BIT(7)); + DRM_DEBUG("LVDS1 Software Controlled Display Period: %s\n", + softOn ? "On" : "Off"); +} + extern void load_register_tables(void __iomem *regbase, struct vga_registers *regs); extern void load_value_to_registers(void __iomem *regbase, struct vga_registers *regs, commit a3e4b914d69327e8c5a2afc1e4d5134d30e404d3 Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Mar 29 20:28:58 2017 -0700 Added viaLVDS1SetSoftVdd This inline function was added to crtc_hw.h. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index 7cc9c964d66..1d96a10c6ad 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -117,6 +117,21 @@ viaLVDS1SetSoftData(void __iomem *regs, bool softOn) softOn ? "On" : "Off"); } +/* + * Sets CX700 or later single chipset's LVDS1 software controlled Vdd. + */ +static inline void +viaLVDS1SetSoftVdd(void __iomem *regs, bool softOn) +{ + /* Set LVDS1 software controlled Vdd. */ + /* 3X5.91[4] - Software VDD On + * 0: Off + * 1: On */ + svga_wcrt_mask(regs, 0x91, softOn ? BIT(4) : 0, BIT(4)); + DRM_DEBUG("LVDS1 Software Controlled Vdd: %s\n", + softOn ? "On" : "Off"); +} + extern void load_register_tables(void __iomem *regbase, struct vga_registers *regs); extern void load_value_to_registers(void __iomem *regbase, struct vga_registers *regs, commit 63968f990353dc5775529398401b791b619f4a37 Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Mar 29 20:11:30 2017 -0700 Added viaLVDS1SetSoftData This inline function was added to crtc_hw.h. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index c5b5e233fa8..7cc9c964d66 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -101,6 +101,22 @@ viaLVDS1SetPowerSeq(void __iomem *regs, bool softCtrl) softCtrl ? "Software" : "Hardware"); } +/* + * Sets CX700 or later single chipset's LVDS1 software controlled + * data path state. + */ +static inline void +viaLVDS1SetSoftData(void __iomem *regs, bool softOn) +{ + /* Set LVDS1 software controlled data path state. */ + /* 3X5.91[3] - Software Data On + * 0: Off + * 1: On */ + svga_wcrt_mask(regs, 0x91, softOn ? BIT(3) : 0, BIT(3)); + DRM_DEBUG("LVDS1 Software Controlled Data Path: %s\n", + softOn ? "On" : "Off"); +} + extern void load_register_tables(void __iomem *regbase, struct vga_registers *regs); extern void load_value_to_registers(void __iomem *regbase, struct vga_registers *regs, commit 35ee89b502902d1750f7a8d6811dc8d286752beb Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Mar 29 19:52:00 2017 -0700 Added viaLVDS1SetPowerSeq This inline function was added to crtc_hw.h. Also, included drm/drmP.h in order to utilize DRM_DEBUG macro. Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index 1dd31f3b873..c5b5e233fa8 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -27,6 +27,8 @@ #include <video/vga.h> +#include <drm/drmP.h> + struct vga_regset { u16 ioport; @@ -77,6 +79,29 @@ static inline void svga_wcrt_mask(void __iomem *regbase, u8 index, u8 data, u8 m vga_wcrt(regbase, index, (data & mask) | (vga_rcrt(regbase, index) & ~mask)); } + +/*********************************************************************** + + VIA Technologies Chrome IGP Register Access Helper Functions + +***********************************************************************/ + +/* + * Sets CX700 or later single chipset's LVDS1 power sequence type. + */ +static inline void +viaLVDS1SetPowerSeq(void __iomem *regs, bool softCtrl) +{ + /* Set LVDS1 power sequence type. */ + /* 3X5.91[0] - LVDS1 Hardware or Software Control Power Sequence + * 0: Hardware Control + * 1: Software Control */ + svga_wcrt_mask(regs, 0x91, softCtrl ? BIT(0) : 0, BIT(0)); + DRM_DEBUG("LVDS1 Power Sequence: %s Control\n", + softCtrl ? "Software" : "Hardware"); +} + + extern void load_register_tables(void __iomem *regbase, struct vga_registers *regs); extern void load_value_to_registers(void __iomem *regbase, struct vga_registers *regs, unsigned int value); diff --git a/drivers/gpu/drm/via/via_tmds.c b/drivers/gpu/drm/via/via_tmds.c index 28fc8d456ed..d325860ca73 100644 --- a/drivers/gpu/drm/via/via_tmds.c +++ b/drivers/gpu/drm/via/via_tmds.c @@ -26,20 +26,6 @@ #include "via_drv.h" - -static inline void -viaLVDS1SetPowerSeq(void __iomem *regs, bool softCtrl) -{ - /* Set LVDS1 power sequence type. */ - /* 3X5.91[0] - LVDS1 Hardware or Software Control Power Sequence - * 0: Hardware Control - * 1: Software Control */ - svga_wcrt_mask(regs, 0x91, softCtrl ? BIT(0) : 0, BIT(0)); - - DRM_DEBUG("LVDS1 Power Sequence: %s Control\n", - softCtrl ? "Software" : "Hardware"); -} - /* * Routines for controlling stuff on the TMDS port */ commit e46ea357203c42cb4d59dfe25de8c6ff746b363c Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Mar 29 18:33:43 2017 -0700 Including video/vga.h inside crtc_hw.h Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/via/crtc_hw.h b/drivers/gpu/drm/via/crtc_hw.h index a04b4693f56..1dd31f3b873 100644 --- a/drivers/gpu/drm/via/crtc_hw.h +++ b/drivers/gpu/drm/via/crtc_hw.h @@ -25,6 +25,9 @@ #ifndef __CRTC_HW_H__ #define __CRTC_HW_H__ +#include <video/vga.h> + + struct vga_regset { u16 ioport; u8 io_addr;
_______________________________________________ Openchrome-devel mailing list Openchrome-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/openchrome-devel