25 Aug, 2021

1 commit


15 Jul, 2021

1 commit


05 Jun, 2021

1 commit


27 Apr, 2021

1 commit

  • Pull documentation updates from Jonathan Corbet:
    "It's been a relatively busy cycle in docsland, though more than
    usually well contained to Documentation/ itself. Highlights include:

    - The Chinese translators have been busy and show no signs of
    stopping anytime soon. Italian has also caught up.

    - Aditya Srivastava has been working on improvements to the
    kernel-doc script.

    - Thorsten continues his work on reporting-issues.rst and related
    documentation around regression reporting.

    - Lots of documentation updates, typo fixes, etc. as usual"

    * tag 'docs-5.13' of git://git.lwn.net/linux: (139 commits)
    docs/zh_CN: add openrisc translation to zh_CN index
    docs/zh_CN: add openrisc index.rst translation
    docs/zh_CN: add openrisc todo.rst translation
    docs/zh_CN: add openrisc openrisc_port.rst translation
    docs/zh_CN: add core api translation to zh_CN index
    docs/zh_CN: add core-api index.rst translation
    docs/zh_CN: add core-api irq index.rst translation
    docs/zh_CN: add core-api irq irqflags-tracing.rst translation
    docs/zh_CN: add core-api irq irq-domain.rst translation
    docs/zh_CN: add core-api irq irq-affinity.rst translation
    docs/zh_CN: add core-api irq concepts.rst translation
    docs: sphinx-pre-install: don't barf on beta Sphinx releases
    scripts: kernel-doc: improve parsing for kernel-doc comments syntax
    docs/zh_CN: two minor fixes in zh_CN/doc-guide/
    Documentation: dev-tools: Add Testing Overview
    docs/zh_CN: add translations in zh_CN/dev-tools/gcov
    docs: reporting-issues: make people CC the regressions list
    MAINTAINERS: add regressions mailing list
    doc:it_IT: align Italian documentation
    docs/zh_CN: sync reporting-issues.rst
    ...

    Linus Torvalds
     

01 Apr, 2021

1 commit

  • This patchset add support for soc stm32h750, stm32h750 has mirror
    different from stm32h743

    item stm32h743 stm32h750
    flash size: 2MiB 128KiB
    adc: none 3
    crypto-hash: none aes/hamc/des/tdes/md5/sha

    detail information can be found at:
    https://www.st.com/en/microcontrollers-microprocessors/stm32h750-value-line.html

    Signed-off-by: dillon min
    Signed-off-by: Alexandre Torgue

    dillon min
     

07 Mar, 2021

3 commits

  • Add missing items to table of parameters set in the /chosen node by the EFI
    stub.

    Signed-off-by: Heinrich Schuchardt
    Link: https://lore.kernel.org/r/20210206084120.43305-1-xypron.glpk@gmx.de
    Signed-off-by: Jonathan Corbet

    Heinrich Schuchardt
     
  • MMP2 is used in XO-1.75 and MMP3 is now supported in mainline.

    Signed-off-by: Lubomir Rintel
    Link: https://lore.kernel.org/r/20210215220839.423709-4-lkundrak@v3.sk
    Signed-off-by: Jonathan Corbet

    Lubomir Rintel
     
  • Marvell has an annoying habit of moving stuff around their web site
    every full moon, and often just removing documents altogether.

    At this point basically none but four of the links still works and even
    those that work today weren't working for a long period of time
    previously. That is a shame because (short of the product briefs) the
    documents tend to be quite useful.

    Let's replace them with known working versions of IA's Wayback Machine
    links. That seems to be about the only way of getting a URL that's going
    to work the next week.

    Signed-off-by: Lubomir Rintel
    Link: https://lore.kernel.org/r/20210215220839.423709-2-lkundrak@v3.sk
    Signed-off-by: Jonathan Corbet

    Lubomir Rintel
     

29 Jan, 2021

5 commits


23 Dec, 2020

1 commit

  • Pull ARM updates from Russell King:

    - Rework phys/virt translation

    - Add KASan support

    - Move DT out of linear map region

    - Use more PC-relative addressing in assembly

    - Remove FP emulation handling while in kernel mode

    - Link with '-z norelro'

    - remove old check for GCC PA calculations with adr_l call
    ARM: head.S: use PC relative insn sequence to calculate PHYS_OFFSET
    ...

    Linus Torvalds
     

17 Dec, 2020

1 commit

  • Pull ARM SoC driver updates from Arnd Bergmann:
    "There are a couple of subsystems maintained by other people that merge
    their drivers through the SoC tree, those changes include:

    - The SCMI firmware framework gains support for sensor notifications
    and for controlling voltage domains.

    - A large update for the Tegra memory controller driver, integrating
    it better with the interconnect framework

    - The memory controller subsystem gains support for Mediatek MT8192

    - The reset controller framework gains support for sharing pulsed
    resets

    For Soc specific drivers in drivers/soc, the main changes are

    - The Allwinner/sunxi MBUS gets a rework for the way it handles
    dma_map_ops and offsets between physical and dma address spaces.

    - An errata fix plus some cleanups for Freescale Layerscape SoCs

    - A cleanup for renesas drivers regarding MMIO accesses.

    - New SoC specific drivers for Mediatek MT8192 and MT8183 power
    domains

    - New SoC specific drivers for Aspeed AST2600 LPC bus control and SoC
    identification.

    - Core Power Domain support for Qualcomm MSM8916, MSM8939, SDM660 and
    SDX55.

    - A rework of the TI AM33xx 'genpd' power domain support to use
    information from DT instead of platform data

    - Support for TI AM64x SoCs

    - Allow building some Amlogic drivers as modules instead of built-in

    Finally, there are numerous cleanups and smaller bug fixes for
    Mediatek, Tegra, Samsung, Qualcomm, TI OMAP, Amlogic, Rockchips,
    Renesas, and Xilinx SoCs"

    * tag 'arm-soc-drivers-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (222 commits)
    soc: mediatek: mmsys: Specify HAS_IOMEM dependency for MTK_MMSYS
    firmware: xilinx: Properly align function parameter
    firmware: xilinx: Add a blank line after function declaration
    firmware: xilinx: Remove additional newline
    firmware: xilinx: Fix kernel-doc warnings
    firmware: xlnx-zynqmp: fix compilation warning
    soc: xilinx: vcu: add missing register NUM_CORE
    soc: xilinx: vcu: use vcu-settings syscon registers
    dt-bindings: soc: xlnx: extract xlnx, vcu-settings to separate binding
    soc: xilinx: vcu: drop useless success message
    clk: samsung: mark PM functions as __maybe_unused
    soc: samsung: exynos-chipid: initialize later - with arch_initcall
    soc: samsung: exynos-chipid: order list of SoCs by name
    memory: jz4780_nemc: Fix potential NULL dereference in jz4780_nemc_probe()
    memory: ti-emif-sram: only build for ARMv7
    memory: tegra30: Support interconnect framework
    memory: tegra20: Support hardware versioning and clean up OPP table initialization
    dt-bindings: memory: tegra20-emc: Document opp-supported-hw property
    soc: rockchip: io-domain: Fix error return code in rockchip_iodomain_probe()
    reset-controller: ti: force the write operation when assert or deassert
    ...

    Linus Torvalds
     

04 Dec, 2020

1 commit


14 Nov, 2020

1 commit


31 Oct, 2020

1 commit


29 Oct, 2020

1 commit


27 Oct, 2020

2 commits

  • Define KASAN_SHADOW_OFFSET,KASAN_SHADOW_START and KASAN_SHADOW_END for
    the Arm kernel address sanitizer. We are "stealing" lowmem (the 4GB
    addressable by a 32bit architecture) out of the virtual address
    space to use as shadow memory for KASan as follows:

    +----+ 0xffffffff
    | |
    | | |-> Static kernel image (vmlinux) BSS and page table
    | |/
    +----+ PAGE_OFFSET
    | |
    | | |-> Loadable kernel modules virtual address space area
    | |/
    +----+ MODULES_VADDR = KASAN_SHADOW_END
    | |
    | | |-> The shadow area of kernel virtual address.
    | |/
    +----+-> TASK_SIZE (start of kernel space) = KASAN_SHADOW_START the
    | | shadow address of MODULES_VADDR
    | | |
    | | |
    | | |-> The user space area in lowmem. The kernel address
    | | | sanitizer do not use this space, nor does it map it.
    | | |
    | | |
    | | |
    | | |
    | |/
    ------ 0

    0 .. TASK_SIZE is the memory that can be used by shared
    userspace/kernelspace. It us used for userspace processes and for
    passing parameters and memory buffers in system calls etc. We do not
    need to shadow this area.

    KASAN_SHADOW_START:
    This value begins with the MODULE_VADDR's shadow address. It is the
    start of kernel virtual space. Since we have modules to load, we need
    to cover also that area with shadow memory so we can find memory
    bugs in modules.

    KASAN_SHADOW_END
    This value is the 0x100000000's shadow address: the mapping that would
    be after the end of the kernel memory at 0xffffffff. It is the end of
    kernel address sanitizer shadow area. It is also the start of the
    module area.

    KASAN_SHADOW_OFFSET:
    This value is used to map an address to the corresponding shadow
    address by the following formula:

    shadow_addr = (address >> 3) + KASAN_SHADOW_OFFSET;

    As you would expect, >> 3 is equal to dividing by 8, meaning each
    byte in the shadow memory covers 8 bytes of kernel memory, so one
    bit shadow memory per byte of kernel memory is used.

    The KASAN_SHADOW_OFFSET is provided in a Kconfig option depending
    on the VMSPLIT layout of the system: the kernel and userspace can
    split up lowmem in different ways according to needs, so we calculate
    the shadow offset depending on this.

    When kasan is enabled, the definition of TASK_SIZE is not an 8-bit
    rotated constant, so we need to modify the TASK_SIZE access code in the
    *.s file.

    The kernel and modules may use different amounts of memory,
    according to the VMSPLIT configuration, which in turn
    determines the PAGE_OFFSET.

    We use the following KASAN_SHADOW_OFFSETs depending on how the
    virtual memory is split up:

    - 0x1f000000 if we have 1G userspace / 3G kernelspace split:
    - The kernel address space is 3G (0xc0000000)
    - PAGE_OFFSET is then set to 0x40000000 so the kernel static
    image (vmlinux) uses addresses 0x40000000 .. 0xffffffff
    - On top of that we have the MODULES_VADDR which under
    the worst case (using ARM instructions) is
    PAGE_OFFSET - 16M (0x01000000) = 0x3f000000
    so the modules use addresses 0x3f000000 .. 0x3fffffff
    - So the addresses 0x3f000000 .. 0xffffffff need to be
    covered with shadow memory. That is 0xc1000000 bytes
    of memory.
    - 1/8 of that is needed for its shadow memory, so
    0x18200000 bytes of shadow memory is needed. We
    "steal" that from the remaining lowmem.
    - The KASAN_SHADOW_START becomes 0x26e00000, to
    KASAN_SHADOW_END at 0x3effffff.
    - Now we can calculate the KASAN_SHADOW_OFFSET for any
    kernel address as 0x3f000000 needs to map to the first
    byte of shadow memory and 0xffffffff needs to map to
    the last byte of shadow memory. Since:
    SHADOW_ADDR = (address >> 3) + KASAN_SHADOW_OFFSET
    0x26e00000 = (0x3f000000 >> 3) + KASAN_SHADOW_OFFSET
    KASAN_SHADOW_OFFSET = 0x26e00000 - (0x3f000000 >> 3)
    KASAN_SHADOW_OFFSET = 0x26e00000 - 0x07e00000
    KASAN_SHADOW_OFFSET = 0x1f000000

    - 0x5f000000 if we have 2G userspace / 2G kernelspace split:
    - The kernel space is 2G (0x80000000)
    - PAGE_OFFSET is set to 0x80000000 so the kernel static
    image uses 0x80000000 .. 0xffffffff.
    - On top of that we have the MODULES_VADDR which under
    the worst case (using ARM instructions) is
    PAGE_OFFSET - 16M (0x01000000) = 0x7f000000
    so the modules use addresses 0x7f000000 .. 0x7fffffff
    - So the addresses 0x7f000000 .. 0xffffffff need to be
    covered with shadow memory. That is 0x81000000 bytes
    of memory.
    - 1/8 of that is needed for its shadow memory, so
    0x10200000 bytes of shadow memory is needed. We
    "steal" that from the remaining lowmem.
    - The KASAN_SHADOW_START becomes 0x6ee00000, to
    KASAN_SHADOW_END at 0x7effffff.
    - Now we can calculate the KASAN_SHADOW_OFFSET for any
    kernel address as 0x7f000000 needs to map to the first
    byte of shadow memory and 0xffffffff needs to map to
    the last byte of shadow memory. Since:
    SHADOW_ADDR = (address >> 3) + KASAN_SHADOW_OFFSET
    0x6ee00000 = (0x7f000000 >> 3) + KASAN_SHADOW_OFFSET
    KASAN_SHADOW_OFFSET = 0x6ee00000 - (0x7f000000 >> 3)
    KASAN_SHADOW_OFFSET = 0x6ee00000 - 0x0fe00000
    KASAN_SHADOW_OFFSET = 0x5f000000

    - 0x9f000000 if we have 3G userspace / 1G kernelspace split,
    and this is the default split for ARM:
    - The kernel address space is 1GB (0x40000000)
    - PAGE_OFFSET is set to 0xc0000000 so the kernel static
    image uses 0xc0000000 .. 0xffffffff.
    - On top of that we have the MODULES_VADDR which under
    the worst case (using ARM instructions) is
    PAGE_OFFSET - 16M (0x01000000) = 0xbf000000
    so the modules use addresses 0xbf000000 .. 0xbfffffff
    - So the addresses 0xbf000000 .. 0xffffffff need to be
    covered with shadow memory. That is 0x41000000 bytes
    of memory.
    - 1/8 of that is needed for its shadow memory, so
    0x08200000 bytes of shadow memory is needed. We
    "steal" that from the remaining lowmem.
    - The KASAN_SHADOW_START becomes 0xb6e00000, to
    KASAN_SHADOW_END at 0xbfffffff.
    - Now we can calculate the KASAN_SHADOW_OFFSET for any
    kernel address as 0xbf000000 needs to map to the first
    byte of shadow memory and 0xffffffff needs to map to
    the last byte of shadow memory. Since:
    SHADOW_ADDR = (address >> 3) + KASAN_SHADOW_OFFSET
    0xb6e00000 = (0xbf000000 >> 3) + KASAN_SHADOW_OFFSET
    KASAN_SHADOW_OFFSET = 0xb6e00000 - (0xbf000000 >> 3)
    KASAN_SHADOW_OFFSET = 0xb6e00000 - 0x17e00000
    KASAN_SHADOW_OFFSET = 0x9f000000

    - 0x8f000000 if we have 3G userspace / 1G kernelspace with
    full 1 GB low memory (VMSPLIT_3G_OPT):
    - The kernel address space is 1GB (0x40000000)
    - PAGE_OFFSET is set to 0xb0000000 so the kernel static
    image uses 0xb0000000 .. 0xffffffff.
    - On top of that we have the MODULES_VADDR which under
    the worst case (using ARM instructions) is
    PAGE_OFFSET - 16M (0x01000000) = 0xaf000000
    so the modules use addresses 0xaf000000 .. 0xaffffff
    - So the addresses 0xaf000000 .. 0xffffffff need to be
    covered with shadow memory. That is 0x51000000 bytes
    of memory.
    - 1/8 of that is needed for its shadow memory, so
    0x0a200000 bytes of shadow memory is needed. We
    "steal" that from the remaining lowmem.
    - The KASAN_SHADOW_START becomes 0xa4e00000, to
    KASAN_SHADOW_END at 0xaeffffff.
    - Now we can calculate the KASAN_SHADOW_OFFSET for any
    kernel address as 0xaf000000 needs to map to the first
    byte of shadow memory and 0xffffffff needs to map to
    the last byte of shadow memory. Since:
    SHADOW_ADDR = (address >> 3) + KASAN_SHADOW_OFFSET
    0xa4e00000 = (0xaf000000 >> 3) + KASAN_SHADOW_OFFSET
    KASAN_SHADOW_OFFSET = 0xa4e00000 - (0xaf000000 >> 3)
    KASAN_SHADOW_OFFSET = 0xa4e00000 - 0x15e00000
    KASAN_SHADOW_OFFSET = 0x8f000000

    - The default value of 0xffffffff for KASAN_SHADOW_OFFSET
    is an error value. We should always match one of the
    above shadow offsets.

    When we do this, TASK_SIZE will sometimes get a bit odd values
    that will not fit into immediate mov assembly instructions.
    To account for this, we need to rewrite some assembly using
    TASK_SIZE like this:

    - mov r1, #TASK_SIZE
    + ldr r1, =TASK_SIZE

    or

    - cmp r4, #TASK_SIZE
    + ldr r0, =TASK_SIZE
    + cmp r4, r0

    this is done to avoid the immediate #TASK_SIZE that need to
    fit into a limited number of bits.

    Cc: Andrey Ryabinin
    Cc: Alexander Potapenko
    Cc: Dmitry Vyukov
    Cc: kasan-dev@googlegroups.com
    Cc: Mike Rapoport
    Reviewed-by: Ard Biesheuvel
    Tested-by: Ard Biesheuvel # QEMU/KVM/mach-virt/LPAE/8G
    Tested-by: Florian Fainelli # Brahma SoCs
    Tested-by: Ahmad Fatoum # i.MX6Q
    Reported-by: Ard Biesheuvel
    Signed-off-by: Abbott Liu
    Signed-off-by: Florian Fainelli
    Signed-off-by: Linus Walleij
    Signed-off-by: Russell King

    Linus Walleij
     
  • On ARM, setting up the linear region is tricky, given the constraints
    around placement and alignment of the memblocks, and how the kernel
    itself as well as the DT are placed in physical memory.

    Let's simplify matters a bit, by moving the device tree mapping to the
    top of the address space, right between the end of the vmalloc region
    and the start of the the fixmap region, and create a read-only mapping
    for it that is independent of the size of the linear region, and how it
    is organized.

    Since this region was formerly used as a guard region, which will now be
    populated fully on LPAE builds by this read-only mapping (which will
    still be able to function as a guard region for stray writes), bump the
    start of the [underutilized] fixmap region by 512 KB as well, to ensure
    that there is always a proper guard region here. Doing so still leaves
    ample room for the fixmap space, even with NR_CPUS set to its maximum
    value of 32.

    Tested-by: Linus Walleij
    Reviewed-by: Linus Walleij
    Reviewed-by: Nicolas Pitre
    Signed-off-by: Ard Biesheuvel
    Signed-off-by: Russell King

    Ard Biesheuvel
     

13 Oct, 2020

1 commit

  • Pull documentation updates from Jonathan Corbet:
    "As hoped, things calmed down for docs this cycle; fewer changes and
    almost no conflicts at all. This includes:

    - A reworked and expanded user-mode Linux document

    - Some simplifications and improvements for submitting-patches.rst

    - An emergency fix for (some) problems with Sphinx 3.x

    - Some welcome automarkup improvements to automatically generate
    cross-references to struct definitions and other documents

    - The usual collection of translation updates, typo fixes, etc"

    * tag 'docs-5.10' of git://git.lwn.net/linux: (81 commits)
    gpiolib: Update indentation in driver.rst for code excerpts
    Documentation/admin-guide: tainted-kernels: Fix typo occured
    Documentation: better locations for sysfs-pci, sysfs-tagging
    docs: programming-languages: refresh blurb on clang support
    Documentation: kvm: fix a typo
    Documentation: Chinese translation of Documentation/arm64/amu.rst
    doc: zh_CN: index files in arm64 subdirectory
    mailmap: add entry for
    doc: seq_file: clarify role of *pos in ->next()
    docs: trace: ring-buffer-design.rst: use the new SPDX tag
    Documentation: kernel-parameters: clarify "module." parameters
    Fix references to nommu-mmap.rst
    docs: rewrite admin-guide/sysctl/abi.rst
    docs: fb: Remove vesafb scrollback boot option
    docs: fb: Remove sstfb scrollback boot option
    docs: fb: Remove matroxfb scrollback boot option
    docs: fb: Remove framebuffer scrollback boot option
    docs: replace the old User Mode Linux HowTo with a new one
    Documentation/admin-guide: blockdev/ramdisk: remove use of "rdev"
    Documentation/admin-guide: README & svga: remove use of "rdev"
    ...

    Linus Torvalds
     

30 Sep, 2020

1 commit

  • CONFIG_EFI_VARS controls the code that exposes EFI variables via
    sysfs entries, which was deprecated before support for non-Intel
    architectures was added to EFI. So let's limit its availability
    to Intel architectures for the time being, and hopefully remove
    it entirely in the not too distant future.

    While at it, let's remove the module alias so that the module is
    no longer loaded automatically.

    Signed-off-by: Ard Biesheuvel

    Ard Biesheuvel
     

25 Sep, 2020

1 commit


07 Aug, 2020

1 commit

  • Pull ARM updates from Russell King:

    - add arch/arm/Kbuild from Masahiro Yamada.

    - simplify act_mm macro, since it contains an open-coded
    get_thread_info.

    - VFP updates for Clang from Stefan Agner.

    - Fix unwinder for Clang from Nathan Huckleberry.

    - Remove unused it8152 PCI host controller, used by the removed cm-x2xx
    platforms from Mike Rapoport.

    - Further explanation of __range_ok().

    - Remove kimage_voffset that isn't used anymore from Marc Zyngier.

    - Drop ancient Thumb-2 workaround for old binutils from Ard Biesheuvel.

    - Documentation cleanup for mach-* from Pete Zaitcev.

    * tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
    ARM: 8996/1: Documentation/Clean up the description of mach-
    ARM: 8995/1: drop Thumb-2 workaround for ancient binutils
    ARM: 8994/1: mm: drop kimage_voffset which was only used by KVM
    ARM: uaccess: add further explanation of __range_ok()
    ARM: 8993/1: remove it8152 PCI controller driver
    ARM: 8992/1: Fix unwind_frame for clang-built kernels
    ARM: 8991/1: use VFP assembler mnemonics if available
    ARM: 8990/1: use VFP assembler mnemonics in register load/store macros
    ARM: 8989/1: use .fpu assembler directives instead of assembler arguments
    ARM: 8982/1: mm: Simplify act_mm macro
    ARM: 8981/1: add arch/arm/Kbuild

    Linus Torvalds
     

28 Jul, 2020

1 commit


27 Jun, 2020

1 commit

  • - Add a SPDX header;
    - Adjust document title;
    - Adjust document and section titles;
    - Some whitespace fixes and new line breaks;
    - Mark literal blocks as such;
    - Add table markups;
    - Add it to devicetree/index.rst.

    Signed-off-by: Mauro Carvalho Chehab
    Link: https://lore.kernel.org/r/8dce14af13f66cb8393c21b58f0693e667a7045f.1592918949.git.mchehab+huawei@kernel.org
    Signed-off-by: Jonathan Corbet

    Mauro Carvalho Chehab
     

05 May, 2020

1 commit


19 Feb, 2020

1 commit


11 Jan, 2020

1 commit


01 Oct, 2019

1 commit


13 Aug, 2019

3 commits


01 Aug, 2019

1 commit


15 Jul, 2019

4 commits


09 Jun, 2019

1 commit

  • Sphinx doesn't like orphan documents:

    Documentation/accelerators/ocxl.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/overview.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/stm32f429-overview.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/stm32f746-overview.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/stm32f769-overview.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/stm32h743-overview.rst: WARNING: document isn't included in any toctree
    Documentation/arm/stm32/stm32mp157-overview.rst: WARNING: document isn't included in any toctree
    Documentation/gpu/msm-crash-dump.rst: WARNING: document isn't included in any toctree
    Documentation/interconnect/interconnect.rst: WARNING: document isn't included in any toctree
    Documentation/laptops/lg-laptop.rst: WARNING: document isn't included in any toctree
    Documentation/powerpc/isa-versions.rst: WARNING: document isn't included in any toctree
    Documentation/virtual/kvm/amd-memory-encryption.rst: WARNING: document isn't included in any toctree
    Documentation/virtual/kvm/vcpu-requests.rst: WARNING: document isn't included in any toctree

    So, while they aren't on any toctree, add :orphan: to them, in order
    to silent this warning.

    Signed-off-by: Mauro Carvalho Chehab
    Acked-by: Andrew Donnellan
    Signed-off-by: Jonathan Corbet

    Mauro Carvalho Chehab