Linux v7.2 was released on August 16, 2026. BayLibre contributed 199 authored commits, spanning a tree-wide modernization of device-ID tables, the IIO subsystem, dual-DAC support for the m68k ColdFire architecture, hierarchical power domains, and fixes across PWM, WiFi, and the VT console.
The 7.2 cycle was the second-busiest in the kernel’s history, with 16,418 non-merge commits from a record 2,652 developers. In that field, BayLibre ranked among the top 20 contributing companies by both changesets (18th) and lines changed (12th). Uwe Kleine-König topped the individual contributor rankings with 151 changesets and ranked 8th by lines changed.
Core API and infrastructure
Device-ID matching touches nearly every driver, so the header that declares those structures is one of the kernel’s biggest transitive-include costs. An x86_64 allmodconfig build of v7.1 pulled <linux/mod_devicetable.h> into 17,038 of 21,330 compiled driver objects, which means a change to even an obscure device-ID struct forced most of the tree to rebuild. Uwe Kleine-König split the header into per-subsystem definitions under <linux/device-id/*.h>, with <linux/mod_devicetable.h> now including the new files so every existing symbol stays available. Each driver can then include only the one or two structures it actually needs, so editing a single device-ID struct no longer triggers a whole-tree recompile.
Two follow-up commits then switch in-tree C files and headers to the specific <linux/device-id/*.h> they need rather than the umbrella header; the C-file conversion is the bulk of that work. The heaviest transitive pullers — <linux/of.h> at 10,897 objects, <linux/pci.h> at 7,920, <linux/acpi.h> at 7,097, and <linux/i2c.h> at 5,402 — are the obvious beneficiaries once their subsystem headers stop dragging the full device-ID set along. This groundwork is what makes the broader device-ID cleanup in the next section practical to build and review.
Device ID conversion
Named initializers keep device-ID tables correct as their structs gain or reorder members, which is why a sweep of 87 drivers in one cycle matters. Two of those conversions changed behavior rather than just formatting: the 8250 PCI serial driver had entries that specified conflicting values to pci_device_id members, which the cleanup corrects rather than merely restyles, and ALSA’s HDA core gained an include defining struct hda_device_id as part of the same header-hygiene effort.
The other 85 are declarative: Uwe Kleine-König converted pci_device_id, i2c_device_id, and platform_device_id arrays to named initializers across ATA, ALSA, EDAC, HID, Input, gpio, i2c, net, fbdev, watchdog, and the rest of the bus-backed subsystems, dropped .driver_data assignments no code reads, and unified array terminator style. Bus matching behaves identically before and after; the ATA and ALSA conversions are representative. Read against the per-subsystem header split, the sweep is also what lets each driver include the narrow struct definition it needs instead of the umbrella header — the conversion and the split land as one coherent modernization of how the kernel declares the buses it can probe.
The motivation for making those initializations robust against changes of the struct is to replace the .driver_data member by an anonymous union that contains a pointer in addition to the unsigned long. This allows dropping some casts and thus improves type safety. The cover letter for the series converting drivers/power to named initializers for platform_device_id arrays has some details.
IIO subsystem
IIO is where most of BayLibre’s authored work landed this cycle, split between scan-buffer and ABI groundwork and a sweep of timestamp-channel cleanup across drivers. David Lechner replaced the hand-filled struct iio_chan_spec fields with the existing IIO_CHAN_SOFT_TIMESTAMP() macro, starting with at91_adc and then cc10001_adc, dln2-adc, stm32-adc, the cros_ec_sensors and scmi_sensors common code, and cros_ec_light_prox and cros_ec_baro. Spelling the timestamp channel out by hand was verbose and mistake-prone; the macro collapse removes a class of those mistakes. The same pass deletes the SSP_CHAN_TIMESTAMP() macro, which was identical to IIO_CHAN_SOFT_TIMESTAMP(), and folds its users onto the shared definition.
Francesco Lavra extended the IIO ABI on two fronts. A new IIO_MOD_QUATERNION_AXIS modifier for the IIO_ROT channel type lets orientation sensors describe the {x, y, z} components of a normalized quaternion vector. The second front opens IIO buffers to non-integer data: the scan-element format character gains f for IEEE 754 floating-point alongside the existing s and u for signed and unsigned integers, the sign field in struct iio_scan_type becomes a union to carry that, and the iio_generic_buffer tool learns to parse it. Both find an in-tree consumer this cycle in the ST LSM6DSX rotation sensor (below).
David’s scan-buffer changes sit directly under that ABI work. Caching the timestamp offset in the scan buffer lets the core place the timestamp element at its correct alignment instead of assuming it always lands eight bytes from the end. That assumption breaks once a scan contains an element larger than sizeof(int64_t): the motivating case is the s32 quaternion vector, where a 16-byte quaternion makes scan_bytes 32 and pushes the timestamp to offset 16, not 24. The one in-tree quaternion driver already works around the misalignment, so the fix is forward-looking, preparing for the scans the new modifier enables. Two related fixes ensure repeat alignment is a power of two and check the return value of iio_compute_scan_bytes(). Separately, the TI ADS7950 ADC switches to spi_optimize_message() for buffered reads, cutting threaded-interrupt CPU use by about 5% on hardware with SPI_CS_WORD support, with larger savings expected where the controller lacks it.
Driver-level work rounds out the subsystem. David removed a compiler-warning workaround in the ENS210 humidity driver, gave the BNO055 IMU an explicit scan-buffer layout, and switched the HID rotation sensor to ext_scan_type. Francesco added rotation-sensor support to the ST LSM6DSX IMU — putting the new IIO_MOD_QUATERNION_AXIS modifier and f float format to use — and fixed its FIFO invalid-sample check: the DRDY_MASK feature marks gyroscope and accelerometer samples taken during filter settling with the magic values 0x7FFF, 0x7FFE, and 0x7FFD, but the driver applied that discard check to every sample type, so valid samples of other types carrying those values were thrown away. Uwe Kleine-König’s IIO contributions drop unused .driver_data from four I2C drivers — ad7091r5, bmc150, max5821, and the sx9324 and sx9360 proximity sensors — and convert their ID tables to named initializers as part of the same Device ID sweep.
m68k architecture
The mcf5441x ColdFire gained support for its dual-DAC block, letting the stmark2 board drive the DAC0 and DAC1 outputs it had wired but could not use. Angelo Dureghello landed the feature as an eight-part series that adds both the Linux device glue and the clock infrastructure the converters need to run.
The hardware side defines the DAC0 and DAC1 module base addresses, adds the CCM (clock configuration module) registers, and fills in the CCR MISCCR2 bitfields that gate the DAC clocks. The series also adds a clock for DAC channel 1 and corrects the clock numbering to match the ColdFire Reference Manual Rev 5, 05/2018, table 9.5 — the prior numbering misaligned the peripheral allocations, so the fix is a precondition for the DAC clocks to attach to the right entries in the clock tree. On the board side, the stmark2 device tree registers the two DAC platform devices, enables the DAC output drives, and switches resource declarations to the ioport.h DEFINE_RES_* macros, so the DACs go from absent to usable in one cycle rather than accumulating partial support.
Uwe also provided a patch that was merged late in the development cycle to fix a kernel warning during build configuration on m68k.
Power management
Heterogeneous SoCs nest power domains, but the generic power-domain core only described that hierarchy for simple providers. Kevin Hilman added support for other providers through a new power-domains-child-ids Devicetree property. An SCMI provider can now declare which of its domains sit under which parents using this new property.
As ARM OMAP maintainer, Kevin also reviewed and merged external device-tree and platform fixes for several boards.
Cleanup, not new behavior, from Uwe Kleine-König in power management: the pmbus mp2869 hardware monitor loses an unjustified __maybe_unused annotation and unused driver data, the max14577 charger drops unread of and platform driver-data, and mt6360_charger switches to using its of_match_table unconditionally; several power-supply drivers also get the same named-initializer conversion as the Device ID sweep for their i2c_device_data arrays.
Devicetree
Beyond the new power-domains-child-ids binding, the rest of this cycle’s authored devicetree work kept existing trees valid against their bindings rather than adding new ones. David Lechner corrected pinctrl node names on older MediaTek SoCs so the trees match their bindings: child node names and the controller node name on MT7623, and the pinctrl node name on MT8135.
Uwe Kleine-König added board pin documentation for the STM32MP135F-DK, the kind of pinctrl documentation that lets a board’s pin usage be read directly from its device tree rather than reverse-engineered from the driver. Together the two threads cover the two ways a device tree stays healthy: correcting node names to match bindings, and documenting what a board actually wires.
Networking and WiFi
A regression in the Ralink RT2X00 WiFi driver broke hostapd on cards that had worked for years — the first of three isolated bug fixes that round out the release, each with an instructive root cause. Corentin Labbe traced it to the EEPROM no longer being initialized correctly: on an RT2790 Wireless 802.11n PCIe card, a kernel between 6.18.26 and 6.18.33 changed the reported RF chipset from 0003 to 0006, and hostapd stopped working. The EEPROM mis-initialization rather than the RF detection itself is the root cause; the likely origin is an indirect PCI subsystem change, which the fix sidesteps by initializing the EEPROM properly.
The networking cleanup from Uwe Kleine-König drops PCI class entries whose .class_mask is zero from the nfp driver — such entries impose no class restriction and so serve no purpose — and applies the same named-initializer conversion as the Device ID sweep to the PSE-PD driver’s i2c_device_data arrays.
TTY and VT
The VT console’s modifier-aware key sequences, introduced in v7.1, shipped with a bug that hit anyone using a non-default keyboard layout. Nicolas Pitre found that csi_modifier_param() builds the xterm modifier parameter from shift_state by counting KG_SHIFTL and KG_SHIFTR as Shift, KG_ALTGR as Alt, and KG_CTRLL and KG_CTRLR as Ctrl, on top of the canonical KG_SHIFT, KG_ALT, and KG_CTRL. That is wrong for keymaps derived from XKB layouts, which encode the active layout group in KG_SHIFTL and KG_SHIFTR: with a non-default group selected and no Shift key held, every cursor and CSI key picked up a spurious Shift — pressing Up with group 2 active emitted ESC[1;2A (Shift+Up) instead of ESC[A. The fix counts only the canonical weights, so genuine modifiers are still encoded while layout and level selectors are not. KG_ALTGR has the same problem as the standard third-level selector, and is excluded for the same reason.
The TTY cleanup from Uwe Kleine-König drops an unused driver_data assignment and redundant zeros from the jsm serial driver, and applies the same named-initializer conversion as the Device ID sweep to the tty serial layer’s i2c_device_data arrays.
PWM subsystem
Sub-microsecond PWM on the i.MX27 needs a workaround for ERR051198, and a truncation in that workaround broke it. Ronaldo Nunez found that while computing the period in microseconds inside .apply(), an intermediate 64-bit value was truncated to 32 bits: for a 3 µs period (PWMPR = 196, prescaler = 1) the expected intermediate is 198000000000 (NSEC_PER_SEC * (196 + 2) * 1), but the truncated result was 431504384. With the wrong period, the ERR051198 duty-cycle workaround could not produce correct timing for sub-microsecond periods. Uwe Kleine-König committed the fix as PWM maintainer.
A second PWM commit from Uwe Kleine-König moves the STM32 driver onto the shared mul_u64_u64_div_u64_roundup() helper, dropping the driver’s own equivalent that predated the core helper — the private copy dated from the waveform-API conversion, before the shared helper existed.
Cross-subsystem fixes and features
The rest of the release spans cross-subsystem fixes and smaller features, plus a final cleanup sweep. Carlo Caione fixed a NULL bus dereference in of_pci_range_parser_one(): a bus-matching rework made of_match_bus() return NULL for nodes that have ranges or dma-ranges but no local #address-cells, parser_init() stored that NULL, and the range iterator later dereferenced it. The fix rejects such nodes in parser_init() and makes of_dma_get_max_cpu_address() honor the init failure, so a rejected node can no longer clamp the DMA limit.
Two additions stand out from the cleanup. Markus Schneider-Pargmann extended the TI Dual-Mode Timer (timer-ti-dm) driver with clocksource and clockevent support, using the first always-on timer marked with ti,timer-alwon as the clocksource so the platform keeps time without depending on per-CPU timer logic — useful in low-power or SMP configurations where those timers are stopped or dedicated elsewhere — and corrected a comment that referenced the property name. Trevor Gamblin helped improve SpacemiT K1 functionality by adding SD card support with UHS-I modes (SDR25, SDR50, SDR104) to the k1-musepi-pro device tree, similar to changes submitted for the k1-orangepi-rv2 and k1-bananapi-f3.
Francesco Lavra fixed a regcache_init() bug where an error from cache_ops->populate() was overwritten by the exit callback’s return value, hiding the failure and risking a later NULL dereference. David Lechner added a MAINTAINERS entry for IIO API documentation and refreshed the triggered-buffers documentation example to use the new helpers. Jérôme Brunet, as Meson clock and ASoC maintainer, merged Amlogic T7 PLL clock binding fixes and reviewed a mutex-guard fix in the axg-tdm-formatter driver. The rest is Uwe Kleine-König’s cleanup sweep across more than 40 drivers: dropping empty i2c remove callbacks and unused includes, adding explicit includes for structs like dmi_system_id and cpu_feature, replacing direct UTS_RELEASE use in drm/amdgpu and drm/xe, and extending the same named-initializer conversion from the Device ID sweep to the remaining bus-backed drivers. None of it changes behavior; all of it shrinks the surface area the device-ID and header work has to touch.