:orphan:

..
  See
  https://docs.zephyrproject.org/latest/releases/index.html#migration-guides
  for details of what is supposed to go into this document.

.. _migration_4.2:

Migration guide to Zephyr v4.2.0
################################

This document describes the changes required when migrating your application from Zephyr v4.1.0 to
Zephyr v4.2.0.

Any other changes (not directly related to migrating applications) can be found in
the :ref:`release notes<zephyr_4.2>`.

.. contents::
    :local:
    :depth: 2

Build System
************

* HWMv1 support has been removed, any out-of-tree boards or SoCs in HWMv1 format must be migrated
  to :ref:`HWMv2 <hw_model_v2>` to work with Zephyr v4.2 onwards.

Kernel
******

Boards
******

* All boards based on Nordic ICs that used the ``nrfjprog`` Nordic command-line
  tool for flashing by default have been modified to instead default to the new
  nRF Util (``nrfutil``) tool. This means that you may need to `install nRF Util
  <https://www.nordicsemi.com/Products/Development-tools/nrf-util>`_ or, if you
  prefer to continue using ``nrfjprog``, you can do so by invoking west while
  specifying the runner: ``west flash -r nrfjprog``. The full documentation for
  nRF Util can be found
  `here <https://docs.nordicsemi.com/bundle/nrfutil/page/README.html>`_.

* All boards based on a Nordic IC of the nRF54L series now default to not
  erasing any part of the internal storage when flashing. If you'd like to
  revert to the previous default of erasing the pages that will be written to by
  the firmware to be flashed you can set the new ``--erase-mode`` command-line
  switch when invoking ``west flash`` to ``ranges``.
  Note that RRAM on nRF54L devices is not physically paged, and paging is
  only artificially provided, with a page size of 4096 bytes, for an easier
  transition of nRF52 software to nRF54L devices.

* The config option :kconfig:option:`CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME` has been deprecated
  in favor of :kconfig:option:`CONFIG_NATIVE_SIM_SLOWDOWN_TO_REAL_TIME`.

* The DT binding :dtcompatible:`zephyr,native-posix-cpu` has been deprecated in favor of
  :dtcompatible:`zephyr,native-sim-cpu`.

* Zephyr now supports version 1.11.6 of the :zephyr:board:`neorv32`. NEORV32 processor (SoC)
  implementations need to be updated to this version to be compatible with Zephyr v4.2.0.

* The :zephyr:board:`neorv32` now targets NEORV32 processor (SoC) templates via board variants. The
  old ``neorv32`` board target is now named ``neorv32/neorv32/up5kdemo``.

* ``arduino_uno_r4_minima``, ``arduino_uno_r4_wifi``, and ``mikroe_clicker_ra4m1`` have migrated to
  new FSP-based configurations.
  While there are no major functional changes, the device tree structure has been significantly revised.
  The following device tree bindings are now removed:
  ``renesas,ra-gpio``, ``renesas,ra-uart-sci``, ``renesas,ra-pinctrl``,
  ``renesas,ra-clock-generation-circuit``, and ``renesas,ra-interrupt-controller-unit``.
  Instead, use the following replacements:
  - :dtcompatible:`renesas,ra-gpio-ioport`
  - :dtcompatible:`renesas,ra-sci-uart`
  - :dtcompatible:`renesas,ra-pinctrl-pfs`
  - :dtcompatible:`renesas,ra-cgc-pclk-block`

* Nucleo WBA52CG board (``nucleo_wba52cg``) is not supported anymore since it is NRND
  (Not Recommended for New Design) and it is not supported anymore in the STM32CubeWBA from
  version 1.1.0 (July 2023). The migration to :zephyr:board:`nucleo_wba55cg` (``nucleo_wba55cg``)
  is recommended and it could be done without any change.

* Espressif boards ``esp32_devkitc_wroom`` and ``esp32_devkitc_wrover`` shared almost identical features.
  The differences are covered by the Kconfig options so both boards were merged into ``esp32_devkitc``.

* STM32 boards should now add OpenOCD programming support by including ``openocd-stm32.board.cmake``
  instead of ``openocd.board.cmake``. The ``openocd-stm32.board.cmake`` file extends the default
  OpenOCD runner with manufacturer-specific configuration like STM32 mass erase commands.

* STM32N6570-DK boards's default variant (``stm32n6570_dk/stm32n657xx``) is now supposed to be a
  chainloaded application and should be built using ``--sysbuild``. The old default,
  which built applications to run as First Stage BootLoader, is now available as a dedicated
  variant (``stm32n6570_dk/stm32n657xx/fsbl``) that must be selected explicitly.
  See board documentation for more information about these variants.

* STM32 boards that embed TF-M BL2 boot stage (``b_u585i_iot02a//ns``, ``nucleo_l552ze_q//ns``
  and ``stm32l562e_dk//ns``) do not embed HW crypto accelerator drivers in BL2 as they previously
  did, now relying on Mbed TLS software implementation. This is related to the upgrade to TF-M
  v2.2. HW crypto accelerators are still supported in TF-M, but only in the runtime secure firmware.

Device Drivers and Devicetree
*****************************

.. zephyr-keep-sorted-start re(^\w)

Audio
=====

* The binding file for :dtcompatible:`cirrus,cs43l22` has been renamed to have a name
  matching the compatible string.

Counter
=======

* ``counter_native_posix`` has been renamed ``counter_native_sim``, and with it its
  kconfig options and DT binding. :dtcompatible:`zephyr,native-posix-counter`  has been deprecated
  in favor of :dtcompatible:`zephyr,native-sim-counter`.
  And :kconfig:option:`CONFIG_COUNTER_NATIVE_POSIX` and its related options with
  :kconfig:option:`CONFIG_COUNTER_NATIVE_SIM` (:github:`86616`).

DAI
===

* Renamed the devicetree property ``dai_id`` to ``dai-id``.
* Renamed the devicetree property ``afe_name`` to ``afe-name``.
* Renamed the devicetree property ``agent_disable`` to ``agent-disable``.
* Renamed the devicetree property ``ch_num`` to ``ch-num``.
* Renamed the devicetree property ``mono_invert`` to ``mono-invert``.
* Renamed the devicetree property ``quad_ch`` to ``quad-ch``.
* Renamed the devicetree property ``int_odd`` to ``int-odd``.

DMA
===

* Renamed the devicetree property ``nxp,a_on`` to ``nxp,a-on``.
* Renamed the devicetree property ``dma_channels`` to ``dma-channels``.
* The binding files for Xilinx DMA controllers have been renamed to use the proper vendor prefix
  (``xlnx`` instead of ``xilinx``) and to match their compatible string.

Devicetree
==========

* Many of the vendor-specific and arch-specific files that were in dts/common have been moved
  to more specific locations. Therefore, any dts files which ``#include <common/some_file.dtsi>``
  a file from in the zephyr tree will need to be changed to just ``#include <some_file.dtsi>``.

* Silicon Labs SoC-level dts files for Series 2 have been reorganized in subdirectories per device
  superfamily. Therefore, any dts files for boards that use Series 2 SoCs will need to change their
  include from ``#include <silabs/some_soc.dtsi>`` to ``#include <silabs/xg2[1-9]/some_soc.dtsi>``.

* The :c:macro:`DT_ENUM_HAS_VALUE` and :c:macro:`DT_INST_ENUM_HAS_VALUE` macros are now
  checking all values, when used on an array, not just the first one.

* Property names in devicetree and bindings use hyphens(``-``) as separators, and replacing
  all previously used underscores(``_``). For local code, you can migrate property names in
  bindings to use hyphens by running the ``scripts/utils/migrate_bindings_style.py`` script.

Display
=======

* On STM32 devices, the LTDC driver (:dtcompatible:`st,stm32-ltdc`) RGB565 format
  ``PIXEL_FORMAT_RGB565`` has been replaced by ``PIXEL_FORMAT_BGR565`` to match
  the format expected by Zephyr. This change ensures proper behavior of both
  display and video capture samples.

EEPROM
========

* :dtcompatible:`ti,tmp116-eeprom` has been renamed to :dtcompatible:`ti,tmp11x-eeprom` because it
  supports both tmp117 and tmp119.

Enhanced Serial Peripheral Interface (eSPI)
===========================================

* Renamed the devicetree property ``io_girq`` to ``io-girq``.
* Renamed the devicetree property ``vw_girqs`` to ``vw-girqs``.
* Renamed the devicetree property ``pc_girq`` to ``pc-girq``.
* Renamed the devicetree property ``poll_timeout`` to ``poll-timeout``.
* Renamed the devicetree property ``poll_interval`` to ``poll-interval``.
* Renamed the devicetree property ``consec_rd_timeout`` to ``consec-rd-timeout``.
* Renamed the devicetree property ``sus_chk_delay`` to ``sus-chk-delay``.
* Renamed the devicetree property ``sus_rsm_interval`` to ``sus-rsm-interval``.

Entropy
=======

* ``fake_entropy_native_posix`` has been renamed ``fake_entropy_native_sim``, and with it its
  kconfig options and DT binding. :dtcompatible:`zephyr,native-posix-rng`  has been deprecated
  in favor of :dtcompatible:`zephyr,native-sim-rng`.
  And :kconfig:option:`CONFIG_FAKE_ENTROPY_NATIVE_POSIX` and its related options with
  :kconfig:option:`CONFIG_FAKE_ENTROPY_NATIVE_SIM` (:github:`86615`).

Ethernet
========

* Removed Kconfig option ``ETH_STM32_HAL_MII`` (:github:`86074`).
  PHY interface type is now selected via the ``phy-connection-type`` property in the device tree.

* The :dtcompatible:`st,stm32-ethernet` driver now requires the ``phy-handle`` phandle to be
  set to the according PHY node in the device tree (:github:`87593`).

* The Kconfig options ``ETH_STM32_HAL_PHY_ADDRESS``, ``ETH_STM32_CARRIER_CHECK``,
  ``ETH_STM32_CARRIER_CHECK_RX_IDLE_TIMEOUT_MS``, ``ETH_STM32_AUTO_NEGOTIATION_ENABLE``,
  ``ETH_STM32_SPEED_10M``, ``ETH_STM32_MODE_HALFDUPLEX`` have been removed, as they are no longer
  needed, and the driver now uses the ethernet phy api to communicate with the phy driver, which
  is responsible for configuring the phy settings (:github:`87593`).

* ``ethernet_native_posix`` has been renamed ``ethernet_native_tap``, and with it its
  kconfig options: :kconfig:option:`CONFIG_ETH_NATIVE_POSIX` and its related options have been
  deprecated in favor of :kconfig:option:`CONFIG_ETH_NATIVE_TAP` (:github:`86578`).

* NuMaker Ethernet driver ``eth_numaker.c`` now supports ``gen_random_mac``,
  and the EMAC data flash feature has been removed (:github:`87953`).

* The enum ``ETHERNET_DSA_MASTER_PORT`` and ``ETHERNET_DSA_SLAVE_PORT`` in
  :zephyr_file:`include/zephyr/net/ethernet.h` have been renamed
  to ``ETHERNET_DSA_CONDUIT_PORT`` and ``ETHERNET_DSA_USER_PORT``.

* Enums for the Ethernet speed have been renamed to be more independent of the used medium.
  ``LINK_HALF_10BASE_T``, ``LINK_FULL_10BASE_T``, ``LINK_HALF_100BASE_T``, ``LINK_FULL_100BASE_T``,
  ``LINK_HALF_1000BASE_T``, ``LINK_FULL_1000BASE_T``, ``LINK_FULL_2500BASE_T`` and
  ``LINK_FULL_5000BASE_T`` have been renamed to :c:enumerator:`LINK_HALF_10BASE`,
  :c:enumerator:`LINK_FULL_10BASE`, :c:enumerator:`LINK_HALF_100BASE`,
  :c:enumerator:`LINK_FULL_100BASE`, :c:enumerator:`LINK_HALF_1000BASE`,
  :c:enumerator:`LINK_FULL_1000BASE`, :c:enumerator:`LINK_FULL_2500BASE` and
  :c:enumerator:`LINK_FULL_5000BASE`.
  ``ETHERNET_LINK_10BASE_T``, ``ETHERNET_LINK_100BASE_T``, ``ETHERNET_LINK_1000BASE_T``,
  ``ETHERNET_LINK_2500BASE_T`` and ``ETHERNET_LINK_5000BASE_T`` have been renamed to
  :c:enumerator:`ETHERNET_LINK_10BASE`, :c:enumerator:`ETHERNET_LINK_100BASE`,
  :c:enumerator:`ETHERNET_LINK_1000BASE`, :c:enumerator:`ETHERNET_LINK_2500BASE` and
  :c:enumerator:`ETHERNET_LINK_5000BASE` respectively (:github:`87194`).

* ``ETHERNET_CONFIG_TYPE_LINK``, ``ETHERNET_CONFIG_TYPE_DUPLEX``, ``ETHERNET_CONFIG_TYPE_AUTO_NEG``
  and the related ``NET_REQUEST_ETHERNET_SET_LINK``, ``NET_REQUEST_ETHERNET_SET_DUPLEX``,
  ``NET_REQUEST_ETHERNET_SET_AUTO_NEGOTIATION`` have been removed. :c:func:`phy_configure_link`
  together with :c:func:`net_eth_get_phy` should be used instead to configure the link
  (:github:`90652`).

* :c:func:`phy_configure_link` got a ``flags`` parameter. Set it to ``0`` to preserve the old
  behavior (:github:`91354`).

Flash
=====

* Renamed the file from ``flash_hp_ra.h`` to ``soc_flash_renesas_ra_hp.h``.
* Renamed the file from ``flash_hp_ra.c`` to ``soc_flash_renesas_ra_hp.c``.
* Renamed the file from ``flash_hp_ra_ex_op.c`` to ``soc_flash_renesas_ra_hp_ex_op.c``.

* The Flash HP Renesas RA dual bank mode Kconfig symbol :kconfig:option:`CONFIG_DUAL_BANK_MODE`
  has been removed.
* The Flash HP Renesas RA Kconfig symbol :kconfig:option:`CONFIG_RA_FLASH_HP`
  has been renamed to :kconfig:option:`CONFIG_SOC_FLASH_RENESAS_RA_HP`.
* The Flash HP Renesas RA write protect Kconfig symbol :kconfig:option:`CONFIG_FLASH_RA_WRITE_PROTECT`
  has been renamed to :kconfig:option:`CONFIG_FLASH_RENESAS_RA_HP_WRITE_PROTECT`.

* Separate the file ``renesas,ra-nv-flash.yaml`` into 2 files ``renesas,ra-nv-code-flash.yaml``
  and ``renesas,ra-nv-data-flash.yaml``.
* Separate the ``compatible`` from ``renesas,ra-nv-flash`` to :dtcompatible:`renesas,ra-nv-code-flash.yaml`
  and :dtcompatible:`renesas,ra-nv-data-flash.yaml`.

GPIO
====

* To support the RP2350B, which has many pins, the Raspberry Pi-GPIO configuration has
  been changed. The previous role of :dtcompatible:`raspberrypi,rpi-gpio` has been migrated to
  :dtcompatible:`raspberrypi,rpi-gpio-port`, and :dtcompatible:`raspberrypi,rpi-gpio` is
  now left as a placeholder and mapper.
  The labels have also been changed along, so no changes are necessary for regular use.
* ``arduino-nano-header-r3`` is renamed to :dtcompatible:`arduino-nano-header`.
  Because the R3 comes from the Arduino UNO R3, which has changed the connector from
  the former version, and is unrelated to the Arduino Nano.
* Moved file ``include/zephyr/dt-bindings/gpio/nordic-npm1300-gpio.h`` to
  :zephyr_file:`include/zephyr/dt-bindings/gpio/nordic-npm13xx-gpio.h` and renamed all instances of
  ``NPM1300`` to ``NPM13XX`` in the defines
* Renamed ``CONFIG_GPIO_NPM1300`` to :kconfig:option:`CONFIG_GPIO_NPM13XX`,
  ``CONFIG_GPIO_NPM1300_INIT_PRIORITY`` to :kconfig:option:`CONFIG_GPIO_NPM13XX_INIT_PRIORITY`

I2S
===
* The :dtcompatible:`nxp,mcux-i2s` driver added property ``mclk-output``. Set this property to
* configure the MCLK signal as an output.  Older driver versions used the macro
* ``I2S_OPT_BIT_CLK_SLAVE`` to configure the MCLK signal direction. (:github:`88554`)

LED
===

* Renamed ``CONFIG_LED_NPM1300`` to :kconfig:option:`CONFIG_LED_NPM13XX`

MFD
===

* Moved file ``include/zephyr/drivers/mfd/npm1300.h`` to :zephyr_file:`include/zephyr/drivers/mfd/npm13xx.h`
  and renamed all instances of ``npm1300``/``NPM1300`` to ``npm13xx``/``NPM13XX`` in the enums and
  function names
* Renamed ``CONFIG_MFD_NPM1300`` to :kconfig:option:`CONFIG_MFD_NPM13XX`,
  ``CONFIG_MFD_NPM1300_INIT_PRIORITY`` to :kconfig:option:`CONFIG_MFD_NPM13XX_INIT_PRIORITY`

Misc
====

* Moved file ``drivers/memc/memc_nxp_flexram.h`` to
  :zephyr_file:`include/zephyr/drivers/misc/flexram/nxp_flexram.h` so that the
  file can be included using ``<zephyr/drivers/misc/flexram/nxp_flexram.h>``.
  Modification to CMakeList.txt to use include this driver is no longer
  required.
* All memc_flexram_* namespaced things including kconfigs and C API
  have been changed to just flexram_*.

* Select ``CONFIG_ETHOS_U`` instead ``CONFIG_ARM_ETHOS_U`` to enable Ethos-U NPU driver.
* Rename all configs that have prefix ``CONFIG_ARM_ETHOS_U_`` to ``CONFIG_ETHOS_U_``.

Modem
=====

* Removed Kconfig option :kconfig:option:`CONFIG_MODEM_CELLULAR_CMUX_MAX_FRAME_SIZE` in favor of
  :kconfig:option:`CONFIG_MODEM_CMUX_WORK_BUFFER_SIZE` and :kconfig:option:`CONFIG_MODEM_CMUX_MTU`.

Regulator
=========

* Moved file ``include/zephyr/dt-bindings/regulator/npm1300.h`` to
  :zephyr_file:`include/zephyr/dt-bindings/regulator/npm13xx.h` and renamed all instances of
  ``NPM1300`` to ``NPM13XX`` in the defines
* Renamed ``CONFIG_REGULATOR_NPM1300`` to :kconfig:option:`CONFIG_REGULATOR_NPM13XX`,
  ``CONFIG_REGULATOR_NPM1300_COMMON_INIT_PRIORITY`` to :kconfig:option:`REGULATOR_NPM13XX_COMMON_INIT_PRIORITY`,
  ``CONFIG_REGULATOR_NPM1300_INIT_PRIORITY`` to :kconfig:option:`CONFIG_REGULATOR_NPM13XX_INIT_PRIORITY`
* :dtcompatible:`nordic,npm1300-regulator` BUCK and LDO node GPIO properties are now specified as an
  integer array without a GPIO controller, removing the requirement for a
  :dtcompatible:`nordic,npm1300-gpio` node to be present and enabled for GPIO control of the output
  rails. For example, ``enable-gpios = <&pmic_gpios 3 GPIO_ACTIVE_LOW>;`` is now specified as
  ``enable-gpio-config = <3 GPIO_ACTIVE_LOW>;``.

SPI
===

* Renamed ``CONFIG_SPI_MCUX_LPSPI`` to :kconfig:option:`CONFIG_SPI_NXP_LPSPI`,
  and similar for any child configs for that driver, including
  :kconfig:option:`CONFIG_SPI_NXP_LPSPI_DMA` and :kconfig:option:`CONFIG_SPI_NXP_LPSPI_CPU`.
* Renamed the device tree property ``port_sel`` to ``port-sel``.
* Renamed the device tree property ``chip_select`` to ``chip-select``.
* The binding file for :dtcompatible:`andestech,atcspi200` has been renamed to have a name
  matching the compatible string.

Sensors
=======

* ``ltr`` vendor prefix has been renamed to ``liteon``, and with it the
  :dtcompatible:`ltr,f216a` name has been replaced by :dtcompatible:`liteon,ltrf216a`.
  The choice :kconfig:option:`DT_HAS_LTR_F216A_ENABLED` has been replaced with
  :kconfig:option:`DT_HAS_LITEON_LTRF216A_ENABLED` (:github:`85453`)

* :dtcompatible:`ti,tmp116` has been renamed to :dtcompatible:`ti,tmp11x` because it supports
  tmp116, tmp117 and tmp119.

* :dtcompatible:`meas,ms5837` has been replaced by :dtcompatible:`meas,ms5837-30ba`
  and :dtcompatible:`meas,ms5837-02ba`. In order to use one of the two variants, the
  status property needs to be used as well.

* The :dtcompatible:`we,wsen-itds` driver has been renamed to
  :dtcompatible:`we,wsen-itds-2533020201601`.
  The Device Tree can be configured as follows:

  .. code-block:: devicetree

    &i2c0 {
      itds:itds-2533020201601@19 {
        compatible = "we,wsen-itds-2533020201601";
        reg = <0x19>;
        odr = "400";
        op-mode = "high-perf";
        power-mode = "normal";
        events-interrupt-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
        drdy-interrupt-gpios = < &gpio1 2 GPIO_ACTIVE_HIGH >;
      };
    };

* The binding file for :dtcompatible:`raspberrypi,pico-temp.yaml` has been renamed to have a name
  matching the compatible string.

* Moved file ``include/zephyr/drivers/sensor/npm1300_charger.h`` to
  :zephyr_file:`include/zephyr/drivers/sensor/npm13xx_charger.h` and renamed all instances of
  ``NPM1300`` to ``NPM13XX`` in the enums

* Renamed ``CONFIG_NPM1300_CHARGER`` to :kconfig:option:`CONFIG_NPM13XX_CHARGER`

Serial
=======

* ``uart_native_posix`` has been renamed ``uart_native_pty``, and with it its
  kconfig options and DT binding. :dtcompatible:`zephyr,native-posix-uart`  has been deprecated
  in favor of :dtcompatible:`zephyr,native-pty-uart`.
  :kconfig:option:`CONFIG_UART_NATIVE_POSIX` and its related options with
  :kconfig:option:`CONFIG_UART_NATIVE_PTY`.
  The choice :kconfig:option:`CONFIG_NATIVE_UART_0` has been replaced with
  :kconfig:option:`CONFIG_UART_NATIVE_PTY_0`, but now, it is also possible to select if a UART is
  connected to the process stdin/out instead of a PTY at runtime with the command line option
  ``--<uart_name>_stdinout``.
  :kconfig:option:`CONFIG_NATIVE_UART_AUTOATTACH_DEFAULT_CMD` has been replaced with
  :kconfig:option:`CONFIG_UART_NATIVE_PTY_AUTOATTACH_DEFAULT_CMD`.
  :kconfig:option:`CONFIG_UART_NATIVE_WAIT_PTS_READY_ENABLE` has been deprecated. The functionality
  it enabled is now always enabled as there is no drawbacks from it.
  :kconfig:option:`CONFIG_UART_NATIVE_POSIX_PORT_1_ENABLE` has been deprecated. This option does
  nothing now. Instead users should instantiate as many :dtcompatible:`zephyr,native-pty-uart` nodes
  as native PTY UART instances they want. (:github:`86739`)

Stepper
=======

* Refactored the ``stepper_enable(const struct device * dev, bool enable)`` function to
  :c:func:`stepper_enable` & :c:func:`stepper_disable`.

Timer
=====

* ``native_posix_timer`` has been renamed ``native_sim_timer``, and so its kconfig option
  :kconfig:option:`CONFIG_NATIVE_POSIX_TIMER` has been deprecated in favor of
  :kconfig:option:`CONFIG_NATIVE_SIM_TIMER`, (:github:`86612`).

* :dtcompatible:`andestech,machine-timer`, :dtcompatible:`neorv32-machine-timer`,
  :dtcompatible:`telink,machine-timer`, :dtcompatible:`lowrisc,machine-timer`,
  :dtcompatible:`niosv-machine-timer`, and :dtcompatible:`scr,machine-timer` have
  been unified under :dtcompatible:`riscv,machine-timer`.

  The addresses of both ``MTIME`` and ``MTIMECMP`` registers must now be explicitly
  specified using the ``reg`` and ``reg-names`` properties. The ``reg-names`` property
  is now **required**, and must list names corresponding one-to-one with each entry
  in ``reg``. (:github:`84175` and :github:`89847`)

  Example:

  .. code-block:: devicetree

    mtimer: timer@d1000000 {
        compatible = "riscv,machine-timer";
        interrupts-extended = <&cpu0_intc 7>;
        reg = <0xd1000000 0x8
               0xd1000008 0x8>;
        reg-names = "mtime", "mtimecmp";
    };

* It is now possible to use a ``timebase-frequency`` property in the cpus DTS group to provide
  the value for :kconfig:option:`CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC` instead of
  using a value: :github:`91296`

Video
=====

* 8 bit RAW Bayer formats BGGR8 / GBRG8 / GRBG8 / RGGB8 have been renamed by adding
  a S prefix in front:

  ``VIDEO_PIX_FMT_BGGR8`` becomes :c:macro:`VIDEO_PIX_FMT_SBGGR8`
  ``VIDEO_PIX_FMT_GBRG8`` becomes :c:macro:`VIDEO_PIX_FMT_SGBRG8`
  ``VIDEO_PIX_FMT_GRBG8`` becomes :c:macro:`VIDEO_PIX_FMT_SGRBG8`
  ``VIDEO_PIX_FMT_RGGB8`` becomes :c:macro:`VIDEO_PIX_FMT_SRGGB8`

* On STM32 devices, the DCMI driver (:dtcompatible:`st,stm32-dcmi`) now relies on endpoint based
  video-interfaces.yaml bindings for sensor interface properties (such as bus width and
  synchronization signals).
  Also the ``capture-rate`` property has been replaced by the usage of the frame interval API
  :c:func:`video_set_frmival`.
  See (:github:`89627`).

* :c:enum:`video_endpoint_id` has been dropped. It is no longer a parameter in any video API.

* :c:enum:`video_buf_type` has been added. It is a required parameter in the following video APIs:
  :c:func:`set_stream`, :c:func:`video_stream_start`, :c:func:`video_stream_stop`

* ``video_format.pitch`` has been updated to be set explicitly by the driver, a task formerly
  required by the application. This update enables the application to correctly allocate a buffer
  size on a per driver basis. Existing applications will not be broken by this change but can be
  simplified as performed in the sample in the commit ``33dcbe37cfd3593e8c6e9cfd218dd31fdd533598``.

* Samples and projects using the :ref:`native simulator <native_sim>` now require specifying the
  ``--snippet`` :ref:`video-sw-generator <snippet-video-sw-generator>` to build correctly.

* :c:func:`video_query_ctrl` now takes a single argument with the :c:struct:`video_ctrl_query`,
  which now contains a ``video_ctrl_query.dev`` field to specify and read back which device is
  being queried (:github:`91265`).

Watchdog
========
* Renamed ``CONFIG_WDT_NPM1300`` to :kconfig:option:`CONFIG_WDT_NPM13XX`,
  ``CONFIG_WDT_NPM1300_INIT_PRIORITY`` to :kconfig:option:`CONFIG_WDT_NPM13XX_INIT_PRIORITY`

qSPI/oSPI/xSPI
==============

* On STM32 devices, external memories device tree descriptions for size and address are now split
  in two separate properties to comply with specification recommendations.

  For instance, following external flash description ``reg = <0x70000000 DT_SIZE_M(64)>; /* 512 Mbits /``
  is changed to ``reg = <0>;`` ``size = <DT_SIZE_M(512)>; / 512 Mbits */``.

  Note that the property gives the actual size of the memory device in bits.
  Previous mapping address information is now described in xspi, ospi or qspi nodes at SoC dtsi level.

.. zephyr-keep-sorted-stop

Bluetooth
*********

.. zephyr-keep-sorted-start re(^\w)

Bluetooth Audio
===============

* ``CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE`` has been renamed to
  :kconfig:option:`CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE``. (:github:`86763``)

* ``bt_csip_set_member_get_sirk`` has been removed. Use :c:func:`bt_csip_set_member_get_info` to get
  the SIRK (and other information). (:github:`86996`)

* ``BT_AUDIO_CONTEXT_TYPE_PROHIBITED`` has been renamed to
  :c:enumerator:`BT_AUDIO_CONTEXT_TYPE_NONE`. (:github:`89506`)

Bluetooth Classic
=================

* The parameters of HFP AG callback ``sco_disconnected`` of the struct :c:struct:`bt_hfp_ag_cb`
  have been changed to SCO connection object ``struct bt_conn *sco_conn`` and the disconnection
  reason of the SCO connection ``uint8_t reason``.

Bluetooth HCI
=============

* The buffer types passing through the HCI driver interface are now indicated as H:4 encoded prefix
  bytes as part of the buffer payload itself. The bt_buf_set_type() and bt_buf_get_type() functions
  have been deprecated, but are still usable, with the exception that they can only be
  called once per buffer.

* The :c:func:`bt_hci_cmd_create` function has been deprecated and the new :c:func:`bt_hci_cmd_alloc`
  function should be used instead. The new function takes no parameters because the command
  sending functions have been updated to do the command header encoding.

Bluetooth Host
==============

* The symbols ``BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_<NUMBER>`` in
  :zephyr_file:`include/zephyr/bluetooth/conn.h` have been renamed
  to ``BT_LE_CS_TONE_ANTENNA_CONFIGURATION_A<NUMBER>_B<NUMBER>``.

* The ISO data paths are not longer setup automatically, and shall explicitly be setup and removed
  by the application by calling :c:func:`bt_iso_setup_data_path` and
  :c:func:`bt_iso_remove_data_path` respectively. (:github:`75549`)

* ``BT_ISO_CHAN_TYPE_CONNECTED`` has been split into ``BT_ISO_CHAN_TYPE_CENTRAL`` and
  ``BT_ISO_CHAN_TYPE_PERIPHERAL`` to better describe the type of the ISO channel, as behavior for
  each role may be different. Any existing uses/checks for ``BT_ISO_CHAN_TYPE_CONNECTED``
  can be replaced with an ``||`` of the two. (:github:`75549`)

* The ``struct _bt_gatt_ccc`` in :zephyr_file:`include/zephyr/bluetooth/gatt.h` has been renamed to
  struct :c:struct:`bt_gatt_ccc_managed_user_data`. (:github:`88652`)

* The macro ``BT_GATT_CCC_INITIALIZER`` in :zephyr_file:`include/zephyr/bluetooth/gatt.h`
  has been renamed to :c:macro:`BT_GATT_CCC_MANAGED_USER_DATA_INIT`. (:github:`88652`)

* The ``CONFIG_BT_ISO_TX_FRAG_COUNT`` Kconfig option was removed as it was completely unused.
  Any uses of it can simply be removed. (:github:`89836`)

.. zephyr-keep-sorted-stop

Networking
**********

* The struct ``net_linkaddr_storage`` has been renamed to struct
  :c:struct:`net_linkaddr` and the old struct ``net_linkaddr`` has been removed.
  The struct :c:struct:`net_linkaddr` now contains space to store the link
  address instead of having pointer that point to the link address. This avoids
  possible dangling pointers when cloning struct :c:struct:`net_pkt`. This will
  increase the size of struct :c:struct:`net_pkt` by 4 octets for IEEE 802.15.4,
  but there is no size increase for other network technologies like Ethernet.
  Note that any code that is using struct :c:struct:`net_linkaddr` directly, and
  which has checks like ``if (lladdr->addr == NULL)``, will no longer work as expected
  (because the addr is not a pointer) and must be changed to ``if (lladdr->len == 0)``
  if the code wants to check that the link address is not set.

* TLS credential type ``TLS_CREDENTIAL_SERVER_CERTIFICATE`` was renamed to
  more generic :c:enumerator:`TLS_CREDENTIAL_PUBLIC_CERTIFICATE` to better
  reflect the purpose of this credential type.

* The MQTT public API function :c:func:`mqtt_disconnect` has changed. The function
  now accepts additional ``param`` parameter to support MQTT 5.0 case. The parameter
  is optional and not used with older MQTT versions - MQTT 3.1.1 users should pass
  NULL as an argument.

* The ``AF_PACKET/SOCK_RAW/IPPROTO_RAW`` socket combination is no longer supported,
  as ``AF_PACKET`` sockets should only accept IEEE 802.3 protocol numbers. As an
  alternative, ``AF_PACKET/SOCK_DGRAM/ETH_P_ALL`` or ``AF_INET(6)/SOCK_RAW/IPPROTO_IP``
  sockets can be used, depending on the actual use case.

* The HTTP server now respects the configured ``_concurrent`` and  ``_backlog`` values. Check that
  you provide applicable values to :c:macro:`HTTP_SERVICE_DEFINE_EMPTY`,
  :c:macro:`HTTPS_SERVICE_DEFINE_EMPTY`, :c:macro:`HTTP_SERVICE_DEFINE` and
  :c:macro:`HTTPS_SERVICE_DEFINE`.

* :kconfig:option:`CONFIG_NET_ZPERF` no longer includes server support by default. To use
  the server commands, enable :kconfig:option:`CONFIG_NET_ZPERF_SERVER`. If server support
  is not needed, :kconfig:option:`CONFIG_ZVFS_POLL_MAX` can possibly be reduced.

* The L2 Wi-Fi shell now supports interface option for most commands, to accommodate this
  change some of the existing options have been renamed. The following table
  summarizes the changes:

  +------------------------+---------------------+--------------------+
  | Command(s)             | Old option          | New option         |
  +------------------------+---------------------+--------------------+
  | ``wifi connect``       | ``-i``              | ``-g``             |
  | ``wifi ap enable``     |                     |                    |
  +------------------------+---------------------+--------------------+
  | ``wifi twt setup``     | ``-i``              | ``-p``             |
  +------------------------+---------------------+--------------------+
  | ``wifi ap config``     | ``-i``              | ``-t``             |
  +------------------------+---------------------+--------------------+
  | ``wifi mode``          | ``--if-index``      | ``--iface``        |
  | ``wifi channel``       |                     |                    |
  | ``wifi packet_filter`` |                     |                    |
  +------------------------+---------------------+--------------------+

* The :c:type:`http_response_cb_t` HTTP client response callback signature has
  changed. The callback function now returns ``int`` instead of ``void``. This
  allows the application to abort the HTTP connection. Existing applications
  need to update their response callback implementations. To retain current
  behavior, simply return 0 from the callback.

* The API signature of ``net_mgmt`` event handler :c:type:`net_mgmt_event_handler_t` and
  request handler :c:type:`net_mgmt_request_handler_t` has changed. The management event
  type is changed from ``uint32_t`` to ``uint64_t``. The change allows event number values
  to be bit masks instead of enum values. The layer code still stays as a enum value.
  The :c:macro:`NET_MGMT_LAYER_CODE` and :c:macro:`NET_MGMT_GET_COMMAND` can be used to get
  the layer code and management event command from the actual event value in the request or
  event handlers if needed.

* The socket options for ``net_mgmt`` type sockets cannot directly be network management
  event types as those are now ``uint64_t`` and the socket option expects a normal 32 bit
  integer value. Because of this, a new ``SO_NET_MGMT_ETHERNET_SET_QAV_PARAM``
  and ``SO_NET_MGMT_ETHERNET_GET_QAV_PARAM`` socket options are created that will replace
  the previously used ``NET_REQUEST_ETHERNET_SET_QAV_PARAM`` and
  ``NET_REQUEST_ETHERNET_GET_QAV_PARAM`` options.

* The DNS server resolver configuration functions :c:func:`dns_resolve_reconfigure` and
  :c:func:`dns_resolve_reconfigure_with_interfaces` now require that the user supplies
  the source of the DNS server information. For example when DNS server information is
  received via DHCPv4, then :c:enumerator:`DNS_SOURCE_DHCPV4` needs to be specified.

.. zephyr-keep-sorted-start re(^\w)

LwM2M
=====

* Accelerometer object: optional resources Y value, Z value, min range value,
  max range value can now be used optionally as per the accelerometer object's
  specification. Users of these resources will now need to provide a read
  buffer.

OpenThread
==========

* The OpenThread stack integration in Zephyr has undergone a major refactor.
  The implementation has been moved from the Zephyr networking layer (``subsys/net/l2/openthread/``)
  to a dedicated module (``modules/openthread/``).

* OpenThread is now a standalone module in Zephyr.
  It can be used independently of Zephyr's networking stack (L2 and IEEE802.15.4 shim layers).
  This enables new use cases, such as applications that use OpenThread directly with their
  own IEEE802.15.4 driver, or that do not need the full Zephyr networking stack.

* Most functions in the :zephyr_file:`include/zephyr/net/openthread.h` file have been deprecated.
  These deprecated APIs are still available for backward compatibility, but new applications should
  use the new APIs provided by the OpenThread module. The following list summarizes the changes:

  * Mutex handling:

    * Previously:

      * ``openthread_api_mutex_lock``
      * ``openthread_api_mutex_try_lock``
      * ``openthread_api_mutex_unlock``

    * Now use:

      * :c:func:`openthread_mutex_lock`
      * :c:func:`openthread_mutex_try_lock`
      * :c:func:`openthread_mutex_unlock`

  * OpenThread starting:

    * Previously: ``openthread_start``
    * Now use: :c:func:`openthread_run`

  * Callback registration:

    * Previously:

      * ``openthread_state_changed_cb_register``
      * ``openthread_state_changed_cb_unregister``

    * Now use:

      * :c:func:`openthread_state_changed_callback_register`
      * :c:func:`openthread_state_changed_callback_unregister`

  * Callback structure:

    * Previously: ``openthread_state_changed_cb``
    * Now use: :c:struct:`openthread_state_changed_callback`

  * The following :c:struct:`openthread_context` struct fields are deprecated and shall not be used
    in new code anymore:

    * ``instance``
    * ``api_lock``
    * ``work_q``
    * ``api_work``
    * ``state_change_cbs``

  * The new functions that were not present before:

    * :c:func:`openthread_init` to initialize the OpenThread stack.
    * :c:func:`openthread_stop` to stop and disable the OpenThread stack.
    * :c:func:`openthread_set_receive_cb` to set the receive callback for the OpenThread stack.

* The OpenThread-related Kconfig options from ``subsys/net/l2/openthread/Kconfig``
  have been moved to :zephyr_file:`modules/openthread/Kconfig`. All Kconfig options remain the same.
  You can still use them in the same way as before, but to modify them, use the new path in the
  menuconfig or guiconfig.

* If the :kconfig:option:`CONFIG_NET_L2_OPENTHREAD` Kconfig option is enabled, Zephyr's L2 layer
  will use the new OpenThread module API as its backend. The L2 layer no longer implements
  OpenThread itself, but delegates the implementation to the module.

* For existing applications using OpenThread through Zephyr's networking stack:

  * Your application should continue to work, as the old APIs are still available for compatibility.
    However, you are encouraged to migrate to the new APIs for future-proofing and use the new
    modular structure.
  * Update any references to OpenThread Kconfig options to use the new path
    (``modules/openthread/Kconfig``) in your configuration tools.

* For applications using :c:struct:`openthread_context` or other deprecated APIs:

  * Begin migrating to the new APIs. The deprecated APIs will be removed in a future release.
  * Avoid direct use of :c:struct:`openthread_context` and related fields; use the new
    initialization and callback registration functions instead.

* For new applications or those using OpenThread without Zephyr L2:

  * Use the new initialization (:c:func:`openthread_init`), run (:c:func:`openthread_run`),
    and callback registration APIs (:c:func:`openthread_state_change_callback_register`).
  * You can now use OpenThread directly, without enabling Zephyr's L2 or IEEE802.15.4 layers, if
    your use case allows.

.. zephyr-keep-sorted-stop


Other subsystems
****************

.. zephyr-keep-sorted-start re(^\w)

Modbus
======

* The ``client_stop_bits`` field in :c:struct:`modbus_serial_param` has been renamed into ``stop_bits``.
  The setting is valid in both client and server modes.
* Custom stop-bit settings are disabled by default and should be enabled
  by :kconfig:option:`CONFIG_MODBUS_NONCOMPLIANT_SERIAL_MODE`.

State Machine Framework
=======================

* :c:func:`smf_set_handled` has been removed.
* State run actions now return an :c:enum:`smf_state_result` value instead of void. and the return
  code determines if the event is propagated to parent run actions or has been handled. A run action
  that handles the event completely should return :c:enum:`SMF_EVENT_HANDLED`, and run actions that
  propagate handling to parent states should return :c:enum:`SMF_EVENT_PROPAGATE`.
* Flat state machines ignore the return value; returning :c:enum:`SMF_EVENT_HANDLED`
  would be the most technically accurate response.

hawkBit
=======

* When :kconfig:option:`CONFIG_HAWKBIT_CUSTOM_DEVICE_ID` is enabled, device_id will no longer
  be prepended with :kconfig:option:`CONFIG_BOARD`. It is the user's responsibility to write a
  callback that prepends the board name if needed.

.. zephyr-keep-sorted-stop

Modules
*******

.. zephyr-keep-sorted-start re(^\w)

CMSIS
=====

* Cortex-M boards/socs now require the ``CMSIS_6`` module to build properly (instead of ``cmsis``
  which was CMSIS 5.9.0).
  If trying to build a Cortex-M board, do a ``west update`` to make sure that ``CMSIS_6`` module is
  available before running ``west build`` or other commands.

  Boards or SOCs or modules using the older ``cmsis`` module either with a local copy or via the
  :kconfig:option:`CONFIG_ZEPHYR_CMSIS_MODULE_DIR` are requested to move to the ``CMSIS_6`` module
  which can be accessed via the :kconfig:option:`CONFIG_ZEPHYR_CMSIS_6_MODULE_DIR` configuration.

  Note: Zephyr will continue using the older ``cmsis`` module for Cortex-A and Cortex-R targets.

.. zephyr-keep-sorted-stop

Architectures
*************

* Moved :kconfig:option:`CONFIG_SRAM_VECTOR_TABLE` from ``zephyr/Kconfig.zephyr`` to
  ``zephyr/arch/Kconfig`` and added dependency to :kconfig:option:`CONFIG_XIP`,
  :kconfig:option:`CONFIG_ARCH_HAS_VECTOR_TABLE_RELOCATION` and
  :kconfig:option:`CONFIG_ROMSTART_RELOCATION_ROM` to support relocation
  of vector table in RAM.
* Renamed :kconfig:option:`CONFIG_DEBUG_INFO` to :kconfig:option:`CONFIG_X86_DEBUG_INFO` to
  better reflect its purpose. This option is now only available for x86 architecture.
