24 Mar, 2016

3 commits

  • …linux-platform-drivers-x86

    Pull x86 platform driver updates from Darren Hart:
    "Significant refactoring of Dell laptop drivers, modularizing the
    smbios code. Multiple new platforms added for ideapad, asus, dell,
    and alienware using existing quirks. A few fixes and cleanups.

    hp-wmi:
    - Remove GPS rfkill support via pre-2009 interface
    - fix unregister order in hp_wmi_rfkill_setup() once again

    ideapad-laptop:
    - Add ideapad Y700 (15) to the no_hw_rfkill DMI list

    fujitsu-laptop:
    - Support radio toggle button

    intel-hid:
    - allocate correct amount of memory for private struct

    platform/x86:
    - Make intel_scu_ipc explicitly non-modular

    intel_pmc_ipc:
    - Avoid pending IPC1 command during legacy suspend
    - Fix GCR register base address and length

    asus-nb-wmi:
    - add wapf=4 quirk for ASUS X75VD

    intel_telemetry_pltdrv:
    - Change verbosity control bits

    dell-rbtn:
    - Add a comment about the XPS 13 9350

    dell-wmi, dell-laptop:
    - depends DMI

    dell-wmi:
    - support Dell Inspiron M5110
    - properly process Dell Instant Launch hotkey
    - enable receiving WMI events on Dell Vostro V131
    - Support new hotkeys on the XPS 13 9350 (Skylake)
    - Clean up hotkey table size check
    - Stop storing pointers to DMI tables

    dell-laptop:
    - move dell_smi_error() to dell-smbios
    - use dell_smbios_find_token() instead of find_token_location()
    - use dell_smbios_find_token() instead of find_token_id()
    - extract SMBIOS-related code to a separate module

    dell-smbios:
    - rename dell_smi_error() to dell_smbios_error()
    - make da_tokens static
    - remove find_token_{id,location}()
    - implement new function for finding DMI table 0xDA tokens
    - make the SMBIOS buffer static
    - return the SMBIOS buffer from dell_smbios_get_buffer()
    - don't return an SMBIOS buffer from dell_smbios_send_request()
    - don't pass an SMBIOS buffer to dell_smbios_send_request()
    - rename dell_send_request() to dell_smbios_send_request()
    - rename release_buffer() to dell_smbios_release_buffer()
    - rename clear_buffer() to dell_smbios_clear_buffer()
    - rename get_buffer() to dell_smbios_get_buffer()

    dell-led:
    - use dell_smbios_send_request() for performing SMBIOS calls
    - use dell_smbios_find_token() for finding mic DMI tokens

    toshiba_acpi:
    - Add a module parameter to disable hotkeys registration
    - Add sysfs entries for the Cooling Method feature
    - Add support for cooling method feature

    Documentation/ABI:
    - Update sysfs-driver-toshiba_acpi file

    thinkpad_acpi:
    - Remove ambiguous logging for "Unsupported brightness interface"

    alienware-wmi:
    - whitespace improvements
    - Add support for two new systems: ASM200 and ASM201.
    - Add support for deep sleep control.
    - Add initial support for alienware graphics amplifier.
    - Add support for new platform: X51-R3
    - Clean up whitespace for ASM100 platform"

    * tag 'platform-drivers-x86-v4.6-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86: (47 commits)
    hp-wmi: Remove GPS rfkill support via pre-2009 interface
    hp-wmi: fix unregister order in hp_wmi_rfkill_setup() once again
    dell-wmi: support Dell Inspiron M5110
    dell-wmi: properly process Dell Instant Launch hotkey
    dell-wmi: enable receiving WMI events on Dell Vostro V131
    dell-smbios: rename dell_smi_error() to dell_smbios_error()
    dell-laptop: move dell_smi_error() to dell-smbios
    ideapad-laptop: Add ideapad Y700 (15) to the no_hw_rfkill DMI list
    fujitsu-laptop: Support radio toggle button
    intel-hid: allocate correct amount of memory for private struct
    platform/x86: Make intel_scu_ipc explicitly non-modular
    intel_pmc_ipc: Avoid pending IPC1 command during legacy suspend
    intel_pmc_ipc: Fix GCR register base address and length
    asus-nb-wmi: add wapf=4 quirk for ASUS X75VD
    intel_telemetry_pltdrv: Change verbosity control bits
    dell-rbtn: Add a comment about the XPS 13 9350
    dell-wmi: Support new hotkeys on the XPS 13 9350 (Skylake)
    dell-wmi: Clean up hotkey table size check
    dell-wmi, dell-laptop: depends DMI
    dell-wmi: Stop storing pointers to DMI tables
    ...

    Linus Torvalds
     
  • Instead of using the WMI wrapper, dell-led can take advantage of
    dell_smbios_send_request() for performing the SMBIOS calls required to
    change the state of the microphone LED.

    Signed-off-by: Michał Kępień
    Reviewed-by: Pali Rohár
    Acked-by: Jacek Anaszewski
    Signed-off-by: Darren Hart

    Michał Kępień
     
  • With the advent of dell_smbios_find_token(), dell-led does not need to
    perform any DMI walking on its own, but it can rather ask dell-smbios to
    look up the DMI tokens it needs for changing the state of the microphone
    LED.

    Signed-off-by: Michał Kępień
    Reviewed-by: Pali Rohár
    Acked-by: Jacek Anaszewski
    Signed-off-by: Darren Hart

    Michał Kępień
     

14 Mar, 2016

15 commits

  • led_trigger_store can be significantly simplified by using sysfs_streq().

    Signed-off-by: Heiner Kallweit
    Signed-off-by: Jacek Anaszewski

    Heiner Kallweit
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove platform_set_drvdata in probe function and the remove
    function, max8997_led_remove as it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove platform_set_drvdata in probe function and the remove
    function, da903x_led_remove as it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove unnecessary function pdev_to_gpio, platform_set_drvdata
    in the probe function and the remove function, s3c24xx_led_remove as
    it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove platform_set_drvdata from probe function and the remove
    function, wm831x_status_remove as it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove platform_set_drvdata in probe function and the remove
    function, lp8788_led_remove as it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    Also, remove platform_set_drvdata in probe function and the remove
    function, pm860x_led_remove as it is now has nothing to do.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Si-En Technology was acquired by ISSI in 2011, and it appears that
    the IS31FL3218/IS31FL3216 are just rebranded SN3218/SN3216 devices.

    Add the "si-en,sn3218" and "si-en,sn3216" compatible strings into the
    IS31FL32XX driver as aliases for the issi equivalents, and update
    binding documentation.

    Datasheets:
    IS31FL3218: http://www.issi.com/WW/pdf/31FL3218.pdf
    SN3218: http://www.si-en.com/uploadpdf/s2011517171720.pdf

    IS31FL3216: http://www.issi.com/WW/pdf/31FL3216.pdf
    SN3216: http://www.si-en.com/uploadpdf/SN3216201152410148.pdf

    Signed-off-by: David Rivshin
    Acked-by: Rob Herring
    Tested-by: Stefan Wahren
    Signed-off-by: Jacek Anaszewski

    David Rivshin
     
  • The IS31FL32xx family of LED controllers are I2C devices with multiple
    constant-current channels, each with independent 256-level PWM control.

    Datasheets: http://www.issi.com/US/product-analog-fxled-driver.shtml

    This has been tested on the IS31FL3236 and IS31FL3216, on an ARM
    (TI am335x) platform.

    The programming paradigm of these devices is similar in the following
    ways:
    - All registers are 8 bit
    - All LED control registers are write-only
    - Each LED channel has a PWM register (0-255)
    - PWM register writes are shadowed until an Update register is poked
    - All have a concept of Software Shutdown, which disables output

    However, there are some differences in devices:
    - 3236/3235 have a separate Control register for each LED,
    (3218/3216 pack the enable bits into fewer registers)
    - 3236/3235 have a per-channel current divisor setting
    - 3236/3235 have a Global Control register that can turn off all LEDs
    - 3216 is unique in a number of ways
    - OUT9-OUT16 can be configured as GPIOs instead of LED controls
    - LEDs can be programmed with an 8-frame animation, with
    programmable delay between frames
    - LEDs can be modulated by an input audio signal
    - Max output current can be adjusted from 1/4 to 2x globally
    - Has a Configuration register instead of a Shutdown register

    This driver currently only supports the base PWM control function
    of these devices. The following features of these devices are not
    implemented, although it should be possible to add them in the future:
    - All devices are capable of going into a lower-power "software
    shutdown" mode.
    - The is31fl3236 and is31fl3235 can reduce the max output current
    per-channel with a divisor of 1, 2, 3, or 4.
    - The is31fl3216 can use some LED channels as GPIOs instead.
    - The is31fl3216 can animate LEDs in hardware.
    - The is31fl3216 can modulate LEDs according to an audio input.
    - The is31fl3216 can reduce/increase max output current globally.

    Signed-off-by: David Rivshin
    Signed-off-by: Jacek Anaszewski

    David Rivshin
     
  • Switch to resource-managed function devm_led_classdev_register instead
    of led_classdev_register and remove unneeded led_classdev_unregister.

    To be compatible with this change, remove an unnecessary label by
    replacing it with direct return statement.

    The Coccinelle semantic patch used to make this change is as follows:
    //
    @platform@
    identifier p, probefn, removefn;
    @@
    struct platform_driver p = {
    .probe = probefn,
    .remove = removefn,
    };

    @prb@
    identifier platform.probefn, pdev;
    expression e;
    @@
    probefn(struct platform_device *pdev, ...) {
    ...
    e =
    - led_classdev_register
    + devm_led_classdev_register
    (...);
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    @remove depends on prb@
    identifier platform.removefn;
    @@
    removefn(...) {
    ...
    ?- led_classdev_unregister(...);
    ...
    }
    //

    Signed-off-by: Amitoj Kaur Chawla
    Signed-off-by: Jacek Anaszewski

    Amitoj Kaur Chawla
     
  • Use the GPIO flag definition instead of a numeric literal, so the casual
    reader grepping for GPIOF_ will find the GPIO flags used.

    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Jacek Anaszewski

    Geert Uytterhoeven
     
  • Add helpers for calling brightness_set(_blocking) allowing to
    simplify the code and make it better readable.

    Signed-off-by: Heiner Kallweit
    Signed-off-by: Jacek Anaszewski

    Heiner Kallweit
     
  • In case of error, the function gpio_to_desc() returns NULL
    pointer not ERR_PTR(). The IS_ERR() test in the return value
    check should be replaced with NULL test.

    Signed-off-by: Wei Yongjun
    Signed-off-by: Jacek Anaszewski

    Wei Yongjun
     
  • Improve the wording for the comment about the led status, and while at
    it also use the standard formatting for multi-line comments.

    Signed-off-by: Antonio Ospite
    Cc: Richard Purdie
    Signed-off-by: Jacek Anaszewski

    Antonio Ospite
     
  • When a USB LED device is unplugged the remove call chain calls
    led_classdev_unregister which tries to switch the LED off.
    As the device has been removed already this results in a ENODEV
    error message in dmesg.
    Avoid this error message by ignoring ENODEV in calls from
    led_classdev_unregister if the LED device is flagged as pluggable.

    Therefore a new flag LED_HW_PLUGGABLE was introduced which should be set by
    all LED drivers handling pluggable LED devices (mainly USB LED devices).

    Signed-off-by: Heiner Kallweit
    Signed-off-by: Jacek Anaszewski

    Heiner Kallweit
     

18 Jan, 2016

1 commit

  • Pull GPIO updates from Linus Walleij:
    "Here is the bulk of GPIO changes for v4.5.

    Notably there are big refactorings mostly by myself, aimed at getting
    the gpio_chip into a shape that makes me believe I can proceed to
    preserve state for a proper userspace ABI (character device) that has
    already been proposed once, but resulted in the feedback that I need
    to go back and restructure stuff. So I've been restructuring stuff.
    On the way I ran into brokenness (return code from the get_value()
    callback) and had to fix it. Also, refactored generic GPIO to be
    simpler.

    Some of that is still waiting to trickle down from the subsystems all
    over the kernel that provide random gpio_chips, I've touched every
    single GPIO driver in the kernel now, oh man I didn't know I was
    responsible for so much...

    Apart from that we're churning along as usual.

    I took some effort to test and retest so it should merge nicely and we
    shook out a couple of bugs in -next.

    Infrastructural changes:

    - In struct gpio_chip, rename the .dev node to .parent to better
    reflect the fact that this is not the GPIO struct device
    abstraction. We will add that soon so this would be totallt
    confusing.

    - It was noted that the driver .get_value() callbacks was sometimes
    reporting negative -ERR values to the gpiolib core, expecting them
    to be propagated to consumer gpiod_get_value() and gpio_get_value()
    calls. This was not happening, so as there was a mess of drivers
    returning negative errors and some returning "anything else than
    zero" to indicate that a line was active. As some would have bit
    31 set to indicate "line active" it clashed with negative error
    codes. This is fixed by the largeish series clamping values in all
    drivers with !!value to [0,1] and then augmenting the code to
    propagate error codes to consumers. (Includes some ACKed patches
    in other subsystems.)

    - Add a void *data pointer to struct gpio_chip. The container_of()
    design pattern is indeed very nice, but we want to reform the
    struct gpio_chip to be a non-volative, stateless business, and keep
    states internal to the gpiolib to be able to hold on to the state
    when adding a proper userspace ABI (character device) further down
    the road. To achieve this, drivers need a handle at the internal
    state that is not dependent on their struct gpio_chip() so we add
    gpiochip_add_data() and gpiochip_get_data() following the pattern
    of many other subsystems. All the "use gpiochip data pointer"
    patches transforms drivers to this scheme.

    - The Generic GPIO chip header has been merged into the general
    header, and the custom header for that
    removed. Instead of having a separate mm_gpio_chip struct for
    these generic drivers, merge that into struct gpio_chip,
    simplifying the code and removing the need for separate and
    confusing includes.

    Misc improvements:

    - Stabilize the way GPIOs are looked up from the ACPI legacy
    specification.

    - Incremental driver features for PXA, PCA953X, Lantiq (patches from
    the OpenWRT community), RCAR, Zynq, PL061, 104-idi-48

    New drivers:

    - Add a GPIO chip to the ALSA SoC AC97 driver.

    - Add a new Broadcom NSP SoC driver (this lands in the pinctrl dir,
    but the branch is merged here too to account for infrastructural
    changes).

    - The sx150x driver now supports the sx1502"

    * tag 'gpio-v4.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (220 commits)
    gpio: generic: make bgpio_pdata always visible
    gpiolib: fix chip order in gpio list
    gpio: mpc8xxx: Do not use gpiochip_get_data() in mpc8xxx_gpio_save_regs()
    gpio: mm-lantiq: Do not use gpiochip_get_data() in ltq_mm_save_regs()
    gpio: brcmstb: Allow building driver for BMIPS_GENERIC
    gpio: brcmstb: Set endian flags for big-endian MIPS
    gpio: moxart: fix build regression
    gpio: xilinx: Do not use gpiochip_get_data() in xgpio_save_regs()
    leds: pca9532: use gpiochip data pointer
    leds: tca6507: use gpiochip data pointer
    hid: cp2112: use gpiochip data pointer
    bcma: gpio: use gpiochip data pointer
    avr32: gpio: use gpiochip data pointer
    video: fbdev: via: use gpiochip data pointer
    gpio: pch: Optimize pch_gpio_get()
    Revert "pinctrl: lantiq: Implement gpio_chip.to_irq"
    pinctrl: nsp-gpio: use gpiochip data pointer
    pinctrl: vt8500-wmt: use gpiochip data pointer
    pinctrl: exynos5440: use gpiochip data pointer
    pinctrl: at91-pio4: use gpiochip data pointer
    ...

    Linus Torvalds
     

07 Jan, 2016

2 commits

  • This makes the driver use the data pointer added to the gpio_chip
    to store a pointer to the state container instead of relying on
    container_of().

    Cc: Riku Voipio
    Cc: Richard Purdie
    Cc: linux-leds@vger.kernel.org
    Acked-by: Jacek Anaszewski
    Signed-off-by: Linus Walleij

    Linus Walleij
     
  • This makes the driver use the data pointer added to the gpio_chip
    to store a pointer to the state container instead of relying on
    container_of().

    Cc: Riku Voipio
    Cc: Richard Purdie
    Cc: linux-leds@vger.kernel.org
    Acked-by: Jacek Anaszewski
    Signed-off-by: Linus Walleij

    Linus Walleij
     

04 Jan, 2016

19 commits