tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Brightness buttons don't work in current
Hi There,
As nobody could help me, finally I successfully patched the kernel to handle the brightness buttons on my Dell laptop.
I used the pmf system to notify the driver about the key events.
Please find the patch attached.
Some drawbacks in which I need help to improve:
* I had to add a new field into struct device in sys/device.h. The new field has a name dv_payload.
I couldn't find a better solution to save the original drm_device structure for the new callbacks,
however I think there should be one;
* In both callback functions in intel_panel.c I had to break the connector's loop after the 1st
iteration. Otherwise the system simply crashes. I have to find out why is that.
So, plase read the patch, try it out.
I could try only on my Dell Latitude E6220, which uses the PCH line. With this patch it works as expected.
Other chips may not work.
Regards,
FeZ
Index: dev/acpi/wmi/wmi_dell.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/wmi/wmi_dell.c,v
retrieving revision 1.11
diff -u -r1.11 wmi_dell.c
--- dev/acpi/wmi/wmi_dell.c 3 Dec 2017 23:43:00 -0000 1.11
+++ dev/acpi/wmi/wmi_dell.c 14 Jan 2019 21:24:31 -0000
@@ -96,6 +96,8 @@
/* type 0x10 */
{WMI_DELLA_PMF, 0x0010, 0x0057, PMFE_DISPLAY_BRIGHTNESS_DOWN},
{WMI_DELLA_PMF, 0x0010, 0x0058, PMFE_DISPLAY_BRIGHTNESS_UP},
+ {WMI_DELLA_PMF, 0x0010, 0x0050, PMFE_DISPLAY_BRIGHTNESS_DOWN},
+ {WMI_DELLA_PMF, 0x0010, 0x0048, PMFE_DISPLAY_BRIGHTNESS_UP},
{WMI_DELLA_IGN, 0x0010, 0x0151, 0}, /* Fn-lock */
{WMI_DELLA_IGN, 0x0010, 0x0152, 0}, /* keyboard illumination */
{WMI_DELLA_PMF, 0x0010, 0x0153, PMFE_RADIO_TOGGLE},
Index: external/bsd/drm2/dist/drm/i915/intel_panel.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/i915/intel_panel.c,v
retrieving revision 1.12
diff -u -r1.12 intel_panel.c
--- external/bsd/drm2/dist/drm/i915/intel_panel.c 6 Oct 2018 15:33:35 -0000 1.12
+++ external/bsd/drm2/dist/drm/i915/intel_panel.c 14 Jan 2019 21:24:40 -0000
@@ -1865,12 +1866,72 @@
panel->downclock_mode);
}
-void intel_backlight_register(struct drm_device *dev)
+static void
+intel_panel_backlight_display_brightness_up(device_t dev)
{
- struct intel_connector *connector;
+ struct drm_device* parent = dev->dv_payload;
+ u32 level = 0;
+ u32 max_level = 0;
+ u32 step = 0;
+ struct intel_connector *connector;
+ struct intel_panel *panel;
+ list_for_each_entry(connector, &parent->mode_config.connector_list, base.head)
+ {
+ panel = &connector->panel;
+ max_level = panel->backlight.max;
+ step = max_level / 10;
+ level = pch_get_backlight(connector);
+ level += step;
+ if (level > max_level)
+ {
+ level = max_level;
+ }
+ panel->backlight.set(connector, level);
+ break;
+ }
+ return;
+}
- list_for_each_entry(connector, &dev->mode_config.connector_list, base.head)
- intel_backlight_device_register(connector);
+static void
+intel_panel_backlight_display_brightness_down(device_t dev)
+{
+ struct drm_device* parent = dev->dv_payload;
+ u32 level = 0;
+ u32 max_level = 0;
+ u32 step = 0;
+ struct intel_connector *connector;
+ struct intel_panel *panel;
+ list_for_each_entry(connector, &parent->mode_config.connector_list, base.head)
+ {
+ panel = &connector->panel;
+ max_level = panel->backlight.max;
+ step = max_level / 10;
+ level = pch_get_backlight(connector);
+ level -= step;
+ if (level < step)
+ {
+ level = step;
+ }
+ panel->backlight.set(connector, level);
+ break;
+ }
+ return;
+}
+
+
+void intel_backlight_register(struct drm_device *dev)
+{
+ struct intel_connector *connector;
+ list_for_each_entry(connector, &dev->mode_config.connector_list, base.head)
+ intel_backlight_device_register(connector);
+
+ struct device* child = dev->dev;
+ child->dv_payload = (void*)dev;
+ pmf_event_register(dev->dev, PMFE_DISPLAY_BRIGHTNESS_UP,
+ intel_panel_backlight_display_brightness_up, true);
+ pmf_event_register(dev->dev, PMFE_DISPLAY_BRIGHTNESS_DOWN,
+ intel_panel_backlight_display_brightness_down, true);
+
}
void intel_backlight_unregister(struct drm_device *dev)
Index: sys/device.h
===================================================================
RCS file: /cvsroot/src/sys/sys/device.h,v
retrieving revision 1.157
diff -u -r1.157 device.h
--- sys/device.h 1 Dec 2018 01:51:38 -0000 1.157
+++ sys/device.h 14 Jan 2019 21:24:48 -0000
@@ -162,6 +162,7 @@
int dv_depth; /* number of parents until root */
int dv_flags; /* misc. flags; see below */
void *dv_private; /* this device's private storage */
+ void *dv_payload; /* an arbitrary payload */
int *dv_locators; /* our actual locators (optional) */
prop_dictionary_t dv_properties;/* properties dictionary */
Home |
Main Index |
Thread Index |
Old Index