about summary refs log tree commit diff
path: root/modules/hardware
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2017-10-05 19:04:37 +0200
committeraszlig <aszlig@redmoonstudios.org>2017-10-05 19:12:22 +0200
commit19f9decd62fa986863941be2fcd775eccd4740ba (patch)
treef51642e25a87f226202c3769110f7b0d5e5481c1 /modules/hardware
parente9a75836650035db62b971c53e5c1969c9703f98 (diff)
hardware/t100ha: Update to kernel 4.14
Almost all of the issues we so far needed patches for have been
addressed upstream with the exception of backlight probing.

The reason for this is detailled in the following bug:

https://bugs.freedesktop.org/show_bug.cgi?id=96571

In summary, when the I915 driver is built into the kernel, it can't
access the PWM because it's initialized at a later stage.

What we're now doing instead is that we compile i915 as a module and
bake the necessary PWM modules directly into the kernel.

This has the advantage that we no longer need the backlight.patch,
because after all this is already a workaround and having a workaround
that doesn't require us to rebase the patch once a new kernel arrives
seems to be a better solution in my opinion.

With this update we can now revert the reintroduction of kernel 4.12
done in 45bdcd7fc7788316cbad2d7d412e421b230715dc.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'modules/hardware')
-rw-r--r--modules/hardware/t100ha/backlight.patch223
-rw-r--r--modules/hardware/t100ha/default.nix23
-rw-r--r--modules/hardware/t100ha/meta-keys.patch44
3 files changed, 10 insertions, 280 deletions
diff --git a/modules/hardware/t100ha/backlight.patch b/modules/hardware/t100ha/backlight.patch
deleted file mode 100644
index a83d6659..00000000
--- a/modules/hardware/t100ha/backlight.patch
+++ /dev/null
@@ -1,223 +0,0 @@
-diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
-index fc0ef492252a..f9bf7290a2bb 100644
---- a/drivers/gpu/drm/i915/intel_dsi.c
-+++ b/drivers/gpu/drm/i915/intel_dsi.c
-@@ -644,6 +644,7 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder)
- 	struct drm_i915_private *dev_priv = to_i915(dev);
- 	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;
- 	enum port port;
- 
- 	if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
-@@ -665,6 +666,8 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder)
- 		}
- 	}
- 
-+	intel_panel_disable_backlight(intel_connector);
-+
- 	for_each_dsi_port(port, intel_dsi->ports) {
- 		i915_reg_t port_ctrl = IS_GEN9_LP(dev_priv) ?
- 			BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(port);
-@@ -1635,6 +1638,7 @@ static void intel_dsi_connector_destroy(struct drm_connector *connector)
- 
- 	DRM_DEBUG_KMS("\n");
- 	intel_panel_fini(&intel_connector->panel);
-+	intel_panel_destroy_backlight(connector);
- 	drm_connector_cleanup(connector);
- 	kfree(connector);
- }
-diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
-index cb50c527401f..0dae84db6303 100644
---- a/drivers/gpu/drm/i915/intel_panel.c
-+++ b/drivers/gpu/drm/i915/intel_panel.c
-@@ -32,6 +32,7 @@
- 
- #include <linux/kernel.h>
- #include <linux/moduleparam.h>
-+#include <linux/mfd/intel_soc_pmic.h>
- #include <linux/pwm.h>
- #include "intel_drv.h"
- 
-@@ -542,6 +543,11 @@ static u32 pwm_get_backlight(struct intel_connector *connector)
- 	return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
- }
- 
-+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_i915_private *dev_priv = to_i915(connector->base.dev);
-@@ -633,6 +639,11 @@ static void pwm_set_backlight(struct intel_connector *connector, u32 level)
- 	pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
- }
- 
-+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)
- {
-@@ -806,6 +817,14 @@ static void pwm_disable_backlight(struct intel_connector *connector)
- 	pwm_disable(panel->backlight.pwm);
- }
- 
-+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_i915_private *dev_priv = to_i915(connector->base.dev);
-@@ -1084,6 +1103,17 @@ static void pwm_enable_backlight(struct intel_connector *connector)
- 	intel_panel_actually_set_backlight(connector, panel->backlight.level);
- }
- 
-+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_i915_private *dev_priv = to_i915(connector->base.dev);
-@@ -1673,6 +1703,20 @@ static int pwm_setup_backlight(struct intel_connector *connector,
- 	return 0;
- }
- 
-+static int vlv_pmic_setup_backlight(struct intel_connector *connector,
-+		enum pipe unused)
-+{
-+	struct intel_panel *panel = &connector->panel;
-+
-+	panel->backlight.present = 1;
-+	panel->backlight.min = 0x00;
-+	panel->backlight.max = 0xFF;
-+	panel->backlight.level = 0x5A;
-+	panel->backlight.enabled = 1;
-+
-+	return 0;
-+}
-+
- int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
- {
- 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
-@@ -1680,6 +1724,8 @@ int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
- 	struct intel_panel *panel = &intel_connector->panel;
- 	int ret;
- 
-+	intel_backlight_device_register(intel_connector);
-+
- 	if (!dev_priv->vbt.backlight.present) {
- 		if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
- 			DRM_DEBUG_KMS("no backlight present per VBT, but present per quirk\n");
-@@ -1769,18 +1815,17 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
- 		panel->backlight.hz_to_pwm = pch_hz_to_pwm;
- 	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
- 		if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
--			panel->backlight.setup = pwm_setup_backlight;
--			panel->backlight.enable = pwm_enable_backlight;
--			panel->backlight.disable = pwm_disable_backlight;
--			panel->backlight.set = pwm_set_backlight;
--			panel->backlight.get = pwm_get_backlight;
-+			panel->backlight.setup = vlv_pmic_setup_backlight;
-+			panel->backlight.enable = vlv_pmic_enable_backlight;
-+			panel->backlight.disable = vlv_pmic_disable_backlight;
-+			panel->backlight.set = vlv_pmic_set_backlight;
-+			panel->backlight.get = vlv_pmic_get_backlight;
- 		} else {
- 			panel->backlight.setup = vlv_setup_backlight;
- 			panel->backlight.enable = vlv_enable_backlight;
- 			panel->backlight.disable = vlv_disable_backlight;
- 			panel->backlight.set = vlv_set_backlight;
- 			panel->backlight.get = vlv_get_backlight;
--			panel->backlight.hz_to_pwm = vlv_hz_to_pwm;
- 		}
- 	} else if (IS_GEN4(dev_priv)) {
- 		panel->backlight.setup = i965_setup_backlight;
-diff --git a/drivers/mfd/intel_soc_pmic_core.c b/drivers/mfd/intel_soc_pmic_core.c
-index 13737be6df35..60880fdbdccf 100644
---- a/drivers/mfd/intel_soc_pmic_core.c
-+++ b/drivers/mfd/intel_soc_pmic_core.c
-@@ -44,6 +44,8 @@ static struct pwm_lookup crc_pwm_lookup[] = {
- 	PWM_LOOKUP("crystal_cove_pwm", 0, "0000:00:02.0", "pwm_backlight", 0, PWM_POLARITY_NORMAL),
- };
- 
-+static struct intel_soc_pmic *pmic_hack = NULL;
-+
- static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c,
- 				    const struct i2c_device_id *i2c_id)
- {
-@@ -60,6 +62,7 @@ static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c,
- 	config = (struct intel_soc_pmic_config *)id->driver_data;
- 
- 	pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
-+	pmic_hack = pmic;
- 	if (!pmic)
- 		return -ENOMEM;
- 
-@@ -147,6 +150,37 @@ static int intel_soc_pmic_resume(struct device *dev)
- }
- #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 --git a/include/linux/mfd/intel_soc_pmic.h b/include/linux/mfd/intel_soc_pmic.h
-index 956caa0628f5..2adff16a60c3 100644
---- a/include/linux/mfd/intel_soc_pmic.h
-+++ b/include/linux/mfd/intel_soc_pmic.h
-@@ -30,4 +30,7 @@ struct intel_soc_pmic {
- 	struct device *dev;
- };
- 
-+int intel_soc_pmic_readb(int reg);
-+int intel_soc_pmic_writeb(int reg, u8 val);
-+
- #endif	/* __INTEL_SOC_PMIC_H__ */
diff --git a/modules/hardware/t100ha/default.nix b/modules/hardware/t100ha/default.nix
index 00c8a096..8d8756f4 100644
--- a/modules/hardware/t100ha/default.nix
+++ b/modules/hardware/t100ha/default.nix
@@ -19,18 +19,9 @@ in {
       $install "$params" "$out/lib/firmware/brcm/brcmfmac43340-sdio.txt"
     '');
 
-    boot.kernelPatches = [
-      { name = "backlight";
-        patch = ./backlight.patch;
-      }
-      { name = "meta-keys";
-        patch = ./meta-keys.patch;
-      }
-    ];
-
     boot.kernelPackages = let
       nixpkgs = import ../../../nixpkgs-path.nix;
-      t100haKernel = pkgs.vuizvui.linux_4_12.override {
+      t100haKernel = pkgs.linux_testing.override {
         # Missing device drivers:
         #
         #   808622B8 -> Intel(R) Imaging Signal Processor 2401
@@ -55,14 +46,20 @@ in {
           MFD_AXP20X y
           MFD_AXP20X_I2C y
 
+          # Backlight
+          PWM y
+          PWM_SYSFS y
+          PWM_CRC y
+          GPIO_CRYSTAL_COVE y
+
           # GPU
           AGP n
           DRM y
-          DRM_I915 y
+          DRM_I915 m
 
           # Thermal
-          INT3406_THERMAL y
-          INT340X_THERMAL y
+          INT3406_THERMAL m
+          INT340X_THERMAL m
 
           # GPIO
           PINCTRL_CHERRYVIEW y
diff --git a/modules/hardware/t100ha/meta-keys.patch b/modules/hardware/t100ha/meta-keys.patch
deleted file mode 100644
index 26fd4fda..00000000
--- a/modules/hardware/t100ha/meta-keys.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
-index bcfaf32..c54cb28 100644
---- a/drivers/hid/hid-input.c
-+++ b/drivers/hid/hid-input.c
-@@ -502,7 +502,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
- 
- 	field->hidinput = hidinput;
- 
--	if (field->flags & HID_MAIN_ITEM_CONSTANT)
-+	if ((field->flags & HID_MAIN_ITEM_CONSTANT) &&
-+		(usage->hid & HID_USAGE_PAGE) != HID_UP_ASUSVENDOR)
- 		goto ignore;
- 
- 	/* Ignore if report count is out of bounds. */
-@@ -980,6 +981,17 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
- 		}
- 		break;
- 
-+	case HID_UP_ASUSVENDOR:
-+		switch (usage->hid & HID_USAGE) {
-+			case 0x06C: map_key_clear(KEY_SLEEP);           break; /* Fn+F1: Sleep */
-+			case 0x088: map_key_clear(KEY_WLAN);            break; /* Fn+F2: Wifi & BT */
-+			case 0x010: map_key_clear(KEY_BRIGHTNESSDOWN);  break; /* Fn+F5: Brightness down */
-+			case 0x020: map_key_clear(KEY_BRIGHTNESSUP);    break; /* Fn+F6: Brightness up */
-+			case 0x06B: map_key_clear(KEY_F24);             break; /* Fn+F9: Touchpad */
-+			default: goto ignore;
-+		}
-+		break;
-+
- 	default:
- 	unknown:
- 		if (field->report_size == 1) {
-diff --git a/include/linux/hid.h b/include/linux/hid.h
-index 75b66ec..16a64fd 100644
---- a/include/linux/hid.h
-+++ b/include/linux/hid.h
-@@ -172,6 +172,7 @@ struct hid_item {
- #define HID_UP_LOGIVENDOR3   0xff430000
- #define HID_UP_LNVENDOR		0xffa00000
- #define HID_UP_SENSOR		0x00200000
-+#define HID_UP_ASUSVENDOR	0xff310000
- 
- #define HID_USAGE		0x0000ffff
-