[kernel: 83/85] add V8P backlight hack from Jan-Michael Brummer (FDO #85977)

Adam Williamson adamwill at fedoraproject.org
Wed Nov 26 20:55:45 UTC 2014


commit 187aae4b6b5b0a413ec27a28cb892cee9f2e7050
Author: Adam Williamson <awilliam at redhat.com>
Date:   Mon Nov 24 16:14:33 2014 -0800

    add V8P backlight hack from Jan-Michael Brummer (FDO #85977)

 baytrail-backlight.patch |  270 ++++++++++++++++++++++++++++++++++++++++++++++
 kernel.spec              |    8 ++
 2 files changed, 278 insertions(+), 0 deletions(-)
---
diff --git a/baytrail-backlight.patch b/baytrail-backlight.patch
new file mode 100644
index 0000000..5ea62b0
--- /dev/null
+++ b/baytrail-backlight.patch
@@ -0,0 +1,270 @@
+diff -ur old/drivers/gpu/drm/i915/i915_drv.h linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/i915_drv.h
+--- old/drivers/gpu/drm/i915/i915_drv.h	2014-11-24 16:07:51.597050369 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/i915_drv.h	2014-11-24 16:08:28.199423974 -0800
+@@ -2223,6 +2223,7 @@
+ 	bool disable_vtd_wa;
+ 	int use_mmio_flip;
+ 	bool mmio_debug;
++	bool force_backlight_pmic;
+ };
+ extern struct i915_params i915 __read_mostly;
+ 
+diff -ur old/drivers/gpu/drm/i915/i915_params.c linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/i915_params.c
+--- old/drivers/gpu/drm/i915/i915_params.c	2014-11-24 16:07:51.590050297 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/i915_params.c	2014-11-24 16:08:28.200423985 -0800
+@@ -51,6 +51,7 @@
+ 	.disable_vtd_wa = 0,
+ 	.use_mmio_flip = 0,
+ 	.mmio_debug = 0,
++	.force_backlight_pmic = 0,
+ };
+ 
+ module_param_named(modeset, i915.modeset, int, 0400);
+@@ -173,3 +174,7 @@
+ MODULE_PARM_DESC(mmio_debug,
+ 	"Enable the MMIO debug code (default: false). This may negatively "
+ 	"affect performance.");
++
++module_param_named(force_backlight_pmic, i915.force_backlight_pmic, bool, 0600);
++MODULE_PARM_DESC(force_backlight_pmic,
++	"Force backlight adjusting through pmic (default: false).");
+diff -ur old/drivers/gpu/drm/i915/intel_dsi.c linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/intel_dsi.c
+--- old/drivers/gpu/drm/i915/intel_dsi.c	2014-11-24 16:07:51.590050297 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/intel_dsi.c	2014-11-24 16:08:14.207281155 -0800
+@@ -140,6 +140,8 @@
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
+ 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
+ 	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
++	struct intel_connector *intel_connector =
++		&intel_dsi->attached_connector->base;
+ 	int pipe = intel_crtc->pipe;
+ 	u32 temp;
+ 
+@@ -163,6 +165,8 @@
+ 		I915_WRITE(MIPI_PORT_CTRL(pipe), temp | DPI_ENABLE);
+ 		POSTING_READ(MIPI_PORT_CTRL(pipe));
+ 	}
++
++	intel_panel_enable_backlight(intel_connector);
+ }
+ 
+ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
+@@ -237,6 +241,8 @@
+ 	struct drm_i915_private *dev_priv = dev->dev_private;
+ 	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
+ 	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
++	struct intel_connector *intel_connector =
++		&intel_dsi->attached_connector->base;
+ 	int pipe = intel_crtc->pipe;
+ 	u32 temp;
+ 
+@@ -253,6 +259,8 @@
+ 		msleep(2);
+ 	}
+ 
++	intel_panel_disable_backlight(intel_connector);
++
+ 	/* Panel commands can be sent when clock is in LP11 */
+ 	I915_WRITE(MIPI_DEVICE_READY(pipe), 0x0);
+ 
+@@ -670,6 +678,7 @@
+ 
+ 	DRM_DEBUG_KMS("\n");
+ 	intel_panel_fini(&intel_connector->panel);
++	intel_panel_destroy_backlight(connector);
+ 	drm_connector_cleanup(connector);
+ 	kfree(connector);
+ }
+@@ -786,6 +795,7 @@
+ 
+ 	fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
+ 	intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
++	intel_panel_setup_backlight(connector);
+ 
+ 	return;
+ 
+diff -ur old/drivers/gpu/drm/i915/intel_panel.c linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/intel_panel.c
+--- old/drivers/gpu/drm/i915/intel_panel.c	2014-11-24 16:07:51.590050297 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/gpu/drm/i915/intel_panel.c	2014-11-24 16:08:28.200423985 -0800
+@@ -31,6 +31,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+ 
+ #include <linux/moduleparam.h>
++#include <linux/mfd/intel_soc_pmic.h>
+ #include "intel_drv.h"
+ 
+ void
+@@ -532,6 +533,11 @@
+ 	return _vlv_get_backlight(dev, pipe);
+ }
+ 
++static u32 vlv_pmic_get_backlight(struct intel_connector *connector)
++{
++	return intel_soc_pmic_readb(0x4E);
++}
++
+ static u32 intel_panel_get_backlight(struct intel_connector *connector)
+ {
+ 	struct drm_device *dev = connector->base.dev;
+@@ -607,6 +613,11 @@
+ 	I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level);
+ }
+ 
++static void vlv_pmic_set_backlight(struct intel_connector *connector, u32 level)
++{
++	intel_soc_pmic_writeb(0x4E, level);
++}
++
+ static void
+ intel_panel_actually_set_backlight(struct intel_connector *connector, u32 level)
+ {
+@@ -726,6 +737,14 @@
+ 	I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp & ~BLM_PWM_ENABLE);
+ }
+ 
++static void vlv_pmic_disable_backlight(struct intel_connector *connector)
++{
++	intel_panel_actually_set_backlight(connector, 0);
++
++	intel_soc_pmic_writeb(0x51, 0x00);
++	intel_soc_pmic_writeb(0x4B, 0x7F);
++}
++
+ void intel_panel_disable_backlight(struct intel_connector *connector)
+ {
+ 	struct drm_device *dev = connector->base.dev;
+@@ -930,6 +949,17 @@
+ 	I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE);
+ }
+ 
++static void vlv_pmic_enable_backlight(struct intel_connector *connector)
++{
++	struct intel_panel *panel = &connector->panel;
++
++	intel_soc_pmic_writeb(0x4B, 0xFF);
++	intel_soc_pmic_writeb(0x4E, 0xFF);
++	intel_soc_pmic_writeb(0x51, 0x01);
++
++	intel_panel_actually_set_backlight(connector, panel->backlight.level);
++}
++
+ void intel_panel_enable_backlight(struct intel_connector *connector)
+ {
+ 	struct drm_device *dev = connector->base.dev;
+@@ -1273,6 +1303,20 @@
+ 	return 0;
+ }
+ 
++static int vlv_pmic_setup_backlight(struct intel_connector *connector)
++{
++	struct intel_panel *panel = &connector->panel;
++
++	printk("vlv_pmic_setup_backlight\n");
++	panel->backlight.present = 1;
++	panel->backlight.min = 0x00;
++	panel->backlight.max = 0xFF;
++	panel->backlight.level = 20;
++	panel->backlight.enabled = 1;
++
++	return 0;
++}
++
+ int intel_panel_setup_backlight(struct drm_connector *connector)
+ {
+ 	struct drm_device *dev = connector->dev;
+@@ -1342,11 +1386,19 @@
+ 		dev_priv->display.set_backlight = pch_set_backlight;
+ 		dev_priv->display.get_backlight = pch_get_backlight;
+ 	} else if (IS_VALLEYVIEW(dev)) {
+-		dev_priv->display.setup_backlight = vlv_setup_backlight;
+-		dev_priv->display.enable_backlight = vlv_enable_backlight;
+-		dev_priv->display.disable_backlight = vlv_disable_backlight;
+-		dev_priv->display.set_backlight = vlv_set_backlight;
+-		dev_priv->display.get_backlight = vlv_get_backlight;
++		if (i915.force_backlight_pmic) {
++			dev_priv->display.setup_backlight = vlv_pmic_setup_backlight;
++			dev_priv->display.enable_backlight = vlv_pmic_enable_backlight;
++			dev_priv->display.disable_backlight = vlv_pmic_disable_backlight;
++			dev_priv->display.set_backlight = vlv_pmic_set_backlight;
++			dev_priv->display.get_backlight = vlv_pmic_get_backlight;
++		} else {
++			dev_priv->display.setup_backlight = vlv_setup_backlight;
++			dev_priv->display.enable_backlight = vlv_enable_backlight;
++			dev_priv->display.disable_backlight = vlv_disable_backlight;
++			dev_priv->display.set_backlight = vlv_set_backlight;
++			dev_priv->display.get_backlight = vlv_get_backlight;
++		}
+ 	} else if (IS_GEN4(dev)) {
+ 		dev_priv->display.setup_backlight = i965_setup_backlight;
+ 		dev_priv->display.enable_backlight = i965_enable_backlight;
+diff -ur old/drivers/mfd/intel_soc_pmic_core.c linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/mfd/intel_soc_pmic_core.c
+--- old/drivers/mfd/intel_soc_pmic_core.c	2014-11-24 16:07:51.844052890 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/drivers/mfd/intel_soc_pmic_core.c	2014-11-24 16:08:14.207281155 -0800
+@@ -26,6 +26,8 @@
+ #include <linux/mfd/intel_soc_pmic.h>
+ #include "intel_soc_pmic_core.h"
+ 
++static struct intel_soc_pmic *pmic_hack = NULL;
++
+ /*
+  * On some boards the PMIC interrupt may come from a GPIO line.
+  * Try to lookup the ACPI table and see if such connection exists. If not,
+@@ -64,6 +66,7 @@
+ 	config = (struct intel_soc_pmic_config *)id->driver_data;
+ 
+ 	pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
++	pmic_hack = pmic;
+ 	dev_set_drvdata(dev, pmic);
+ 
+ 	pmic->regmap = devm_regmap_init_i2c(i2c, config->regmap_config);
+@@ -135,6 +138,38 @@
+ }
+ #endif
+ 
++int intel_soc_pmic_readb(int reg)
++{
++	int ret;
++	unsigned int val;
++
++	if (!pmic_hack) {
++		ret = -EIO;
++	} else {
++		ret = regmap_read(pmic_hack->regmap, reg, &val);
++		if (!ret) {
++			ret = val;
++		}
++	}
++
++	return ret;
++}
++EXPORT_SYMBOL(intel_soc_pmic_readb);
++
++int intel_soc_pmic_writeb(int reg, u8 val)
++{
++	int ret;
++
++	if (!pmic_hack) {
++		ret = -EIO;
++	} else {
++		ret = regmap_write(pmic_hack->regmap, reg, val);
++	}
++	return ret;
++}
++EXPORT_SYMBOL(intel_soc_pmic_writeb);
++
++
+ static SIMPLE_DEV_PM_OPS(intel_soc_pmic_pm_ops, intel_soc_pmic_suspend,
+ 			 intel_soc_pmic_resume);
+ 
+diff -ur old/include/linux/mfd/intel_soc_pmic.h linux-3.18.0-0.rc6.git0.1.1awb.x86_64/include/linux/mfd/intel_soc_pmic.h
+--- old/include/linux/mfd/intel_soc_pmic.h	2014-11-24 16:07:46.912002548 -0800
++++ linux-3.18.0-0.rc6.git0.1.1awb.x86_64/include/linux/mfd/intel_soc_pmic.h	2014-11-24 16:08:14.207281155 -0800
+@@ -27,4 +27,8 @@
+ 	struct regmap_irq_chip_data *irq_chip_data;
+ };
+ 
++int intel_soc_pmic_readb(int reg);
++int intel_soc_pmic_writeb(int reg, u8 val);
++
++
+ #endif	/* __INTEL_SOC_PMIC_H__ */
diff --git a/kernel.spec b/kernel.spec
index ba1f560..3c8545e 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -642,6 +642,13 @@ Patch31013: rt5640_enable_mic.patch
 # Fix wifi on V8P(?) from Jan-Michael Brummer
 Patch31014: sdhci-pm.patch
 
+# https://bugs.freedesktop.org/show_bug.cgi?id=85977
+# Hacky implementation of backlight support for (at least) Dell Venue 8 Pro
+# This is the patch attached to the bug plus a further change sent by email
+# by J-M which makes the hack optional, enabled only if
+# i915.force_backlight_pmic=1 is passed on the cmdline
+Patch31015: baytrail-backlight.patch
+
 # END OF AWB PATCH DEFINITIONS
 
 # END OF PATCH DEFINITIONS
@@ -1380,6 +1387,7 @@ ApplyPatch support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
 #ApplyPatch rt5640_enable_mic.patch
 ApplyPatch soc_button_use_leftmeta.patch
 ApplyPatch sdhci-pm.patch
+ApplyPatch baytrail-backlight.patch
 
 # END OF AWB (BAYTRAIL) PATCH APPLICATIONS
 


More information about the scm-commits mailing list