06 Aug, 2019

1 commit

  • Pull spi fixes from Mark Brown:
    "A bunch of small, device specific things here plus a DT bindings fix
    for the new validatable YAML binding format.

    The most notable thing is the fix for GPIO chip selects which fixes a
    corner case in updates of that code to modern APIs, unfortunately due
    to a historical mess the code around GPIO support is obscure, fragile
    and an ABI which makes and attempt to improve the situation painful"

    * tag 'spi-fix-v5.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
    spi: pxa2xx: Add support for Intel Tiger Lake
    spi: bcm2835: Fix 3-wire mode if DMA is enabled
    spi: pxa2xx: Balance runtime PM enable/disable on error
    spi: gpio: Add SPI_MASTER_GPIO_SS flag
    spi: spi-fsl-qspi: change i.MX7D RX FIFO size
    spi: dt-bindings: spi-controller: remove unnecessary 'maxItems: 1' from reg

    Linus Torvalds
     

02 Aug, 2019

1 commit

  • Intel Tiger Lake -LP LPSS SPI controller is otherwise similar than
    Cannon Lake but has more controllers and up to two chip selects per
    controller.

    Signed-off-by: Jarkko Nikula
    Link: https://lore.kernel.org/r/20190801134901.12635-1-jarkko.nikula@linux.intel.com
    Signed-off-by: Mark Brown

    Jarkko Nikula
     

25 Jul, 2019

1 commit

  • Commit 6935224da248 ("spi: bcm2835: enable support of 3-wire mode")
    added 3-wire support to the BCM2835 SPI driver by setting the REN bit
    (Read Enable) in the CS register when receiving data. The REN bit puts
    the transmitter in high-impedance state. The driver recognizes that
    data is to be received by checking whether the rx_buf of a transfer is
    non-NULL.

    Commit 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers
    meeting certain conditions") subsequently broke 3-wire support because
    it set the SPI_MASTER_MUST_RX flag which causes spi_map_msg() to replace
    rx_buf with a dummy buffer if it is NULL. As a result, rx_buf is
    *always* non-NULL if DMA is enabled.

    Reinstate 3-wire support by not only checking whether rx_buf is non-NULL,
    but also checking that it is not the dummy buffer.

    Fixes: 3ecd37edaa2a ("spi: bcm2835: enable dma modes for transfers meeting certain conditions")
    Reported-by: Nuno Sá
    Signed-off-by: Lukas Wunner
    Cc: stable@vger.kernel.org # v4.2+
    Cc: Martin Sperl
    Acked-by: Stefan Wahren
    Link: https://lore.kernel.org/r/328318841455e505370ef8ecad97b646c033dc8a.1562148527.git.lukas@wunner.de
    Signed-off-by: Mark Brown

    Lukas Wunner
     

22 Jul, 2019

1 commit

  • Don't undo the PM initialization if we error out before we managed to
    initialize it. The call to pm_runtime_disable() without being preceded
    by pm_runtime_enable() would disturb the balance of the Force.

    In practice, this happens if we fail to allocate any of the GPIOS ("cs",
    "ready") due to -EPROBE_DEFER because we're getting probled before the
    GPIO driver.

    Signed-off-by: Lubomir Rintel
    Link: https://lore.kernel.org/r/20190719122713.3444318-1-lkundrak@v3.sk
    Signed-off-by: Mark Brown

    Lubomir Rintel
     

18 Jul, 2019

1 commit

  • The GPIO SPI master has some code in its local CS
    callback to set the initial sck GPIO value. This was
    lost in the commit converting it to use SPI core
    GPIO handling as this callback isn't called if the
    internal GPIO handling is active.

    Add the special SPI_MASTER_GPIO_SS to ascertain it
    gets called anyway so we get the initial SCK setting
    right. There is some platform provided GPIO handling
    there as well but this will be skipped as the cs_gpios
    will be NULL.

    My test targets seem not to care about the initial
    SCK value so I am uncertain if this is a regression,
    but to preserve the previous semantic we better do
    this.

    Cc: Andrey Smirnov
    Fixes: 249e2632dcd0 ("spi: gpio: Don't request CS GPIO in DT use-case")
    Signed-off-by: Linus Walleij
    Link: https://lore.kernel.org/r/20190716204651.7743-1-linus.walleij@linaro.org
    Signed-off-by: Mark Brown

    Linus Walleij
     

13 Jul, 2019

1 commit

  • Pull driver core and debugfs updates from Greg KH:
    "Here is the "big" driver core and debugfs changes for 5.3-rc1

    It's a lot of different patches, all across the tree due to some api
    changes and lots of debugfs cleanups.

    Other than the debugfs cleanups, in this set of changes we have:

    - bus iteration function cleanups

    - scripts/get_abi.pl tool to display and parse Documentation/ABI
    entries in a simple way

    - cleanups to Documenatation/ABI/ entries to make them parse easier
    due to typos and other minor things

    - default_attrs use for some ktype users

    - driver model documentation file conversions to .rst

    - compressed firmware file loading

    - deferred probe fixes

    All of these have been in linux-next for a while, with a bunch of
    merge issues that Stephen has been patient with me for"

    * tag 'driver-core-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (102 commits)
    debugfs: make error message a bit more verbose
    orangefs: fix build warning from debugfs cleanup patch
    ubifs: fix build warning after debugfs cleanup patch
    driver: core: Allow subsystems to continue deferring probe
    drivers: base: cacheinfo: Ensure cpu hotplug work is done before Intel RDT
    arch_topology: Remove error messages on out-of-memory conditions
    lib: notifier-error-inject: no need to check return value of debugfs_create functions
    swiotlb: no need to check return value of debugfs_create functions
    ceph: no need to check return value of debugfs_create functions
    sunrpc: no need to check return value of debugfs_create functions
    ubifs: no need to check return value of debugfs_create functions
    orangefs: no need to check return value of debugfs_create functions
    nfsd: no need to check return value of debugfs_create functions
    lib: 842: no need to check return value of debugfs_create functions
    debugfs: provide pr_fmt() macro
    debugfs: log errors when something goes wrong
    drivers: s390/cio: Fix compilation warning about const qualifiers
    drivers: Add generic helper to match by of_node
    driver_find_device: Unify the match function with class_find_device()
    bus_find_device: Unify the match callback with class_find_device
    ...

    Linus Torvalds
     

10 Jul, 2019

1 commit


05 Jul, 2019

3 commits


03 Jul, 2019

1 commit


02 Jul, 2019

3 commits

  • When waking up from the Suspend-to-RAM state, the following error
    was seen:

    m25p80 spi2.0: flash operation timed out

    The flash remained in an undefined state, returning 0xFFs.
    Fix it by setting the Serial Clock Baud Rate, as it was set
    before the conversion to SPIMEM.

    Tested with sama5d2_xplained and mx25l25673g spi-nor in
    Backup + Self-Refresh and Suspend modes.

    Fixes: 0e6aae08e9ae ("spi: Add QuadSPI driver for Atmel SAMA5D2")
    Reported-by: Mark Deneen
    Signed-off-by: Tudor Ambarus
    Signed-off-by: Mark Brown

    Tudor Ambarus
     
  • commit 2d30ac5ed633 ("mtd: spi-nor: atmel-quadspi: Use spi-mem interface for atmel-quadspi driver")
    removed the error path from atmel_qspi_init(), but not changed the
    function's return type. Set void return type for atmel_qspi_init().

    Signed-off-by: Tudor Ambarus
    Signed-off-by: Mark Brown

    Tudor Ambarus
     
  • It is possible to request a transfer with a speed lower than supported
    by the HW. This causes silent divider calculation underflow in
    ssp_get_clk_div() which leads to a frequency higher than requested. Up to
    maximum speed of the controller.

    Set the minimum supported transfer speed and let the SPI core to
    validate no transfers have speed lower than supported.

    Signed-off-by: Jarkko Nikula
    Signed-off-by: Mark Brown

    Jarkko Nikula
     

28 Jun, 2019

1 commit


26 Jun, 2019

2 commits


25 Jun, 2019

2 commits

  • In the new SPI ACPI slave enumeration code, we use the value of
    lookup.max_speed_khz as a flag to decide whether a match occurred.
    However, doing so only makes sense if we initialize its value to
    zero beforehand, or otherwise, random junk from the stack will
    cause spurious matches.

    So zero initialize the lookup struct fully, and only set the non-zero
    members explicitly.

    Fixes: 4c3c59544f33 ("spi/acpi: enumerate all SPI slaves in the namespace")
    Cc: Mika Westerberg
    Cc: andy.shevchenko@gmail.com
    Cc: masahisa.kojima@linaro.org
    Cc: "Rafael J. Wysocki"
    Cc: Jarkko Nikula
    Cc: linux-acpi@vger.kernel.org
    Cc: Lukas Wunner
    Signed-off-by: Ard Biesheuvel
    Tested-by: Jarkko Nikula
    Acked-by: Mika Westerberg
    Signed-off-by: Mark Brown

    Ard Biesheuvel
     
  • On STM32 F4/F7/H7 SoCs, FTHRES is a 5 bits field in QSPI_CR register,
    but for STM32MP1 SoCs, FTHRES is a 4 bits field long. CR_FTHRES_MASK
    definition is not correct.

    As for all these SoCs, FTHRES field is set to 3, FIELD_PREP() macro
    is used with a constant as second parameter which make its usage useless.

    CR_FTHRES_MASK and FIELD_PREP() can be removed.

    Signed-off-by: Patrice Chotard
    Signed-off-by: Mark Brown

    Patrice Chotard
     

24 Jun, 2019

1 commit

  • There is an arbitrary difference between the prototypes of
    bus_find_device() and class_find_device() preventing their callers
    from passing the same pair of data and match() arguments to both of
    them, which is the const qualifier used in the prototype of
    class_find_device(). If that qualifier is also used in the
    bus_find_device() prototype, it will be possible to pass the same
    match() callback function to both bus_find_device() and
    class_find_device(), which will allow some optimizations to be made in
    order to avoid code duplication going forward. Also with that, constify
    the "data" parameter as it is passed as a const to the match function.

    For this reason, change the prototype of bus_find_device() to match
    the prototype of class_find_device() and adjust its callers to use the
    const qualifier in accordance with the new prototype of it.

    Cc: Alexander Shishkin
    Cc: Andrew Lunn
    Cc: Andreas Noever
    Cc: Arnd Bergmann
    Cc: Bjorn Helgaas
    Cc: Corey Minyard
    Cc: Christian Borntraeger
    Cc: David Kershner
    Cc: "David S. Miller"
    Cc: David Airlie
    Cc: Felipe Balbi
    Cc: Frank Rowand
    Cc: Grygorii Strashko
    Cc: Harald Freudenberger
    Cc: Hartmut Knaack
    Cc: Heiko Stuebner
    Cc: Jason Gunthorpe
    Cc: Jonathan Cameron
    Cc: "James E.J. Bottomley"
    Cc: Len Brown
    Cc: Mark Brown
    Cc: Michael Ellerman
    Cc: Michael Jamet
    Cc: "Martin K. Petersen"
    Cc: Peter Oberparleiter
    Cc: Sebastian Ott
    Cc: Srinivas Kandagatla
    Cc: Yehezkel Bernat
    Cc: rafael@kernel.org
    Acked-by: Corey Minyard
    Acked-by: David Kershner
    Acked-by: Mark Brown
    Acked-by: Rafael J. Wysocki
    Acked-by: Srinivas Kandagatla
    Acked-by: Wolfram Sang # for the I2C parts
    Acked-by: Rob Herring
    Signed-off-by: Suzuki K Poulose
    Signed-off-by: Greg Kroah-Hartman

    Suzuki K Poulose
     

20 Jun, 2019

2 commits

  • at91sam9g25ek showed the following error at probe:
    atmel_spi f0000000.spi: Using dma0chan2 (tx) and dma0chan3 (rx)
    for DMA transfers
    atmel_spi: probe of f0000000.spi failed with error -22

    Commit 0a919ae49223 ("spi: Don't call spi_get_gpio_descs() before device name is set")
    moved the calling of spi_get_gpio_descs() after ctrl->dev is set,
    but didn't move the !ctrl->num_chipselect check. When there are
    chip selects in the device tree, the spi-atmel driver lets the
    SPI core discover them when registering the SPI master.
    The ctrl->num_chipselect is thus expected to be set by
    spi_get_gpio_descs().

    Move the !ctlr->num_chipselect after spi_get_gpio_descs() as it was
    before the aforementioned commit. While touching this block, get rid
    of the explicit comparison with 0 and update the commenting style.

    Fixes: 0a919ae49223 ("spi: Don't call spi_get_gpio_descs() before device name is set")
    Signed-off-by: Tudor Ambarus
    Signed-off-by: Mark Brown

    Tudor Ambarus
     
  • kbuild test reported that alpha and some of the architectures
    are missing readsl/writesl series.
    Use more portable ioread32_rep()/iowrite32_rep() series.

    Fixes: b0823ee35cf9b ("spi: Add spi driver for Socionext SynQuacer platform")
    Reported-by: kbuild test robot
    Signed-off-by: Masahisa Kojima
    Signed-off-by: Mark Brown

    Masahisa Kojima
     

19 Jun, 2019

5 commits

  • Based on 2 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation #

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 4122 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Enrico Weigelt
    Reviewed-by: Kate Stewart
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081206.933168790@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 gpl
    v2 as published by the free software foundation this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 1 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Enrico Weigelt
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081205.495444859@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation the gpl this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    version 2 gplv2 for more details you should have received a copy of
    the gnu general public license version 2 gplv2 along with this
    source code

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 16 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Enrico Weigelt
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081201.771169395@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • The ACPI device object parsing code for SPI slaves enumerates the
    entire ACPI namespace to look for devices that refer to the master
    in question via the 'resource_source' field in the 'SPISerialBus'
    resource. If that field does not refer to a valid ACPI device or
    if it refers to the wrong SPI master, we should disregard the
    device.

    Current, the valid device check is wrong, since it gets the
    polarity of 'status' wrong. This could cause issues if the
    'resource_source' field is bogus but parent_handle happens to
    refer to the correct master (which is not entirely imaginary
    since this code runs in a loop)

    So test for ACPI_FAILURE() instead, to make the code more
    self explanatory.

    Fixes: 4c3c59544f33 ("spi/acpi: enumerate all SPI slaves in the namespace")
    Reported-by: kbuild test robot
    Reported-by: Dan Carpenter
    Cc: Mika Westerberg
    Cc: andy.shevchenko@gmail.com
    Cc: masahisa.kojima@linaro.org
    Cc: "Rafael J. Wysocki"
    Cc: Jarkko Nikula
    Cc: linux-acpi@vger.kernel.org
    Cc: Lukas Wunner
    Signed-off-by: Ard Biesheuvel
    Acked-by: Mika Westerberg
    Signed-off-by: Mark Brown

    Ard Biesheuvel
     
  • The loop declaration in function spi_res_release() can be simplified
    by reusing the common list_for_each_entry_safe_reverse() helper
    macro.

    Signed-off-by: Vladimir Zapolskiy
    Signed-off-by: Mark Brown

    Vladimir Zapolskiy
     

17 Jun, 2019

1 commit

  • The device_for_each_child() doesn't require the returned value to be checked.
    Thus, drop the dummy variable completely and have no warning anymore:

    drivers/spi/spi.c: In function ‘spi_unregister_controller’:
    drivers/spi/spi.c:2480:6: warning: variable ‘dummy’ set but not used [-Wunused-but-set-variable]
    int dummy;
    ^~~~~

    Signed-off-by: Andy Shevchenko
    Signed-off-by: Mark Brown

    Andy Shevchenko
     

14 Jun, 2019

1 commit

  • Currently, the ACPI enumeration that takes place when registering a
    SPI master only considers immediate child devices in the ACPI namespace,
    rather than checking the ResourceSource field in the SpiSerialBus()
    resource descriptor.

    This is incorrect: SPI slaves could reside anywhere in the ACPI
    namespace, and so we should enumerate the entire namespace and look for
    any device that refers to the newly registered SPI master in its
    resource descriptor.

    So refactor the existing code and use a lookup structure so that
    allocating the SPI device structure is deferred until we have identified
    the device as an actual child of the controller. This approach is
    loosely based on the way the I2C subsystem handles ACPI enumeration.

    Note that Apple x86 hardware does not rely on SpiSerialBus() resources
    in _CRS but uses nested devices below the controller's device node in
    the ACPI namespace, with a special set of device properties. This means
    we have to take care to only parse those properties for device nodes
    that are direct children of the controller node.

    Cc: Mika Westerberg
    Cc: linux-spi@vger.kernel.org
    Cc: broonie@kernel.org
    Cc: andy.shevchenko@gmail.com
    Cc: masahisa.kojima@linaro.org
    Cc: "Rafael J. Wysocki"
    Cc: Jarkko Nikula
    Cc: linux-acpi@vger.kernel.org
    Cc: Lukas Wunner

    Signed-off-by: Ard Biesheuvel
    Signed-off-by: Mark Brown

    Ard Biesheuvel
     

13 Jun, 2019

1 commit

  • - DMA/PIO:
    If an error IRQ occurred during PIO or DMA mode make sure to log it so
    on completion the transfer can be marked as an error.

    - PIO:
    Do not complete a transaction until all data has been transferred or
    an error IRQ was flagged.

    1) If there was no error IRQ, ignore the done flag IRQ
    (QUP_OP_MAX_INPUT_DONE_FLAG) until all data for the transfer has been
    processed: not doing so risks completing the transfer returning
    uninitialized data in the buffers.

    2) Under stress testing we have identified the need to
    protect read/write operations against spurious IN/OUT service events.

    Signed-off-by: Jorge Ramirez-Ortiz
    Signed-off-by: Mark Brown

    Jorge Ramirez-Ortiz
     

11 Jun, 2019

2 commits


10 Jun, 2019

1 commit

  • One of the more common cases of allocation size calculations is finding
    the size of a structure that has a zero-sized array at the end, along
    with memory for some number of elements for that array. For example:

    struct spi_replaced_transfers {
    ...
    struct spi_transfer inserted_transfers[];
    };

    Make use of the struct_size() helper instead of an open-coded version
    in order to avoid any potential type mistakes.

    So, replace the following form:

    insert * sizeof(struct spi_transfer) + sizeof(struct spi_replaced_transfers)

    with:

    struct_size(rxfer, inserted_transfers, insert)

    This code was detected with the help of Coccinelle.

    Signed-off-by: Gustavo A. R. Silva
    Signed-off-by: Mark Brown

    Gustavo A. R. Silva
     

07 Jun, 2019

1 commit


05 Jun, 2019

6 commits

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license version 2 as
    published by the free software foundation you should have received a
    copy of the gnu general public license along with this program if
    not see http www gnu org licenses

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 30 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531190115.962665879@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can distribute it and or modify it
    under the terms of the gnu general public license version 2 as
    published by the free software foundation this program is
    distributed in the hope it will be useful but without any warranty
    without even the implied warranty of merchantability or fitness for
    a particular purpose see the gnu general public license for more
    details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 24 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Armijn Hemel
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531190115.872212424@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this file is released under the gplv2

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 68 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Armijn Hemel
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531190114.292346262@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms and conditions of the gnu general public license
    version 2 as published by the free software foundation

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 101 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531190113.822954939@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license rev 2 and only
    rev 2 as published by the free software foundation this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 2 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531190112.583753585@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation version 2

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 135 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531081036.435762997@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner