diff --git a/baytrail-backlight.patch b/baytrail-backlight.patch new file mode 100644 index 000000000..5ea62b012 --- /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 ++#include + #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 + #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 ba1f560f9..3c8545ee0 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