On Fri, Sep 08, 2017 at 05:01:03PM -0500, joshua stein wrote:
> Revision 1.50 of acpithinkpad.c made inteldrm defer to acpithinkpad
> for screen brightness adjustments instead of handling it natively.
> That was needed to avoid some synchronization issues on machines
> where the hardware buttons do the backlight adjustment on their own,
> and just notify acpithinkpad of the change.
> 
> On brand new machines like the X1C5, the screen adjustment buttons
> don't do anything on their own and don't even notify acpithinkpad
> anymore, instead requiring a WMI driver to get notified.  Since
> acpithinkpad is still forcing screen backlight changes to go through
> the proprietary ACPI interface, it is still limited to 10 levels of
> backlight adjustment which are oddly defined.
> 
> I thought about just reverting 1.55 so that acpithinkpad wouldn't
> even bother attaching to these new machines which now use HID
> LEN0268, so that inteldrm could take over brightness adjustment and
> give you the full 100 levels of adjustment.
> 
> However, controlling keyboard backlight through wscons still has to
> be done through acpithinkpad, so the driver still has to attach.  As
> is, the driver was not getting notification of keyboard backlight
> changes either, so the "wsconsctl keyboard.backlight" value would
> get out of sync with the hardware if you adjusted the backlight with
> Fn+Space.
> 
> This diff fixes the keyboard backlight events coming through, and
> also makes it not take over backlight adjustment on these new
> machines (LEN0268 and anything in the future).
> 
> Eventually these machines will need a WMI driver to respond to other
> hardware keys and react accordingly, though many other kinds of
> laptops can also benefit from that driver.
> 
> I'm not pushing to commit this before the lock, so it would be nice
> to have testing on a wide variety of ThinkPads to make sure the
> keyboard backlight change doesn't break anything.

No problems seen on my machines, but I only have one TP
with a keyboard backlight (helix2).

This diff is OK by me, though I have one small nit (see below).

> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.58
> diff -u -p -u -p -r1.58 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c       12 Aug 2017 17:33:51 -0000      1.58
> +++ sys/dev/acpi/acpithinkpad.c       8 Sep 2017 21:39:12 -0000
> @@ -41,6 +41,8 @@
>  #define      THINKPAD_HKEY_VERSION1          0x0100
>  #define      THINKPAD_HKEY_VERSION2          0x0200
>  
> +#define      THINKPAD_KEYLIGHT_MASK          0x20000
> +
>  #define      THINKPAD_CMOS_VOLUME_DOWN       0x00
>  #define      THINKPAD_CMOS_VOLUME_UP         0x01
>  #define      THINKPAD_CMOS_VOLUME_MUTE       0x02
> @@ -136,6 +138,7 @@ struct acpithinkpad_softc {
>       const char              *sc_thinklight_set;
>  
>       uint64_t                 sc_brightness;
> +     int                      sc_fw_brightness;
>  };
>  
>  extern void acpiec_read(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
> @@ -195,6 +198,17 @@ const char *acpithinkpad_hids[] = {
>       0
>  };
>  
> +/*
> + * Older machines which need backlight control done in firmware/ACPI.  Newer
> + * machines rely on inteldrm to do adjustments since hardware keys don't come
> + * through here.
> + */

In isolation it's not immediately obvious if the above comment is
talking about keyboard backlight or screen brightness.
s/backlight control/keyboard backlight control/ ?

> +const char *acpithinkpad_fw_hids[] = {
> +     "IBM0068",
> +     "LEN0068",
> +     0
> +};
> +
>  int
>  thinkpad_match(struct device *parent, void *match, void *aux)
>  {
> @@ -272,6 +286,9 @@ thinkpad_attach(struct device *parent, s
>       sc->sc_acpi = (struct acpi_softc *)parent;
>       sc->sc_devnode = aa->aaa_node;
>  
> +     sc->sc_fw_brightness = acpi_matchhids(aa, acpithinkpad_fw_hids,
> +         sc->sc_dev.dv_xname);
> +
>       printf("\n");
>  
>  #if NAUDIO > 0 && NWSKBD > 0
> @@ -299,8 +316,8 @@ thinkpad_attach(struct device *parent, s
>               wskbd_set_backlight = thinkpad_set_backlight;
>       }
>  
> -     if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> -         0, NULL, &sc->sc_brightness) == 0) {
> +     if (sc->sc_fw_brightness && aml_evalinteger(sc->sc_acpi,
> +         sc->sc_devnode, "PBLG", 0, NULL, &sc->sc_brightness) == 0) {
>               ws_get_param = thinkpad_get_param;
>               ws_set_param = thinkpad_set_param;
>       }
> @@ -323,6 +340,9 @@ thinkpad_enable_events(struct acpithinkp
>               printf("%s: no MHKA\n", DEVNAME(sc));
>               return (1);
>       }
> +
> +     /* Make sure keyboard backlight events are enabled */
> +     mask |= THINKPAD_KEYLIGHT_MASK;
>  
>       /* Update hotkey mask */
>       bzero(args, sizeof(args));
> 

Reply via email to