You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2022/10/17 06:59:53 UTC

[incubator-nuttx] branch master updated (0dfd1f004d -> dca5a3483f)

This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


    from 0dfd1f004d esp32-devkitc: Add board support to Rotary Encoder
     new d1d46335df Replace nxsem API when used as a lock with nxmutex API
     new dee38ce3e8 arch: Replace critical section with nxmutex in i2c/spi/1wire initialization
     new dca5a3483f drivers: Destroy mutex and sem in the error path

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 arch/arm/src/am335x/am335x_i2c.c                   | 135 ++--------
 arch/arm/src/am335x/am335x_lcdc.c                  |   3 -
 arch/arm/src/cxd56xx/cxd56_adc.c                   |  34 ++-
 arch/arm/src/cxd56xx/cxd56_charger.c               |  10 +-
 arch/arm/src/cxd56xx/cxd56_clock.c                 |  55 ++--
 arch/arm/src/cxd56xx/cxd56_dmac.c                  |  17 +-
 arch/arm/src/cxd56xx/cxd56_emmc.c                  |  38 +--
 arch/arm/src/cxd56xx/cxd56_farapi.c                |  17 +-
 arch/arm/src/cxd56xx/cxd56_gauge.c                 |  10 +-
 arch/arm/src/cxd56xx/cxd56_ge2d.c                  |  37 +--
 arch/arm/src/cxd56xx/cxd56_geofence.c              |  13 +-
 arch/arm/src/cxd56xx/cxd56_gnss.c                  |  32 +--
 arch/arm/src/cxd56xx/cxd56_hostif.c                |  17 +-
 arch/arm/src/cxd56xx/cxd56_i2c.c                   |  76 ++----
 arch/arm/src/cxd56xx/cxd56_icc.c                   |  26 +-
 arch/arm/src/cxd56xx/cxd56_powermgr.c              |  48 ++--
 arch/arm/src/cxd56xx/cxd56_scu.c                   |  47 ++--
 arch/arm/src/cxd56xx/cxd56_sdhci.c                 |  30 +--
 arch/arm/src/cxd56xx/cxd56_sph.c                   |  17 +-
 arch/arm/src/cxd56xx/cxd56_spi.c                   |  14 +-
 arch/arm/src/cxd56xx/cxd56_sysctl.c                |  31 +--
 arch/arm/src/cxd56xx/cxd56_uart0.c                 |  38 +--
 arch/arm/src/cxd56xx/cxd56_udmac.c                 |  11 +-
 arch/arm/src/efm32/efm32_dma.c                     |   9 +-
 arch/arm/src/efm32/efm32_i2c.c                     | 125 ++-------
 arch/arm/src/efm32/efm32_spi.c                     |  11 +-
 arch/arm/src/efm32/efm32_usbhost.c                 |  70 ++----
 arch/arm/src/gd32f4/gd32f4xx_dma.c                 |  31 +--
 arch/arm/src/gd32f4/gd32f4xx_fmc.c                 |  45 +---
 arch/arm/src/gd32f4/gd32f4xx_progmem.c             |  48 +---
 arch/arm/src/gd32f4/gd32f4xx_spi.c                 |  11 +-
 arch/arm/src/imx1/imx_spi.c                        |   9 +-
 arch/arm/src/imx6/imx_ecspi.c                      |   9 +-
 arch/arm/src/imxrt/imxrt_edma.c                    |  32 +--
 arch/arm/src/imxrt/imxrt_ehci.c                    | 163 ++++--------
 arch/arm/src/imxrt/imxrt_enc.c                     |  55 +---
 arch/arm/src/imxrt/imxrt_flexspi.c                 |  12 +-
 arch/arm/src/imxrt/imxrt_lpi2c.c                   | 145 +++--------
 arch/arm/src/imxrt/imxrt_lpspi.c                   |  12 +-
 arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c           |  18 +-
 arch/arm/src/imxrt/imxrt_usdhc.c                   |  27 +-
 arch/arm/src/kinetis/kinetis_edma.c                |  32 +--
 arch/arm/src/kinetis/kinetis_i2c.c                 | 139 ++--------
 arch/arm/src/kinetis/kinetis_sdhc.c                |  27 +-
 arch/arm/src/kinetis/kinetis_spi.c                 |  12 +-
 arch/arm/src/kinetis/kinetis_usbhshost.c           | 165 ++++--------
 arch/arm/src/kl/kl_spi.c                           |  12 +-
 arch/arm/src/lc823450/lc823450_adc.c               |  56 +----
 arch/arm/src/lc823450/lc823450_dma.c               |   5 +-
 arch/arm/src/lc823450/lc823450_i2c.c               |  77 ++----
 arch/arm/src/lc823450/lc823450_i2s.c               |  21 +-
 arch/arm/src/lc823450/lc823450_mtd.c               |  82 +++---
 arch/arm/src/lc823450/lc823450_sdc.c               |  85 +++----
 arch/arm/src/lc823450/lc823450_sddrv_dep.c         |  13 +-
 arch/arm/src/lc823450/lc823450_spi.c               |  10 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c         |  10 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c           |  13 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c        |  27 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c           |  12 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c           |  12 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c       | 124 +++------
 arch/arm/src/lpc2378/lpc23xx_i2c.c                 |  13 +-
 arch/arm/src/lpc2378/lpc23xx_spi.c                 |  12 +-
 arch/arm/src/lpc31xx/lpc31_ehci.c                  | 162 ++++--------
 arch/arm/src/lpc31xx/lpc31_i2c.c                   |  11 +-
 arch/arm/src/lpc31xx/lpc31_spi.c                   |  12 +-
 arch/arm/src/lpc43xx/lpc43_ehci.c                  | 163 ++++--------
 arch/arm/src/lpc43xx/lpc43_gpdma.c                 |   9 +-
 arch/arm/src/lpc43xx/lpc43_i2c.c                   |  11 +-
 arch/arm/src/lpc43xx/lpc43_sdmmc.c                 |  27 +-
 arch/arm/src/lpc43xx/lpc43_spi.c                   |  12 +-
 arch/arm/src/lpc43xx/lpc43_ssp.c                   |  12 +-
 arch/arm/src/lpc54xx/lpc54_dma.c                   |  13 +-
 arch/arm/src/lpc54xx/lpc54_i2c_master.c            |  11 +-
 arch/arm/src/lpc54xx/lpc54_rng.c                   |  12 +-
 arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c         |  19 +-
 arch/arm/src/lpc54xx/lpc54_sdmmc.c                 |  27 +-
 arch/arm/src/lpc54xx/lpc54_spi_master.c            |  12 +-
 arch/arm/src/lpc54xx/lpc54_usb0_ohci.c             | 127 +++-------
 .../arm/src/max326xx/common/max326_rtc_lowerhalf.c |  22 +-
 arch/arm/src/max326xx/max32660/max32660_spim.c     |  12 +-
 arch/arm/src/nrf52/nrf52_i2c.c                     |  92 ++-----
 arch/arm/src/nrf52/nrf52_radio.c                   |  14 +-
 arch/arm/src/nrf52/nrf52_radio.h                   |   3 +-
 arch/arm/src/nrf52/nrf52_rng.c                     |  11 +-
 arch/arm/src/nrf52/nrf52_sdc.c                     |  18 +-
 arch/arm/src/nrf52/nrf52_spi.c                     |  12 +-
 arch/arm/src/rp2040/rp2040_cyw43439.c              |  12 +-
 arch/arm/src/rp2040/rp2040_dmac.c                  |  11 +-
 arch/arm/src/rp2040/rp2040_flash_mtd.c             |  42 ++--
 arch/arm/src/rp2040/rp2040_i2c.c                   |  74 ++----
 arch/arm/src/rp2040/rp2040_i2c_slave.c             |   2 +-
 arch/arm/src/rp2040/rp2040_i2s.c                   |  63 +----
 arch/arm/src/rp2040/rp2040_spi.c                   |  14 +-
 arch/arm/src/rp2040/rp2040_ws2812.c                |  28 +--
 arch/arm/src/rtl8720c/amebaz_driver.c              |  10 +-
 arch/arm/src/rtl8720c/amebaz_driver.h              |   4 +-
 arch/arm/src/s32k1xx/s32k1xx_edma.c                |  32 +--
 arch/arm/src/s32k1xx/s32k1xx_lpi2c.c               | 119 ++-------
 arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c         |   2 +-
 arch/arm/src/s32k1xx/s32k1xx_lpspi.c               |  12 +-
 arch/arm/src/s32k3xx/s32k3xx_edma.c                |  32 +--
 arch/arm/src/s32k3xx/s32k3xx_lpi2c.c               | 117 ++-------
 arch/arm/src/s32k3xx/s32k3xx_lpspi.c               |  12 +-
 arch/arm/src/s32k3xx/s32k3xx_qspi.c                |  12 +-
 arch/arm/src/sam34/sam4cm_tc.c                     |  37 +--
 arch/arm/src/sam34/sam_aes.c                       |  24 +-
 arch/arm/src/sam34/sam_dmac.c                      |  61 +----
 arch/arm/src/sam34/sam_hsmci.c                     |  28 +--
 arch/arm/src/sam34/sam_spi.c                       |  12 +-
 arch/arm/src/sam34/sam_twi.c                       |  42 +---
 arch/arm/src/sama5/sam_adc.c                       |  10 +-
 arch/arm/src/sama5/sam_can.c                       |  90 ++-----
 arch/arm/src/sama5/sam_dmac.c                      |  38 +--
 arch/arm/src/sama5/sam_ehci.c                      | 157 ++++--------
 arch/arm/src/sama5/sam_hsmci.c                     |  28 +--
 arch/arm/src/sama5/sam_nand.c                      |   6 +-
 arch/arm/src/sama5/sam_nand.h                      |   4 +-
 arch/arm/src/sama5/sam_ohci.c                      | 141 ++++-------
 arch/arm/src/sama5/sam_pmecc.c                     |  12 +-
 arch/arm/src/sama5/sam_sdmmc.c                     |  26 +-
 arch/arm/src/sama5/sam_spi.c                       |  12 +-
 arch/arm/src/sama5/sam_ssc.c                       |  79 ++----
 arch/arm/src/sama5/sam_tc.c                        |  45 +---
 arch/arm/src/sama5/sam_trng.c                      |  11 +-
 arch/arm/src/sama5/sam_twi.c                       |  43 +---
 arch/arm/src/sama5/sam_udphs.c                     |   4 +-
 arch/arm/src/sama5/sam_xdmac.c                     |  36 +--
 arch/arm/src/samd2l2/sam_dmac.c                    |  33 +--
 arch/arm/src/samd2l2/sam_i2c_master.c              |  60 +----
 arch/arm/src/samd2l2/sam_spi.c                     |  20 +-
 arch/arm/src/samd5e5/sam_dmac.c                    |  33 +--
 arch/arm/src/samd5e5/sam_i2c_master.c              |  53 +---
 arch/arm/src/samd5e5/sam_progmem.c                 |  46 +---
 arch/arm/src/samd5e5/sam_spi.c                     |  24 +-
 arch/arm/src/samd5e5/sam_tc.c                      |  45 +---
 arch/arm/src/samd5e5/sam_tc.h                      |   3 +-
 arch/arm/src/samd5e5/sam_usb.c                     |  87 ++-----
 arch/arm/src/samv7/sam_hsmci.c                     |  28 +--
 arch/arm/src/samv7/sam_mcan.c                      | 124 +++------
 arch/arm/src/samv7/sam_progmem.c                   |  33 +--
 arch/arm/src/samv7/sam_qspi.c                      |  13 +-
 arch/arm/src/samv7/sam_qspi_spi.c                  |  12 +-
 arch/arm/src/samv7/sam_spi.c                       |  12 +-
 arch/arm/src/samv7/sam_spi_slave.c                 |  86 ++-----
 arch/arm/src/samv7/sam_ssc.c                       |  79 ++----
 arch/arm/src/samv7/sam_tc.c                        |  35 +--
 arch/arm/src/samv7/sam_trng.c                      |  11 +-
 arch/arm/src/samv7/sam_twihs.c                     |  92 +++----
 arch/arm/src/samv7/sam_usbdevhs.c                  |   4 +-
 arch/arm/src/samv7/sam_xdmac.c                     |  34 +--
 arch/arm/src/stm32/stm32_1wire.c                   | 114 ++-------
 arch/arm/src/stm32/stm32_adc.c                     |  44 +---
 arch/arm/src/stm32/stm32_aes.c                     |  13 +-
 arch/arm/src/stm32/stm32_bbsram.c                  |  67 ++---
 arch/arm/src/stm32/stm32_dma2d.c                   |  29 ++-
 arch/arm/src/stm32/stm32_dma_v1.c                  |  22 +-
 arch/arm/src/stm32/stm32_dma_v2.c                  |  22 +-
 arch/arm/src/stm32/stm32_foc.c                     |  15 +-
 arch/arm/src/stm32/stm32_hrtim.c                   |  14 +-
 arch/arm/src/stm32/stm32_hrtim.h                   |   1 -
 arch/arm/src/stm32/stm32_i2c.c                     | 102 ++------
 arch/arm/src/stm32/stm32_i2c_alt.c                 | 100 ++------
 arch/arm/src/stm32/stm32_i2c_v2.c                  | 142 ++++-------
 arch/arm/src/stm32/stm32_i2s.c                     |  79 ++----
 arch/arm/src/stm32/stm32_ltdc.c                    |  48 ++--
 arch/arm/src/stm32/stm32_otgfshost.c               | 107 ++------
 arch/arm/src/stm32/stm32_otghshost.c               | 105 ++------
 arch/arm/src/stm32/stm32_rng.c                     |  11 +-
 arch/arm/src/stm32/stm32_rtc_lowerhalf.c           |  32 +--
 arch/arm/src/stm32/stm32_sdio.c                    |  27 +-
 arch/arm/src/stm32/stm32_spi.c                     |  12 +-
 arch/arm/src/stm32/stm32f10xxf30xx_flash.c         |  38 ++-
 arch/arm/src/stm32/stm32f20xxf40xx_flash.c         |  34 +--
 arch/arm/src/stm32/stm32f40xxx_i2c.c               | 100 ++------
 arch/arm/src/stm32/stm32l15xx_flash.c              |  38 ++-
 arch/arm/src/stm32f0l0g0/stm32_adc.c               |  43 +---
 arch/arm/src/stm32f0l0g0/stm32_aes.c               |  15 +-
 arch/arm/src/stm32f0l0g0/stm32_dma_v1.c            |  24 +-
 arch/arm/src/stm32f0l0g0/stm32_i2c.c               | 156 ++++--------
 arch/arm/src/stm32f0l0g0/stm32_rng.c               |  10 +-
 arch/arm/src/stm32f0l0g0/stm32_spi.c               |  23 +-
 arch/arm/src/stm32f7/stm32_adc.c                   |  39 +--
 arch/arm/src/stm32f7/stm32_bbsram.c                |  67 ++---
 arch/arm/src/stm32f7/stm32_dma.c                   |  22 +-
 arch/arm/src/stm32f7/stm32_dma2d.c                 |  29 ++-
 arch/arm/src/stm32f7/stm32_flash.c                 |  38 +--
 arch/arm/src/stm32f7/stm32_foc.c                   |  15 +-
 arch/arm/src/stm32f7/stm32_i2c.c                   | 143 ++++-------
 arch/arm/src/stm32f7/stm32_ltdc.c                  |  48 ++--
 arch/arm/src/stm32f7/stm32_otghost.c               | 105 ++------
 arch/arm/src/stm32f7/stm32_qspi.c                  |  14 +-
 arch/arm/src/stm32f7/stm32_rng.c                   |  12 +-
 arch/arm/src/stm32f7/stm32_rtc_lowerhalf.c         |  37 ++-
 arch/arm/src/stm32f7/stm32_sai.c                   |  99 ++------
 arch/arm/src/stm32f7/stm32_sdmmc.c                 |  27 +-
 arch/arm/src/stm32f7/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32h7/stm32_bbsram.c                |  67 ++---
 arch/arm/src/stm32h7/stm32_flash.c                 |  69 ++---
 arch/arm/src/stm32h7/stm32_i2c.c                   | 144 ++++-------
 arch/arm/src/stm32h7/stm32_otghost.c               | 105 ++------
 arch/arm/src/stm32h7/stm32_qspi.c                  |  25 +-
 arch/arm/src/stm32h7/stm32_rtc_lowerhalf.c         |  37 ++-
 arch/arm/src/stm32h7/stm32_sdmmc.c                 |  27 +-
 arch/arm/src/stm32h7/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32h7/stm32_spi_slave.c             |  34 +--
 arch/arm/src/stm32l4/stm32l4_1wire.c               | 124 ++-------
 arch/arm/src/stm32l4/stm32l4_flash.c               |  34 +--
 arch/arm/src/stm32l4/stm32l4_i2c.c                 | 142 ++++-------
 arch/arm/src/stm32l4/stm32l4_otgfshost.c           | 105 ++------
 arch/arm/src/stm32l4/stm32l4_qspi.c                |  14 +-
 arch/arm/src/stm32l4/stm32l4_rng.c                 |  11 +-
 arch/arm/src/stm32l4/stm32l4_rtc_lowerhalf.c       |  37 ++-
 arch/arm/src/stm32l4/stm32l4_sai.c                 |  75 ++----
 arch/arm/src/stm32l4/stm32l4_sdmmc.c               |  27 +-
 arch/arm/src/stm32l4/stm32l4_spi.c                 |  21 +-
 arch/arm/src/stm32l4/stm32l4x6xx_dma.c             |  22 +-
 arch/arm/src/stm32l5/stm32l5_flash.c               |  47 +---
 arch/arm/src/stm32l5/stm32l5_spi.c                 |  33 +--
 arch/arm/src/stm32u5/stm32_flash.c                 |  47 +---
 arch/arm/src/stm32u5/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32wb/stm32wb_blehci.c              |   7 +-
 arch/arm/src/stm32wb/stm32wb_flash.c               |  34 +--
 arch/arm/src/stm32wb/stm32wb_rtc_lowerhalf.c       |  37 ++-
 arch/arm/src/stm32wb/stm32wb_spi.c                 |  21 +-
 arch/arm/src/stm32wl5/stm32wl5_flash.c             |  34 +--
 arch/arm/src/stm32wl5/stm32wl5_spi.c               |  12 +-
 arch/arm/src/tiva/common/tiva_adclow.c             |  12 +-
 arch/arm/src/tiva/common/tiva_can.c                |  33 ++-
 arch/arm/src/tiva/common/tiva_i2c.c                | 166 ++++++------
 arch/arm/src/tiva/common/tiva_ssi.c                |  39 +--
 arch/arm/src/tlsr82/tlsr82_adc.c                   |   8 +-
 arch/arm/src/tlsr82/tlsr82_aes.c                   |   8 +-
 arch/arm/src/tlsr82/tlsr82_serial.c                |   4 +-
 arch/arm/src/xmc4/xmc4_spi.c                       |  12 +-
 arch/arm64/src/qemu/qemu_serial.c                  |   4 -
 arch/avr/src/avr/up_spi.c                          |  12 +-
 arch/mips/src/pic32mx/pic32mx_spi.c                |  12 +-
 arch/mips/src/pic32mz/pic32mz_dma.c                |  40 +--
 arch/mips/src/pic32mz/pic32mz_i2c.c                | 115 +++------
 arch/mips/src/pic32mz/pic32mz_spi.c                |  12 +-
 arch/renesas/src/rx65n/rx65n_dtc.c                 |   3 -
 arch/renesas/src/rx65n/rx65n_riic.c                |  56 ++---
 arch/renesas/src/rx65n/rx65n_rspi.c                |  10 +-
 arch/renesas/src/rx65n/rx65n_rspi_sw.c             |  10 +-
 arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c       |  22 +-
 arch/renesas/src/rx65n/rx65n_sbram.c               |  77 ++----
 arch/renesas/src/rx65n/rx65n_usbdev.c              |   2 -
 arch/renesas/src/rx65n/rx65n_usbhost.c             | 144 +++++------
 arch/risc-v/src/bl602/bl602_i2c.c                  |  65 ++---
 arch/risc-v/src/bl602/bl602_netdev.c               |  21 +-
 arch/risc-v/src/bl602/bl602_os_hal.c               |  35 +--
 arch/risc-v/src/bl602/bl602_rtc_lowerhalf.c        |  10 +-
 arch/risc-v/src/bl602/bl602_spi.c                  |  49 ++--
 arch/risc-v/src/esp32c3/esp32c3_adc.c              |  16 +-
 arch/risc-v/src/esp32c3/esp32c3_aes.c              |  20 +-
 arch/risc-v/src/esp32c3/esp32c3_bignum.c           |   8 +-
 arch/risc-v/src/esp32c3/esp32c3_dma.c              |  13 +-
 arch/risc-v/src/esp32c3/esp32c3_i2c.c              | 120 ++-------
 arch/risc-v/src/esp32c3/esp32c3_rng.c              |  15 +-
 arch/risc-v/src/esp32c3/esp32c3_sha.c              |  12 +-
 arch/risc-v/src/esp32c3/esp32c3_spi.c              |  57 ++---
 arch/risc-v/src/esp32c3/esp32c3_spiflash_mtd.c     |  50 ++--
 arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c     |   8 +-
 arch/risc-v/src/mpfs/mpfs_emmcsd.c                 |  27 +-
 arch/risc-v/src/mpfs/mpfs_i2c.c                    | 118 ++-------
 arch/risc-v/src/mpfs/mpfs_spi.c                    |  60 ++---
 arch/x86_64/src/intel64/intel64_rng.c              |   4 -
 arch/xtensa/src/common/xtensa_hostfs.c             |   2 +-
 arch/xtensa/src/esp32/esp32_aes.c                  |  20 +-
 arch/xtensa/src/esp32/esp32_himem.c                |  22 +-
 arch/xtensa/src/esp32/esp32_i2c.c                  | 124 ++-------
 arch/xtensa/src/esp32/esp32_rng.c                  |  15 +-
 arch/xtensa/src/esp32/esp32_spi.c                  |  67 ++---
 arch/xtensa/src/esp32/esp32_spiflash.c             |  35 ++-
 arch/xtensa/src/esp32/esp32_wifi_adapter.c         |   8 +-
 arch/xtensa/src/esp32s2/esp32s2_i2c.c              | 130 ++--------
 arch/xtensa/src/esp32s2/esp32s2_rng.c              |  15 +-
 arch/xtensa/src/esp32s2/esp32s2_spi.c              |  40 +--
 arch/xtensa/src/esp32s3/esp32s3_dma.c              |  13 +-
 arch/xtensa/src/esp32s3/esp32s3_i2c.c              | 139 ++--------
 arch/xtensa/src/esp32s3/esp32s3_spi.c              |  63 ++---
 arch/xtensa/src/esp32s3/esp32s3_spiflash_mtd.c     |  50 ++--
 arch/z16/src/z16f/z16f_espi.c                      |  10 +-
 arch/z80/src/ez80/ez80_i2c.c                       |  33 +--
 arch/z80/src/ez80/ez80_rtc_lowerhalf.c             |  15 +-
 arch/z80/src/ez80/ez80_spi.c                       |  10 +-
 arch/z80/src/z8/z8_i2c.c                           |  14 +-
 audio/audio.c                                      |  23 +-
 boards/arm/cxd56xx/common/src/cxd56_imageproc.c    |  65 ++---
 boards/arm/cxd56xx/spresense/src/cxd56_power.c     |  14 +-
 .../arm/imxrt/imxrt1064-evk/scripts/user-space.ld  |   2 -
 boards/arm/imxrt/teensy-4.x/scripts/user-space.ld  |   2 -
 .../arm/lpc214x/mcu123-lpc214x/src/lpc2148_spi1.c  |   8 +-
 boards/arm/lpc214x/zp214xpa/src/lpc2148_spi1.c     |   8 +-
 .../stm32/mikroe-stm32f4/src/stm32_touchscreen.c   |  37 +--
 boards/arm/str71x/olimex-strp711/src/str71_spi.c   |  12 +-
 .../pic32mx/pic32mx7mmb/src/pic32_touchscreen.c    |  39 +--
 crypto/random_pool.c                               |  28 +--
 drivers/1wire/1wire.c                              |   9 +-
 drivers/1wire/ds28e17.c                            |  42 +---
 drivers/analog/adc.c                               |  16 +-
 drivers/analog/comp.c                              |  30 +--
 drivers/analog/dac.c                               |  14 +-
 drivers/analog/ltc1867l.c                          |  14 +-
 drivers/analog/opamp.c                             |  16 +-
 drivers/audio/cs4344.c                             |  84 ++-----
 drivers/audio/cs4344.h                             |   3 +-
 drivers/audio/cs43l22.c                            |  83 ++----
 drivers/audio/cs43l22.h                            |   2 +-
 drivers/audio/cxd56.c                              |   1 -
 drivers/audio/cxd56.h                              |   1 -
 drivers/audio/cxd56_src.c                          |   1 -
 drivers/audio/tone.c                               |  17 +-
 drivers/audio/vs1053.c                             |  35 ++-
 drivers/audio/wm8776.c                             |  83 +-----
 drivers/audio/wm8776.h                             |   3 +-
 drivers/audio/wm8904.c                             |  83 ++----
 drivers/audio/wm8904.h                             |   3 +-
 drivers/audio/wm8994.c                             |  44 ++--
 drivers/audio/wm8994.h                             |   3 +-
 drivers/bch/Make.defs                              |   2 +-
 drivers/bch/bch.h                                  |   6 +-
 drivers/bch/bchdev_driver.c                        |  30 +--
 drivers/bch/bchlib_sem.c                           |  44 ----
 drivers/bch/bchlib_setup.c                         |   2 +-
 drivers/bch/bchlib_teardown.c                      |   2 +-
 drivers/can/can.c                                  |  53 ++--
 drivers/can/mcp2515.c                              |  72 ++----
 drivers/eeprom/i2c_xx24xx.c                        |  57 ++---
 drivers/eeprom/spi_xx25xx.c                        |  54 ++--
 drivers/efuse/efuse.c                              |  14 +-
 drivers/i2c/i2c_driver.c                           |  29 ++-
 drivers/i2s/i2schar.c                              |  18 +-
 drivers/input/ads7843e.c                           |  51 ++--
 drivers/input/ads7843e.h                           |   3 +-
 drivers/input/cypress_mbr3108.c                    |  34 +--
 drivers/input/ft5x06.c                             |  61 ++---
 drivers/input/keyboard_upper.c                     |  56 ++---
 drivers/input/max11802.c                           |  50 ++--
 drivers/input/max11802.h                           |   3 +-
 drivers/input/mxt.c                                |  59 ++---
 drivers/input/nunchuck.c                           |  53 ++--
 drivers/input/spq10kbd.c                           |  29 +--
 drivers/input/stmpe811.h                           |   3 +-
 drivers/input/stmpe811_adc.c                       |  18 +-
 drivers/input/stmpe811_base.c                      |   3 +-
 drivers/input/stmpe811_gpio.c                      |  26 +-
 drivers/input/stmpe811_tsc.c                       |  36 +--
 drivers/input/touchscreen_upper.c                  |  43 ++--
 drivers/input/tsc2007.c                            |  35 +--
 drivers/ioexpander/mcp23x17.c                      |  57 ++---
 drivers/ioexpander/mcp23x17.h                      |   4 +-
 drivers/ioexpander/pca9538.c                       |  57 ++---
 drivers/ioexpander/pca9538.h                       |  18 +-
 drivers/ioexpander/pca9555.c                       |  57 ++---
 drivers/ioexpander/pca9555.h                       |  18 +-
 drivers/ioexpander/pcf8574.c                       |  53 ++--
 drivers/ioexpander/pcf8574.h                       |   4 +-
 drivers/ioexpander/skeleton.c                      |  59 ++---
 drivers/ioexpander/tca64xx.c                       |  58 ++---
 drivers/ioexpander/tca64xx.h                       |   4 +-
 drivers/ipcc/ipcc_close.c                          |   4 +-
 drivers/ipcc/ipcc_open.c                           |   4 +-
 drivers/ipcc/ipcc_poll.c                           |  10 +-
 drivers/ipcc/ipcc_priv.h                           |   3 +-
 drivers/ipcc/ipcc_read.c                           |  12 +-
 drivers/ipcc/ipcc_register.c                       |   5 +-
 drivers/ipcc/ipcc_unlink.c                         |   4 +-
 drivers/ipcc/ipcc_write.c                          |  14 +-
 drivers/lcd/ft80x.c                                |  68 ++---
 drivers/lcd/ft80x.h                                |   3 +-
 drivers/lcd/ht16k33_14seg.c                        |  24 +-
 drivers/lcd/pcf8574_lcd_backpack.c                 |  42 ++--
 drivers/lcd/st7032.c                               |  22 +-
 drivers/lcd/tda19988.c                             |  44 ++--
 drivers/leds/rgbled.c                              |  18 +-
 drivers/leds/userled_upper.c                       |  53 ++--
 drivers/leds/ws2812.c                              |  19 +-
 drivers/loop/losetup.c                             |  25 +-
 drivers/misc/rwbuffer.c                            | 108 +++-----
 drivers/mmcsd/mmcsd_sdio.c                         |  58 ++---
 drivers/mmcsd/mmcsd_spi.c                          |  83 +++---
 drivers/modem/altair/altmdm_sys.c                  |   8 +-
 drivers/modem/altair/altmdm_sys.h                  |   3 +-
 drivers/motor/foc/foc_dev.c                        |  16 +-
 drivers/motor/motor.c                              |  20 +-
 drivers/mtd/mtd_config.c                           |   2 +-
 drivers/mtd/mtd_nand.c                             |  45 +---
 drivers/mtd/rpmsgmtd.c                             |   8 +-
 drivers/net/phy_notify.c                           |  36 +--
 drivers/net/slip.c                                 |  58 +----
 drivers/net/telnet.c                               |  36 +--
 drivers/net/tun.c                                  |  86 ++-----
 drivers/pipes/pipe.c                               |  10 +-
 drivers/pipes/pipe_common.c                        |  81 +++---
 drivers/pipes/pipe_common.h                        |   3 +-
 drivers/power/battery/battery_charger.c            |  43 ++--
 drivers/power/battery/battery_gauge.c              |  43 ++--
 drivers/power/battery/battery_monitor.c            |  43 ++--
 drivers/power/pm/pm.h                              |   4 +-
 drivers/power/pm/pm_initialize.c                   |   4 +-
 drivers/power/pm/pm_register.c                     |   4 +-
 drivers/power/pm/pm_unregister.c                   |   4 +-
 drivers/power/supply/powerled.c                    |  16 +-
 drivers/power/supply/regulator.c                   |  51 ++--
 drivers/power/supply/smps.c                        |  16 +-
 drivers/rc/lirc_dev.c                              |  17 +-
 drivers/sensors/adxl345.h                          |   3 +-
 drivers/sensors/adxl345_base.c                     |  13 +-
 drivers/sensors/adxl372.c                          |  17 +-
 drivers/sensors/aht10.c                            |  87 ++-----
 drivers/sensors/bmg160.c                           |  32 +--
 drivers/sensors/dhtxx.c                            |  17 +-
 drivers/sensors/fakesensor.c                       |   1 +
 drivers/sensors/hall3ph.c                          |  24 +-
 drivers/sensors/hc_sr04.c                          |  26 +-
 drivers/sensors/hdc1008.c                          |  47 ++--
 drivers/sensors/hts221.c                           |  29 ++-
 drivers/sensors/hyt271.c                           |  20 +-
 drivers/sensors/kxtj9.c                            |  19 +-
 drivers/sensors/lis2dh.c                           |  19 +-
 drivers/sensors/lis3dh.c                           |  63 +----
 drivers/sensors/lis3dsh.c                          |  32 +--
 drivers/sensors/lis3mdl.c                          |  36 +--
 drivers/sensors/lps25h.c                           |  25 +-
 drivers/sensors/lsm330_spi.c                       |  38 ++-
 drivers/sensors/max44009.c                         |  30 +--
 drivers/sensors/mlx90393.c                         |  35 +--
 drivers/sensors/mpu60x0.c                          |   2 -
 drivers/sensors/ms5611.c                           |  14 +-
 drivers/sensors/qencoder.c                         |  24 +-
 drivers/sensors/scd30.c                            |  34 +--
 drivers/sensors/scd41.c                            |  34 +--
 drivers/sensors/sensor.c                           |   6 +-
 drivers/sensors/sgp30.c                            |  38 +--
 drivers/sensors/sht21.c                            |  34 +--
 drivers/sensors/sht3x.c                            |  28 ++-
 drivers/sensors/sps30.c                            |  34 +--
 drivers/sensors/t67xx.c                            |  15 +-
 drivers/sensors/usensor.c                          |  22 +-
 drivers/sensors/xen1210.c                          |  12 +-
 drivers/sensors/xen1210.h                          |   3 +-
 drivers/sensors/zerocross.c                        |  28 +--
 drivers/serial/ptmx.c                              |  23 +-
 drivers/serial/pty.c                               |  51 ++--
 drivers/serial/pty.h                               |   2 +-
 drivers/serial/serial.c                            |  94 +++----
 drivers/serial/uart_bth4.c                         |  11 +-
 drivers/serial/uart_rpmsg.c                        |  12 +-
 drivers/spi/spi_bitbang.c                          |   8 +-
 drivers/spi/spi_driver.c                           |  29 ++-
 drivers/spi/spi_slave_driver.c                     |  22 +-
 drivers/syslog/ramlog.c                            |  49 ++--
 drivers/syslog/syslog_device.c                     |  43 ++--
 drivers/timers/capture.c                           |  24 +-
 drivers/timers/oneshot.c                           |  12 +-
 drivers/timers/pwm.c                               |  23 +-
 drivers/timers/rpmsg_rtc.c                         |  20 +-
 drivers/timers/rtc.c                               |  26 +-
 drivers/timers/timer.c                             |  26 +-
 drivers/timers/watchdog.c                          |  26 +-
 drivers/usbdev/adb.c                               |  46 ++--
 drivers/usbdev/usbmsc.c                            |  20 +-
 drivers/usbdev/usbmsc.h                            |  23 +-
 drivers/usbdev/usbmsc_scsi.c                       |  35 +--
 drivers/usbhost/usbhost_cdcacm.c                   |  76 ++----
 drivers/usbhost/usbhost_cdcmbim.c                  |  68 ++---
 drivers/usbhost/usbhost_devaddr.c                  |  30 +--
 drivers/usbhost/usbhost_ft232r.c                   |  76 ++----
 drivers/usbhost/usbhost_hidkbd.c                   | 119 +++------
 drivers/usbhost/usbhost_hidmouse.c                 | 111 +++-----
 drivers/usbhost/usbhost_hub.c                      |  10 -
 drivers/usbhost/usbhost_max3421e.c                 |  88 +++----
 drivers/usbhost/usbhost_skeleton.c                 |  61 +----
 drivers/usbhost/usbhost_storage.c                  |  89 ++-----
 drivers/usbhost/usbhost_xboxcontroller.c           | 120 +++------
 drivers/usbmisc/fusb301.c                          |  22 +-
 drivers/usbmisc/fusb303.c                          |  30 +--
 drivers/usrsock/usrsock_dev.c                      |  54 ++--
 drivers/video/isx012.c                             |  26 +-
 drivers/video/isx019.c                             |  64 ++---
 drivers/video/max7456.c                            |  59 +----
 drivers/video/video.c                              |  77 ++----
 drivers/video/video_framebuff.c                    |  13 +-
 drivers/video/video_framebuff.h                    |   4 +-
 drivers/video/vnc/vnc_updater.c                    |   9 +-
 drivers/wireless/cc1101.c                          |  57 ++---
 drivers/wireless/gs2200m.c                         |  53 ++--
 drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c     |   4 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c  |   4 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c    |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.h    |  26 +-
 .../ieee80211/bcm43xxx/bcmf_gspi_f2_frame.c        |   8 +-
 .../wireless/ieee80211/bcm43xxx/bcmf_interface.c   |  10 +-
 .../wireless/ieee80211/bcm43xxx/bcmf_interface.h   |  23 --
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdio.c    |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdio.h    |  26 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdpcm.c   |  16 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_utils.c   |   9 -
 drivers/wireless/ieee80211/bcm43xxx/bcmf_utils.h   |   4 -
 drivers/wireless/ieee802154/mrf24j40/mrf24j40.c    |  10 +-
 drivers/wireless/ieee802154/mrf24j40/mrf24j40.h    |   4 +-
 .../ieee802154/mrf24j40/mrf24j40_interrupt.c       |   8 +-
 .../wireless/ieee802154/mrf24j40/mrf24j40_radif.c  |   9 +-
 drivers/wireless/ieee802154/xbee/xbee.c            |  25 +-
 drivers/wireless/ieee802154/xbee/xbee.h            |   7 +-
 drivers/wireless/ieee802154/xbee/xbee_mac.c        |   4 +-
 drivers/wireless/ieee802154/xbee/xbee_netdev.c     |  19 +-
 drivers/wireless/lpwan/sx127x/sx127x.c             |  54 ++--
 drivers/wireless/nrf24l01.c                        |  57 +++--
 drivers/wireless/spirit/drivers/spirit_netdev.c    | 157 ++----------
 fs/driver/fs_blockproxy.c                          |  12 +-
 fs/driver/fs_mtdproxy.c                            |  12 +-
 fs/driver/fs_registerblockdriver.c                 |   4 +-
 fs/driver/fs_registerdriver.c                      |   4 +-
 fs/driver/fs_registermtddriver.c                   |   4 +-
 fs/driver/fs_unregisterblockdriver.c               |   4 +-
 fs/driver/fs_unregisterdriver.c                    |   4 +-
 fs/driver/fs_unregistermtddriver.c                 |   4 +-
 fs/fat/fs_fat32.c                                  | 279 ++++++++++-----------
 fs/fat/fs_fat32.h                                  |   9 +-
 fs/fat/fs_fat32attrib.c                            |  16 +-
 fs/fat/fs_fat32util.c                              |  18 --
 fs/hostfs/hostfs.c                                 | 191 ++++++--------
 fs/hostfs/hostfs.h                                 |   8 -
 fs/inode/fs_files.c                                |  58 ++---
 fs/inode/fs_foreachinode.c                         |   8 +-
 fs/inode/fs_inode.c                                |   8 +-
 fs/inode/fs_inodeaddref.c                          |   4 +-
 fs/inode/fs_inodefind.c                            |   4 +-
 fs/inode/fs_inoderelease.c                         |   6 +-
 fs/inode/inode.h                                   |   8 +-
 fs/littlefs/lfs_vfs.c                              | 126 ++++------
 fs/mmap/fs_munmap.c                                |  12 +-
 fs/mmap/fs_rammap.c                                |   6 +-
 fs/mmap/fs_rammap.h                                |   4 +-
 fs/mount/fs_automount.c                            |  42 ++--
 fs/mount/fs_mount.c                                |  12 +-
 fs/mount/fs_umount2.c                              |  14 +-
 fs/mqueue/mq_open.c                                |   4 +-
 fs/mqueue/mq_unlink.c                              |  10 +-
 fs/nfs/nfs_mount.h                                 |   4 +-
 fs/nfs/nfs_vfsops.c                                | 196 +++++++--------
 fs/nxffs/nxffs.h                                   |   3 +-
 fs/nxffs/nxffs_dirent.c                            |  18 +-
 fs/nxffs/nxffs_initialize.c                        |   3 +-
 fs/nxffs/nxffs_ioctl.c                             |  10 +-
 fs/nxffs/nxffs_open.c                              |  52 ++--
 fs/nxffs/nxffs_read.c                              |  14 +-
 fs/nxffs/nxffs_stat.c                              |  18 +-
 fs/nxffs/nxffs_truncate.c                          |  12 +-
 fs/nxffs/nxffs_unlink.c                            |   4 +-
 fs/nxffs/nxffs_write.c                             |  16 +-
 fs/romfs/fs_romfs.c                                | 128 +++++-----
 fs/romfs/fs_romfs.h                                |   4 +-
 fs/romfs/fs_romfsutil.c                            |  18 --
 fs/rpmsgfs/rpmsgfs.c                               | 169 ++++++-------
 fs/rpmsgfs/rpmsgfs_server.c                        |  37 +--
 fs/semaphore/sem_close.c                           |   6 +-
 fs/semaphore/sem_open.c                            |   4 +-
 fs/semaphore/sem_unlink.c                          |  10 +-
 fs/smartfs/smartfs.h                               |   8 +-
 fs/smartfs/smartfs_smart.c                         | 217 ++++++++--------
 fs/smartfs/smartfs_utils.c                         |  18 --
 fs/spiffs/src/spiffs_vfs.c                         |   2 +-
 fs/unionfs/fs_unionfs.c                            |  67 ++---
 fs/userfs/fs_userfs.c                              | 146 +++++------
 fs/vfs/fs_dir.c                                    |   8 +-
 fs/vfs/fs_eventfd.c                                |  47 ++--
 fs/vfs/fs_fdopen.c                                 |   8 +-
 fs/vfs/fs_mkdir.c                                  |   4 +-
 fs/vfs/fs_poll.c                                   |  17 +-
 fs/vfs/fs_rename.c                                 |  10 +-
 fs/vfs/fs_rmdir.c                                  |   4 +-
 fs/vfs/fs_symlink.c                                |   4 +-
 fs/vfs/fs_timerfd.c                                |  45 ++--
 fs/vfs/fs_unlink.c                                 |   4 +-
 graphics/nxterm/Make.defs                          |   4 -
 graphics/nxterm/nxterm.h                           |  14 +-
 graphics/nxterm/nxterm_driver.c                    |  16 +-
 graphics/nxterm/nxterm_kbdin.c                     |  40 +--
 graphics/nxterm/nxterm_redraw.c                    |   4 +-
 graphics/nxterm/nxterm_register.c                  |   2 +-
 graphics/nxterm/nxterm_resize.c                    |   4 +-
 graphics/nxterm/nxterm_sem.c                       |  97 -------
 graphics/nxterm/nxterm_unregister.c                |   4 +-
 include/nuttx/analog/adc.h                         |   3 +-
 include/nuttx/analog/comp.h                        |   3 +-
 include/nuttx/analog/dac.h                         |  17 +-
 include/nuttx/analog/opamp.h                       |   4 +-
 include/nuttx/audio/audio.h                        |   4 +-
 include/nuttx/can/can.h                            |   6 +-
 include/nuttx/drivers/rwbuffer.h                   |   6 +-
 include/nuttx/fs/fs.h                              |   4 +-
 include/nuttx/leds/ws2812.h                        |   4 +-
 include/nuttx/lib/lib.h                            |  12 +-
 include/nuttx/motor/foc/foc.h                      |   5 +-
 include/nuttx/mtd/nand.h                           |   4 +-
 include/nuttx/mutex.h                              | 103 +++++++-
 include/nuttx/nx/nxmu.h                            |  20 --
 include/nuttx/power/battery_charger.h              |   4 +-
 include/nuttx/power/battery_gauge.h                |   4 +-
 include/nuttx/power/battery_monitor.h              |   4 +-
 include/nuttx/power/powerled.h                     |   4 +-
 include/nuttx/power/regulator.h                    |   3 +-
 include/nuttx/power/smps.h                         |   4 +-
 include/nuttx/sched.h                              |   2 +-
 include/nuttx/serial/serial.h                      |   8 +-
 include/nuttx/spi/spi_bitbang.h                    |   4 +-
 include/nuttx/tls.h                                |   2 +-
 include/nuttx/usb/usbhost_devaddr.h                |   4 +-
 include/nuttx/wireless/cc1101.h                    |   5 +-
 include/nuttx/wireless/ieee80211/bcmf_gspi.h       |   3 +-
 libs/libc/audio/lib_buffer.c                       |  44 +---
 libs/libc/locale/lib_gettext.c                     |  15 +-
 libs/libc/pthread/pthread_keycreate.c              |  10 +-
 libs/libc/pthread/pthread_keydelete.c              |   8 +-
 libs/libc/stdio/lib_fclose.c                       |   2 +-
 libs/libc/stdio/lib_ftello.c                       |   4 +-
 libs/libc/stdio/lib_libfflush.c                    |  14 +-
 libs/libc/stdio/lib_libfilesem.c                   |  14 +-
 libs/libc/stdio/lib_libfread.c                     |   6 +-
 libs/libc/stdio/lib_libfwrite.c                    |  12 +-
 libs/libc/stdio/lib_libstream.c                    |  30 +--
 libs/libc/stdio/lib_puts.c                         |   4 +-
 libs/libc/stdio/lib_rdflush.c                      |   6 +-
 libs/libc/stdio/lib_rewind.c                       |   4 +-
 libs/libc/stdio/lib_setvbuf.c                      |  14 +-
 libs/libc/stdio/lib_vfprintf.c                     |   4 +-
 libs/libc/stdio/lib_vfscanf.c                      |   4 +-
 libs/libc/stdlib/lib_atexit.c                      |   8 +-
 libs/libc/stdlib/lib_mktemp.c                      |  14 +-
 libs/libc/time/lib_localtime.c                     |  35 +--
 libs/libc/userfs/lib_userfs.c                      |   8 +-
 libs/libc/wqueue/work_cancel.c                     |   4 +-
 libs/libc/wqueue/work_queue.c                      |   5 +-
 libs/libc/wqueue/work_usrthread.c                  |  13 +-
 libs/libc/wqueue/wqueue.h                          |   5 +-
 libs/libnx/nxfonts/nxfonts_cache.c                 |  98 ++------
 libs/libnx/nxmu/Make.defs                          |   5 +-
 libs/libnx/nxmu/nx_connect.c                       |   9 +-
 libs/libnx/nxmu/nxmu_semtake.c                     |  55 ----
 mm/iob/iob_initialize.c                            |  11 +-
 mm/kasan/kasan.c                                   |   8 +-
 mm/mm_gran/mm_gran.h                               |   4 +-
 mm/mm_gran/mm_grancritical.c                       |   4 +-
 mm/mm_gran/mm_graninit.c                           |   2 +-
 mm/mm_gran/mm_granrelease.c                        |   2 +-
 mm/mm_heap/Make.defs                               |   2 +-
 mm/mm_heap/mm.h                                    |  14 +-
 mm/mm_heap/mm_addfreechunk.c                       |   2 +-
 mm/mm_heap/mm_extend.c                             |   6 +-
 mm/mm_heap/mm_foreach.c                            |   6 +-
 mm/mm_heap/mm_free.c                               |   7 +-
 mm/mm_heap/mm_initialize.c                         |  11 +-
 mm/mm_heap/{mm_sem.c => mm_lock.c}                 |  85 ++-----
 mm/mm_heap/mm_malloc.c                             |   6 +-
 mm/mm_heap/mm_memalign.c                           |   6 +-
 mm/mm_heap/mm_realloc.c                            |  12 +-
 mm/mm_heap/mm_shrinkchunk.c                        |   2 +-
 mm/shm/shm.h                                       |  16 +-
 mm/shm/shm_initialize.c                            |   2 +-
 mm/shm/shmat.c                                     |  10 +-
 mm/shm/shmctl.c                                    |  16 +-
 mm/shm/shmdt.c                                     |   4 +-
 mm/shm/shmget.c                                    |  18 +-
 net/can/can_conn.c                                 |  38 +--
 net/icmp/icmp_conn.c                               |  18 +-
 net/icmpv6/icmpv6_conn.c                           |  18 +-
 net/local/local.h                                  |   3 +-
 net/local/local_conn.c                             |   4 +-
 net/local/local_connect.c                          |  19 +-
 net/local/local_sendmsg.c                          |   8 +-
 net/netlink/netlink_conn.c                         |  37 +--
 net/pkt/pkt_conn.c                                 |  35 +--
 net/route/net_cacheroute.c                         |  69 ++---
 net/rpmsg/rpmsg_sockif.c                           |  85 +++----
 net/udp/udp_conn.c                                 |  31 +--
 net/usrsock/usrsock_conn.c                         |  41 +--
 net/usrsock/usrsock_devif.c                        |  13 +-
 net/utils/net_lock.c                               | 129 +---------
 sched/group/group_create.c                         |   4 +-
 sched/pthread/pthread_completejoin.c               |   8 +-
 sched/pthread/pthread_create.c                     |   4 +-
 sched/pthread/pthread_detach.c                     |   4 +-
 sched/pthread/pthread_join.c                       |  12 +-
 sched/pthread/pthread_release.c                    |   4 +-
 sched/task/spawn.h                                 |  21 +-
 sched/task/task_posixspawn.c                       |  14 +-
 sched/task/task_spawn.c                            |  12 +-
 sched/task/task_spawnparms.c                       |  26 +-
 sched/task/task_tls_alloc.c                        |   9 +-
 sched/tls/task_initinfo.c                          |   6 +-
 sched/tls/task_uninitinfo.c                        |   4 +-
 wireless/bluetooth/bt_conn.c                       |   2 +-
 wireless/bluetooth/bt_ioctl.c                      |  17 +-
 wireless/bluetooth/bt_netdev.c                     |   9 -
 wireless/ieee802154/Kconfig                        |   7 -
 wireless/ieee802154/mac802154.c                    |  89 ++++---
 wireless/ieee802154/mac802154.h                    |   2 +-
 wireless/ieee802154/mac802154_assoc.c              |  50 ++--
 wireless/ieee802154/mac802154_data.c               |  22 +-
 wireless/ieee802154/mac802154_device.c             |  80 +++---
 wireless/ieee802154/mac802154_internal.h           |  59 +----
 wireless/ieee802154/mac802154_netdev.c             |  26 +-
 wireless/ieee802154/mac802154_poll.c               |  22 +-
 wireless/ieee802154/mac802154_rxenable.c           |  32 +--
 wireless/ieee802154/mac802154_scan.c               |  27 +-
 wireless/ieee802154/mac802154_start.c              |   7 +-
 wireless/pktradio/pktradio_metadata.c              |  20 +-
 711 files changed, 7903 insertions(+), 15378 deletions(-)
 delete mode 100644 drivers/bch/bchlib_sem.c
 delete mode 100644 graphics/nxterm/nxterm_sem.c
 delete mode 100644 libs/libnx/nxmu/nxmu_semtake.c
 rename mm/mm_heap/{mm_sem.c => mm_lock.c} (60%)


[incubator-nuttx] 03/03: drivers: Destroy mutex and sem in the error path

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit dca5a3483f2e2f8223e6b80ea3872ba5682a20fd
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon Oct 17 00:50:59 2022 +0800

    drivers: Destroy mutex and sem in the error path
    
    also correct the order to ensure the memory free is last step
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 drivers/can/mcp2515.c                           |  2 ++
 drivers/i2c/i2c_driver.c                        |  3 +++
 drivers/i2s/i2schar.c                           |  1 +
 drivers/input/cypress_mbr3108.c                 |  1 +
 drivers/input/stmpe811_base.c                   |  1 +
 drivers/lcd/ft80x.c                             |  1 +
 drivers/lcd/ht16k33_14seg.c                     |  1 +
 drivers/lcd/pcf8574_lcd_backpack.c              |  1 +
 drivers/lcd/st7032.c                            |  1 +
 drivers/leds/ws2812.c                           |  1 +
 drivers/sensors/adxl345_base.c                  |  1 +
 drivers/sensors/aht10.c                         |  2 ++
 drivers/sensors/bmg160.c                        |  4 +++-
 drivers/sensors/dhtxx.c                         |  1 +
 drivers/sensors/hc_sr04.c                       |  1 +
 drivers/sensors/hdc1008.c                       |  1 +
 drivers/sensors/hts221.c                        |  4 +++-
 drivers/sensors/kxtj9.c                         |  1 +
 drivers/sensors/lis3dh.c                        |  2 +-
 drivers/sensors/lis3dsh.c                       |  4 +++-
 drivers/sensors/lis3mdl.c                       |  8 +++++---
 drivers/sensors/lps25h.c                        |  4 +++-
 drivers/sensors/max44009.c                      |  1 +
 drivers/sensors/mlx90393.c                      |  8 +++++---
 drivers/sensors/ms5611.c                        |  3 +++
 drivers/sensors/scd30.c                         |  1 +
 drivers/sensors/scd41.c                         |  1 +
 drivers/sensors/sgp30.c                         |  1 +
 drivers/sensors/sht21.c                         |  1 +
 drivers/sensors/sht3x.c                         |  1 +
 drivers/sensors/sps30.c                         |  1 +
 drivers/sensors/t67xx.c                         |  1 +
 drivers/spi/spi_driver.c                        |  3 +++
 drivers/spi/spi_slave_driver.c                  |  1 +
 drivers/syslog/ramlog.c                         |  4 ++++
 drivers/usbdev/adb.c                            |  1 +
 drivers/video/video.c                           |  1 +
 drivers/wireless/cc1101.c                       |  8 ++++++--
 drivers/wireless/gs2200m.c                      | 13 +++++++------
 drivers/wireless/nrf24l01.c                     | 12 +++++++++---
 drivers/wireless/spirit/drivers/spirit_netdev.c | 20 +++++++++++---------
 fs/nfs/nfs_vfsops.c                             | 18 +++++++++---------
 fs/nxffs/nxffs_initialize.c                     |  1 +
 wireless/ieee802154/mac802154_device.c          |  6 +-----
 wireless/ieee802154/mac802154_netdev.c          |  1 +
 45 files changed, 109 insertions(+), 45 deletions(-)

diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c
index 3821648331..645c9fd1c8 100644
--- a/drivers/can/mcp2515.c
+++ b/drivers/can/mcp2515.c
@@ -2541,6 +2541,8 @@ FAR struct mcp2515_can_s *
   if (canctrl != DEFAULT_CANCTRL_CONFMODE)
     {
       canerr("ERROR: CANCTRL = 0x%02X ! It should be 0x87\n", canctrl);
+      nxmutex_destroy(&priv->lock);
+      kmm_free(priv);
       return NULL;
     }
 
diff --git a/drivers/i2c/i2c_driver.c b/drivers/i2c/i2c_driver.c
index 245558364d..5a7c4c9f3b 100644
--- a/drivers/i2c/i2c_driver.c
+++ b/drivers/i2c/i2c_driver.c
@@ -394,6 +394,9 @@ int i2c_register(FAR struct i2c_master_s *i2c, int bus)
            * device.
            */
 
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+          nxmutex_destroy(&priv->lock);
+#endif
           kmm_free(priv);
           return ret;
         }
diff --git a/drivers/i2s/i2schar.c b/drivers/i2s/i2schar.c
index dbd86e374d..0f0c0a971c 100644
--- a/drivers/i2s/i2schar.c
+++ b/drivers/i2s/i2schar.c
@@ -436,6 +436,7 @@ int i2schar_register(FAR struct i2s_dev_s *i2s, int minor)
            * device.
            */
 
+          nxmutex_destroy(&priv->lock);
           kmm_free(priv);
           return ret;
         }
diff --git a/drivers/input/cypress_mbr3108.c b/drivers/input/cypress_mbr3108.c
index 9f05cf2d1b..2fe4b6b584 100644
--- a/drivers/input/cypress_mbr3108.c
+++ b/drivers/input/cypress_mbr3108.c
@@ -1112,6 +1112,7 @@ int cypress_mbr3108_register(FAR const char *devpath,
   ret = register_driver(devpath, &g_mbr3108_fileops, 0666, priv);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       mbr3108_dbg("Error occurred during the driver registering\n");
       return ret;
diff --git a/drivers/input/stmpe811_base.c b/drivers/input/stmpe811_base.c
index 6618414c4d..0a092ab716 100644
--- a/drivers/input/stmpe811_base.c
+++ b/drivers/input/stmpe811_base.c
@@ -302,6 +302,7 @@ STMPE811_HANDLE stmpe811_instantiate(FAR struct i2c_master_s *dev,
   ret = stmpe811_checkid(priv);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->lock);
 #ifdef CONFIG_STMPE811_MULTIPLE
       g_stmpe811list = priv->flink;
       kmm_free(priv);
diff --git a/drivers/lcd/ft80x.c b/drivers/lcd/ft80x.c
index de957c284a..7f1f37875f 100644
--- a/drivers/lcd/ft80x.c
+++ b/drivers/lcd/ft80x.c
@@ -1580,6 +1580,7 @@ errout_with_interrupts:
 
 errout_with_lock:
   nxmutex_destroy(&priv->lock);
+  kmm_free(priv);
   return ret;
 }
 
diff --git a/drivers/lcd/ht16k33_14seg.c b/drivers/lcd/ht16k33_14seg.c
index 24ad7bcbc7..cf6a407e3b 100644
--- a/drivers/lcd/ht16k33_14seg.c
+++ b/drivers/lcd/ht16k33_14seg.c
@@ -1134,6 +1134,7 @@ int ht16k33_register(int devno, FAR struct i2c_master_s *i2c)
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
     }
 
diff --git a/drivers/lcd/pcf8574_lcd_backpack.c b/drivers/lcd/pcf8574_lcd_backpack.c
index 358995111c..6f697d6600 100644
--- a/drivers/lcd/pcf8574_lcd_backpack.c
+++ b/drivers/lcd/pcf8574_lcd_backpack.c
@@ -1664,6 +1664,7 @@ int pcf8574_lcd_backpack_register(FAR const char *devpath,
   if (ret < 0)
     {
       lcdinfo("Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
     }
 
diff --git a/drivers/lcd/st7032.c b/drivers/lcd/st7032.c
index 5278952006..da513d9b8e 100644
--- a/drivers/lcd/st7032.c
+++ b/drivers/lcd/st7032.c
@@ -1060,6 +1060,7 @@ int st7032_register(FAR const char *devpath, FAR struct i2c_master_s *i2c)
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
     }
 
diff --git a/drivers/leds/ws2812.c b/drivers/leds/ws2812.c
index a73aad728a..22149d7870 100644
--- a/drivers/leds/ws2812.c
+++ b/drivers/leds/ws2812.c
@@ -696,6 +696,7 @@ int ws2812_leds_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       lederr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv->tx_buf);
       kmm_free(priv);
     }
diff --git a/drivers/sensors/adxl345_base.c b/drivers/sensors/adxl345_base.c
index 0ec8c9b922..1a5ea790bb 100644
--- a/drivers/sensors/adxl345_base.c
+++ b/drivers/sensors/adxl345_base.c
@@ -389,6 +389,7 @@ ADXL345_HANDLE adxl345_instantiate(FAR struct i2c_master_s *dev,
   if (ret < 0)
     {
       snerr("ERROR: Wrong Device ID!\n");
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return NULL;
     }
diff --git a/drivers/sensors/aht10.c b/drivers/sensors/aht10.c
index ac0ed3bc01..8b79b3deac 100644
--- a/drivers/sensors/aht10.c
+++ b/drivers/sensors/aht10.c
@@ -606,6 +606,7 @@ int aht10_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       snerr("ERROR: Failed to initialize AHT10: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       return ret;
     }
@@ -616,6 +617,7 @@ int aht10_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/bmg160.c b/drivers/sensors/bmg160.c
index 59af4e863f..2ccc972295 100644
--- a/drivers/sensors/bmg160.c
+++ b/drivers/sensors/bmg160.c
@@ -542,6 +542,8 @@ int bmg160_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to attach interrupt\n");
+      nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
       return ret;
     }
 
@@ -551,8 +553,8 @@ int bmg160_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
-      kmm_free(priv);
       nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
       return ret;
     }
 
diff --git a/drivers/sensors/dhtxx.c b/drivers/sensors/dhtxx.c
index adf087d464..6706e34790 100644
--- a/drivers/sensors/dhtxx.c
+++ b/drivers/sensors/dhtxx.c
@@ -568,6 +568,7 @@ int dhtxx_register(FAR const char *devpath,
   ret = register_driver(devpath, &g_dhtxxfops, 0666, priv);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       snerr("ERROR: Failed to register driver: %d\n", ret);
     }
diff --git a/drivers/sensors/hc_sr04.c b/drivers/sensors/hc_sr04.c
index 86835db10b..45291fa18e 100644
--- a/drivers/sensors/hc_sr04.c
+++ b/drivers/sensors/hc_sr04.c
@@ -422,6 +422,7 @@ int hcsr04_register(FAR const char *devpath,
   ret = register_driver(devpath, &g_hcsr04ops, 0666, priv);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       hcsr04_dbg("Error occurred during the driver registering = %d\n", ret);
       return ret;
diff --git a/drivers/sensors/hdc1008.c b/drivers/sensors/hdc1008.c
index 0a995cb09a..b6a78277dc 100644
--- a/drivers/sensors/hdc1008.c
+++ b/drivers/sensors/hdc1008.c
@@ -969,6 +969,7 @@ int hdc1008_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
       snerr("ERROR: Failed to register driver: %d\n", ret);
       nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
+      return ret;
     }
 
   sninfo("driver registered\n");
diff --git a/drivers/sensors/hts221.c b/drivers/sensors/hts221.c
index 6e6ca68d34..71f0c16634 100644
--- a/drivers/sensors/hts221.c
+++ b/drivers/sensors/hts221.c
@@ -1176,9 +1176,10 @@ int hts221_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   ret = hts221_load_calibration_data(priv);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       hts221_dbg("Cannot calibrate hts221 sensor\n");
-      return -EAGAIN;
+      return ret;
     }
 
   ret = register_driver(devpath, &g_humidityops, 0666, priv);
@@ -1187,6 +1188,7 @@ int hts221_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
 
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
       hts221_dbg("Error occurred during the driver registering\n");
       return ret;
diff --git a/drivers/sensors/kxtj9.c b/drivers/sensors/kxtj9.c
index 0f8e130295..2bdc5ec0a5 100644
--- a/drivers/sensors/kxtj9.c
+++ b/drivers/sensors/kxtj9.c
@@ -636,6 +636,7 @@ int kxtj9_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return ret;
     }
diff --git a/drivers/sensors/lis3dh.c b/drivers/sensors/lis3dh.c
index c7bf2641cb..25ba08d336 100644
--- a/drivers/sensors/lis3dh.c
+++ b/drivers/sensors/lis3dh.c
@@ -984,9 +984,9 @@ int lis3dh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
-      kmm_free(priv);
       nxmutex_destroy(&priv->queuelock);
       nxsem_destroy(&priv->readsem);
+      kmm_free(priv);
       return ret;
     }
 
diff --git a/drivers/sensors/lis3dsh.c b/drivers/sensors/lis3dsh.c
index 6c0dbe1d0d..5ce9371f3f 100644
--- a/drivers/sensors/lis3dsh.c
+++ b/drivers/sensors/lis3dsh.c
@@ -552,8 +552,8 @@ int lis3dsh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
-      kmm_free(priv);
       nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
       return ret;
     }
 
@@ -571,6 +571,8 @@ int lis3dsh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to attach interrupt: %d\n", ret);
+      nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
       return ret;
     }
 
diff --git a/drivers/sensors/lis3mdl.c b/drivers/sensors/lis3mdl.c
index 2acaa4c99e..f4319b914d 100644
--- a/drivers/sensors/lis3mdl.c
+++ b/drivers/sensors/lis3mdl.c
@@ -598,7 +598,9 @@ int lis3mdl_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to attach interrupt\n");
-      return -ENODEV;
+      nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
+      return ret;
     }
 
   /* Register the character driver */
@@ -607,9 +609,9 @@ int lis3mdl_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
-      kmm_free(priv);
       nxmutex_destroy(&priv->datalock);
-      return -ENODEV;
+      kmm_free(priv);
+      return ret;
     }
 
   /* Since we support multiple LIS3MDL devices are supported, we will need to
diff --git a/drivers/sensors/lps25h.c b/drivers/sensors/lps25h.c
index 1cabb33f87..164d474cd2 100644
--- a/drivers/sensors/lps25h.c
+++ b/drivers/sensors/lps25h.c
@@ -768,9 +768,11 @@ int lps25h_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
 
   if (ret < 0)
     {
+      nxmutex_destroy(&dev->devlock);
+      nxsem_destroy(&dev->waitsem);
       kmm_free(dev);
       lps25h_dbg("Error occurred during the driver registering\n");
-      return ERROR;
+      return ret;
     }
 
   dev->config->irq_attach(config, lps25h_int_handler, dev);
diff --git a/drivers/sensors/max44009.c b/drivers/sensors/max44009.c
index 194216dfac..fcbe397b9d 100644
--- a/drivers/sensors/max44009.c
+++ b/drivers/sensors/max44009.c
@@ -896,6 +896,7 @@ int max44009_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   max44009_dbg("Registered with %d\n", ret);
   if (ret < 0)
     {
+      nxmutex_destroy(&priv->dev_lock);
       kmm_free(priv);
       max44009_dbg("Error occurred during the driver registering\n");
       return ret;
diff --git a/drivers/sensors/mlx90393.c b/drivers/sensors/mlx90393.c
index 6742ef8f73..8ac2425247 100644
--- a/drivers/sensors/mlx90393.c
+++ b/drivers/sensors/mlx90393.c
@@ -576,7 +576,9 @@ int mlx90393_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to attach interrupt\n");
-      return -ENODEV;
+      nxmutex_destroy(&priv->datalock);
+      kmm_free(priv);
+      return ret;
     }
 
   /* Register the character driver */
@@ -585,9 +587,9 @@ int mlx90393_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
-      kmm_free(priv);
       nxmutex_destroy(&priv->datalock);
-      return -ENODEV;
+      kmm_free(priv);
+      return ret;
     }
 
   /* Since we support multiple MLX90393 devices are supported, we will need
diff --git a/drivers/sensors/ms5611.c b/drivers/sensors/ms5611.c
index fad5e68170..3c03b0d6b5 100644
--- a/drivers/sensors/ms5611.c
+++ b/drivers/sensors/ms5611.c
@@ -667,6 +667,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
   if (ret < 0)
     {
       snerr("Failed to initialize physical device ms5611:%d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return ret;
     }
@@ -677,6 +678,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
   if (ret < 0)
     {
       snerr("Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return ret;
     }
@@ -693,6 +695,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
     {
       snerr("Failed to create the notification kthread!\n");
       sensor_unregister(&priv->sensor_lower, devno);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return ret;
     }
diff --git a/drivers/sensors/scd30.c b/drivers/sensors/scd30.c
index 146c0048d5..febb52e66e 100644
--- a/drivers/sensors/scd30.c
+++ b/drivers/sensors/scd30.c
@@ -1068,6 +1068,7 @@ int scd30_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       scd30_dbg("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/scd41.c b/drivers/sensors/scd41.c
index 0fd7d1185e..015b8f319b 100644
--- a/drivers/sensors/scd41.c
+++ b/drivers/sensors/scd41.c
@@ -1021,6 +1021,7 @@ int scd41_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c)
   if (ret < 0)
     {
       scd41_dbg("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/sgp30.c b/drivers/sensors/sgp30.c
index a13d4564f4..b013d8228f 100644
--- a/drivers/sensors/sgp30.c
+++ b/drivers/sensors/sgp30.c
@@ -1069,6 +1069,7 @@ int sgp30_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       sgp30_dbg("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/sht21.c b/drivers/sensors/sht21.c
index 025278a174..de59fc2a52 100644
--- a/drivers/sensors/sht21.c
+++ b/drivers/sensors/sht21.c
@@ -670,6 +670,7 @@ int sht21_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/sht3x.c b/drivers/sensors/sht3x.c
index f56d9db315..15d781490f 100644
--- a/drivers/sensors/sht3x.c
+++ b/drivers/sensors/sht3x.c
@@ -687,6 +687,7 @@ int sht3x_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       snerr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/sps30.c b/drivers/sensors/sps30.c
index d9588a9647..ed7e47a3f1 100644
--- a/drivers/sensors/sps30.c
+++ b/drivers/sensors/sps30.c
@@ -1082,6 +1082,7 @@ int sps30_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   if (ret < 0)
     {
       sps30_dbg("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->devlock);
       kmm_free(priv);
     }
 
diff --git a/drivers/sensors/t67xx.c b/drivers/sensors/t67xx.c
index 50395c0112..8d8a5d3d35 100644
--- a/drivers/sensors/t67xx.c
+++ b/drivers/sensors/t67xx.c
@@ -738,6 +738,7 @@ int t67xx_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
   return ret;
 
 errout:
+  nxmutex_destroy(&priv->devlock);
   kmm_free(priv);
   return ret;
 }
diff --git a/drivers/spi/spi_driver.c b/drivers/spi/spi_driver.c
index 46b3fd6d76..767eaec314 100644
--- a/drivers/spi/spi_driver.c
+++ b/drivers/spi/spi_driver.c
@@ -379,6 +379,9 @@ int spi_register(FAR struct spi_dev_s *spi, int bus)
            * device.
            */
 
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+          nxmutex_destroy(&priv->lock);
+#endif
           kmm_free(priv);
           return ret;
         }
diff --git a/drivers/spi/spi_slave_driver.c b/drivers/spi/spi_slave_driver.c
index 7d9501add8..61f0e6c0e9 100644
--- a/drivers/spi/spi_slave_driver.c
+++ b/drivers/spi/spi_slave_driver.c
@@ -618,6 +618,7 @@ int spi_slave_register(FAR struct spi_slave_ctrlr_s *ctrlr, int bus)
   if (ret < 0)
     {
       spierr("ERROR: Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
     }
 
diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c
index 0a5f3083db..4ae4f58185 100644
--- a/drivers/syslog/ramlog.c
+++ b/drivers/syslog/ramlog.c
@@ -806,6 +806,10 @@ int ramlog_register(FAR const char *devpath, FAR char *buffer, size_t buflen)
       ret = register_driver(devpath, &g_ramlogfops, 0666, priv);
       if (ret < 0)
         {
+          nxmutex_destroy(&priv->rl_lock);
+#ifndef CONFIG_RAMLOG_NONBLOCKING
+          nxsem_destroy(&priv->rl_waitsem);
+#endif
           kmm_free(priv);
         }
     }
diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c
index ffe1e3e709..2539cd00fe 100644
--- a/drivers/usbdev/adb.c
+++ b/drivers/usbdev/adb.c
@@ -1481,6 +1481,7 @@ static int usbclass_classobject(int minor,
   return OK;
 
 exit_free_driver:
+  nxmutex_destroy(&alloc->dev.lock);
   kmm_free(alloc);
   return ret;
 }
diff --git a/drivers/video/video.c b/drivers/video/video.c
index 4f4af326b6..f82992c6e4 100644
--- a/drivers/video/video.c
+++ b/drivers/video/video.c
@@ -3077,6 +3077,7 @@ static FAR void *video_register(FAR const char *devpath)
   if (ret < 0)
     {
       verr("Failed to register driver: %d\n", ret);
+      nxmutex_destroy(&priv->lock_open_num);
       kmm_free(priv->devpath);
       kmm_free(priv);
       return NULL;
diff --git a/drivers/wireless/cc1101.c b/drivers/wireless/cc1101.c
index 3c3fd2cc2f..c7731b8fba 100644
--- a/drivers/wireless/cc1101.c
+++ b/drivers/wireless/cc1101.c
@@ -1480,11 +1480,15 @@ int cc1101_register(FAR const char *path, FAR struct cc1101_dev_s *dev)
   dev->fifo_len  = 0;
   nxmutex_init(&dev->devlock);
   nxmutex_init(&dev->lock_rx_buffer);
-  nxsem_init(&(dev->sem_rx), 0, 0);
-  nxsem_init(&(dev->sem_tx), 0, 0);
+  nxsem_init(&dev->sem_rx, 0, 0);
+  nxsem_init(&dev->sem_tx, 0, 0);
 
   if (cc1101_init2(dev) < 0)
     {
+      nxmutex_destroy(&dev->devlock);
+      nxmutex_destroy(&dev->lock_rx_buffer);
+      nxsem_destroy(&dev->sem_rx);
+      nxsem_destroy(&dev->sem_tx);
       kmm_free(dev);
       wlerr("ERROR: Failed to initialize cc1101_init\n");
       return -ENODEV;
diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c
index a7f8ee6315..08bfa1fee6 100644
--- a/drivers/wireless/gs2200m.c
+++ b/drivers/wireless/gs2200m.c
@@ -3491,7 +3491,6 @@ FAR void *gs2200m_register(FAR const char *devpath,
 
   size = sizeof(struct gs2200m_dev_s);
   dev = (FAR struct gs2200m_dev_s *)kmm_malloc(size);
-
   if (!dev)
     {
       wlerr("Failed to allocate instance.\n");
@@ -3506,10 +3505,7 @@ FAR void *gs2200m_register(FAR const char *devpath,
 
   nxmutex_init(&dev->dev_lock);
 
-  dev->pfd   = NULL;
-
   ret = gs2200m_initialize(dev, lower);
-
   if (ret < 0)
     {
       wlerr("Failed to initialize driver: %d\n", ret);
@@ -3517,7 +3513,6 @@ FAR void *gs2200m_register(FAR const char *devpath,
     }
 
   ret = register_driver(devpath, &g_gs2200m_fops, 0666, dev);
-
   if (ret < 0)
     {
       wlerr("Failed to register driver: %d\n", ret);
@@ -3525,10 +3520,16 @@ FAR void *gs2200m_register(FAR const char *devpath,
     }
 
   ret = netdev_register(&dev->net_dev, NET_LL_IEEE80211);
+  if (ret < 0)
+    {
+      unregister_driver(devpath);
+      goto errout;
+    }
 
-  return (FAR void *)dev;
+  return dev;
 
 errout:
+  nxmutex_destroy(&dev->dev_lock);
   kmm_free(dev);
   return NULL;
 }
diff --git a/drivers/wireless/nrf24l01.c b/drivers/wireless/nrf24l01.c
index 72aff94b4d..4d0dab5730 100644
--- a/drivers/wireless/nrf24l01.c
+++ b/drivers/wireless/nrf24l01.c
@@ -1439,10 +1439,14 @@ static int nrf24l01_unregister(FAR struct nrf24l01_dev_s *dev)
   /* Free memory */
 
 #ifdef CONFIG_WL_NRF24L01_RXSUPPORT
+  nxmutex_destroy(&dev->lock_fifo);
+  nxsem_destroy(&dev->sem_rx);
   kmm_free(dev->rx_fifo);
 #endif
-  kmm_free(dev);
 
+  nxmutex_destroy(&dev->devlock);
+  nxsem_destroy(&dev->sem_tx);
+  kmm_free(dev);
   return OK;
 }
 
@@ -1484,14 +1488,16 @@ int nrf24l01_register(FAR struct spi_dev_s *spi,
 #ifdef CONFIG_WL_NRF24L01_RXSUPPORT
   if ((rx_fifo = kmm_malloc(CONFIG_WL_NRF24L01_RXFIFO_LEN)) == NULL)
     {
+      nxmutex_destroy(&dev->devlock);
+      nxsem_destroy(&dev->sem_tx);
       kmm_free(dev);
       return -ENOMEM;
     }
 
-  dev->rx_fifo         = rx_fifo;
+  dev->rx_fifo = rx_fifo;
 
   nxmutex_init(&dev->lock_fifo);
-  nxsem_init(&(dev->sem_rx), 0, 0);
+  nxsem_init(&dev->sem_rx, 0, 0);
   nxsem_set_protocol(&dev->sem_rx, SEM_PRIO_NONE);
 #endif
 
diff --git a/drivers/wireless/spirit/drivers/spirit_netdev.c b/drivers/wireless/spirit/drivers/spirit_netdev.c
index 5671982e39..7b86cc6044 100644
--- a/drivers/wireless/spirit/drivers/spirit_netdev.c
+++ b/drivers/wireless/spirit/drivers/spirit_netdev.c
@@ -2670,7 +2670,7 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi,
   if (ret < 0)
     {
       wlerr("ERROR: spirit_hw_initialize failed: %d\n", ret);
-      goto errout_with_attach;
+      goto errout_with_alloc;
     }
 
 #ifdef CONFIG_NET_6LOWPAN
@@ -2682,22 +2682,22 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi,
   priv->radio.r_dev.d_buf = g_iobuffer.rb_buf;
 #endif
 
-  /* Register the device with the OS so that IOCTLs can be performed. */
+  /* Attach irq */
 
-  ret = netdev_register(dev, NET_LL_PKTRADIO);
+  ret = lower->attach(lower, spirit_interrupt, priv);
   if (ret < 0)
     {
-      wlerr("ERROR: netdev_register failed: %d\n", ret);
-      goto errout_with_attach;
+      wlerr("ERROR: Failed to attach interrupt: %d\n", ret);
+      goto errout_with_alloc;
     }
 
-  /* Attach irq */
+  /* Register the device with the OS so that IOCTLs can be performed. */
 
-  ret = lower->attach(lower, spirit_interrupt, priv);
+  ret = netdev_register(dev, NET_LL_PKTRADIO);
   if (ret < 0)
     {
-      wlerr("ERROR: Failed to attach interrupt: %d\n", ret);
-      goto errout_with_alloc;
+      wlerr("ERROR: netdev_register failed: %d\n", ret);
+      goto errout_with_attach;
     }
 
   /* Enable Radio IRQ */
@@ -2709,6 +2709,8 @@ errout_with_attach:
   lower->attach(lower, NULL, NULL);
 
 errout_with_alloc:
+  nxmutex_destroy(&priv->rxlock);
+  nxmutex_destroy(&priv->txlock);
   kmm_free(priv);
   return ret;
 }
diff --git a/fs/nfs/nfs_vfsops.c b/fs/nfs/nfs_vfsops.c
index 797beb112c..9b4928e865 100644
--- a/fs/nfs/nfs_vfsops.c
+++ b/fs/nfs/nfs_vfsops.c
@@ -2045,20 +2045,20 @@ static int nfs_bind(FAR struct inode *blkdriver, FAR const void *data,
   if (!rpc)
     {
       ferr("ERROR: Failed to allocate rpc structure\n");
-      return -ENOMEM;
+      goto bad;
     }
 
   finfo("Connecting\n");
 
   /* Translate nfsmnt flags -> rpcclnt flags */
 
-  rpc->rc_path        = nmp->nm_path;
-  rpc->rc_name        = &nmp->nm_nam;
-  rpc->rc_sotype      = argp->sotype;
-  rpc->rc_timeo       = nprmt.timeo;
-  rpc->rc_retry       = nprmt.retry;
+  rpc->rc_path   = nmp->nm_path;
+  rpc->rc_name   = &nmp->nm_nam;
+  rpc->rc_sotype = argp->sotype;
+  rpc->rc_timeo  = nprmt.timeo;
+  rpc->rc_retry  = nprmt.retry;
 
-  nmp->nm_rpcclnt     = rpc;
+  nmp->nm_rpcclnt = rpc;
 
   ret = rpcclnt_connect(nmp->nm_rpcclnt);
   if (ret != OK)
@@ -2067,8 +2067,8 @@ static int nfs_bind(FAR struct inode *blkdriver, FAR const void *data,
       goto bad;
     }
 
-  nmp->nm_fhsize      = nmp->nm_rpcclnt->rc_fhsize;
-  nmp->nm_fh          = &nmp->nm_rpcclnt->rc_fh;
+  nmp->nm_fhsize = nmp->nm_rpcclnt->rc_fhsize;
+  nmp->nm_fh     = &nmp->nm_rpcclnt->rc_fh;
 
   /* Get the file system info */
 
diff --git a/fs/nxffs/nxffs_initialize.c b/fs/nxffs/nxffs_initialize.c
index 05b04ae20c..00500fe19c 100644
--- a/fs/nxffs/nxffs_initialize.c
+++ b/fs/nxffs/nxffs_initialize.c
@@ -304,6 +304,7 @@ errout_with_buffer:
 errout_with_cache:
   kmm_free(volume->cache);
 errout_with_volume:
+  nxmutex_destroy(&volume->lock);
 #ifndef CONFIG_NXFFS_PREALLOCATED
   kmm_free(volume);
 #endif
diff --git a/wireless/ieee802154/mac802154_device.c b/wireless/ieee802154/mac802154_device.c
index 04c574dccd..bea73750f7 100644
--- a/wireless/ieee802154/mac802154_device.c
+++ b/wireless/ieee802154/mac802154_device.c
@@ -863,11 +863,7 @@ int mac802154dev_register(MACHANDLE mac, int minor)
   if (ret < 0)
     {
       nerr("ERROR: Failed to bind the MAC callbacks: %d\n", ret);
-
-      /* Free memory and return the error */
-
-      kmm_free(dev);
-      return ret;
+      goto errout_with_priv;
     }
 
   /* Create the character device name */
diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c
index ce3ac93594..ae52cdda30 100644
--- a/wireless/ieee802154/mac802154_netdev.c
+++ b/wireless/ieee802154/mac802154_netdev.c
@@ -1338,6 +1338,7 @@ int mac802154netdev_register(MACHANDLE mac)
   return macnet_ifdown(&priv->md_dev.r_dev);
 
 errout:
+  nxmutex_destroy(&priv->md_lock);
 
   /* Free memory and return the error */
 


[incubator-nuttx] 01/03: Replace nxsem API when used as a lock with nxmutex API

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit d1d46335df6cc1bc63f1cd7e7bffe3735b8c275d
Author: anjiahao <an...@xiaomi.com>
AuthorDate: Tue Sep 6 14:18:45 2022 +0800

    Replace nxsem API when used as a lock with nxmutex API
    
    Signed-off-by: anjiahao <an...@xiaomi.com>
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 arch/arm/src/am335x/am335x_i2c.c                   | 113 ++-------
 arch/arm/src/am335x/am335x_lcdc.c                  |   3 -
 arch/arm/src/cxd56xx/cxd56_adc.c                   |  34 ++-
 arch/arm/src/cxd56xx/cxd56_charger.c               |  10 +-
 arch/arm/src/cxd56xx/cxd56_clock.c                 |  55 ++--
 arch/arm/src/cxd56xx/cxd56_dmac.c                  |  17 +-
 arch/arm/src/cxd56xx/cxd56_emmc.c                  |  38 +--
 arch/arm/src/cxd56xx/cxd56_farapi.c                |  17 +-
 arch/arm/src/cxd56xx/cxd56_gauge.c                 |  10 +-
 arch/arm/src/cxd56xx/cxd56_ge2d.c                  |  37 +--
 arch/arm/src/cxd56xx/cxd56_geofence.c              |  13 +-
 arch/arm/src/cxd56xx/cxd56_gnss.c                  |  32 +--
 arch/arm/src/cxd56xx/cxd56_hostif.c                |  17 +-
 arch/arm/src/cxd56xx/cxd56_i2c.c                   |  59 ++---
 arch/arm/src/cxd56xx/cxd56_icc.c                   |  26 +-
 arch/arm/src/cxd56xx/cxd56_powermgr.c              |  48 ++--
 arch/arm/src/cxd56xx/cxd56_scu.c                   |  47 ++--
 arch/arm/src/cxd56xx/cxd56_sdhci.c                 |  30 +--
 arch/arm/src/cxd56xx/cxd56_sph.c                   |  17 +-
 arch/arm/src/cxd56xx/cxd56_spi.c                   |  14 +-
 arch/arm/src/cxd56xx/cxd56_sysctl.c                |  31 +--
 arch/arm/src/cxd56xx/cxd56_uart0.c                 |  38 +--
 arch/arm/src/cxd56xx/cxd56_udmac.c                 |  11 +-
 arch/arm/src/efm32/efm32_dma.c                     |   9 +-
 arch/arm/src/efm32/efm32_i2c.c                     | 108 ++------
 arch/arm/src/efm32/efm32_spi.c                     |  11 +-
 arch/arm/src/efm32/efm32_usbhost.c                 |  70 ++----
 arch/arm/src/gd32f4/gd32f4xx_dma.c                 |  31 +--
 arch/arm/src/gd32f4/gd32f4xx_fmc.c                 |  45 +---
 arch/arm/src/gd32f4/gd32f4xx_progmem.c             |  48 +---
 arch/arm/src/gd32f4/gd32f4xx_spi.c                 |  11 +-
 arch/arm/src/imx1/imx_spi.c                        |   9 +-
 arch/arm/src/imx6/imx_ecspi.c                      |   9 +-
 arch/arm/src/imxrt/imxrt_edma.c                    |  32 +--
 arch/arm/src/imxrt/imxrt_ehci.c                    | 163 ++++--------
 arch/arm/src/imxrt/imxrt_enc.c                     |  55 +---
 arch/arm/src/imxrt/imxrt_flexspi.c                 |  12 +-
 arch/arm/src/imxrt/imxrt_lpi2c.c                   | 125 ++-------
 arch/arm/src/imxrt/imxrt_lpspi.c                   |  12 +-
 arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c           |  18 +-
 arch/arm/src/imxrt/imxrt_usdhc.c                   |  27 +-
 arch/arm/src/kinetis/kinetis_edma.c                |  32 +--
 arch/arm/src/kinetis/kinetis_i2c.c                 | 121 ++-------
 arch/arm/src/kinetis/kinetis_sdhc.c                |  27 +-
 arch/arm/src/kinetis/kinetis_spi.c                 |  12 +-
 arch/arm/src/kinetis/kinetis_usbhshost.c           | 165 ++++--------
 arch/arm/src/kl/kl_spi.c                           |  12 +-
 arch/arm/src/lc823450/lc823450_adc.c               |  56 +----
 arch/arm/src/lc823450/lc823450_dma.c               |   5 +-
 arch/arm/src/lc823450/lc823450_i2c.c               |  59 +----
 arch/arm/src/lc823450/lc823450_i2s.c               |  21 +-
 arch/arm/src/lc823450/lc823450_mtd.c               |  82 +++---
 arch/arm/src/lc823450/lc823450_sdc.c               |  85 +++----
 arch/arm/src/lc823450/lc823450_sddrv_dep.c         |  13 +-
 arch/arm/src/lc823450/lc823450_spi.c               |  10 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c         |  10 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c           |  13 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c        |  27 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c           |  12 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c           |  12 +-
 arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c       | 124 +++------
 arch/arm/src/lpc2378/lpc23xx_i2c.c                 |  13 +-
 arch/arm/src/lpc2378/lpc23xx_spi.c                 |  12 +-
 arch/arm/src/lpc31xx/lpc31_ehci.c                  | 162 ++++--------
 arch/arm/src/lpc31xx/lpc31_i2c.c                   |  11 +-
 arch/arm/src/lpc31xx/lpc31_spi.c                   |  12 +-
 arch/arm/src/lpc43xx/lpc43_ehci.c                  | 163 ++++--------
 arch/arm/src/lpc43xx/lpc43_gpdma.c                 |   9 +-
 arch/arm/src/lpc43xx/lpc43_i2c.c                   |  11 +-
 arch/arm/src/lpc43xx/lpc43_sdmmc.c                 |  27 +-
 arch/arm/src/lpc43xx/lpc43_spi.c                   |  12 +-
 arch/arm/src/lpc43xx/lpc43_ssp.c                   |  12 +-
 arch/arm/src/lpc54xx/lpc54_dma.c                   |  13 +-
 arch/arm/src/lpc54xx/lpc54_i2c_master.c            |  11 +-
 arch/arm/src/lpc54xx/lpc54_rng.c                   |  12 +-
 arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c         |  19 +-
 arch/arm/src/lpc54xx/lpc54_sdmmc.c                 |  27 +-
 arch/arm/src/lpc54xx/lpc54_spi_master.c            |  12 +-
 arch/arm/src/lpc54xx/lpc54_usb0_ohci.c             | 127 +++-------
 .../arm/src/max326xx/common/max326_rtc_lowerhalf.c |  22 +-
 arch/arm/src/max326xx/max32660/max32660_spim.c     |  12 +-
 arch/arm/src/nrf52/nrf52_i2c.c                     |  77 +-----
 arch/arm/src/nrf52/nrf52_radio.c                   |  14 +-
 arch/arm/src/nrf52/nrf52_radio.h                   |   3 +-
 arch/arm/src/nrf52/nrf52_rng.c                     |  11 +-
 arch/arm/src/nrf52/nrf52_sdc.c                     |  18 +-
 arch/arm/src/nrf52/nrf52_spi.c                     |  12 +-
 arch/arm/src/rp2040/rp2040_cyw43439.c              |  12 +-
 arch/arm/src/rp2040/rp2040_dmac.c                  |  11 +-
 arch/arm/src/rp2040/rp2040_flash_mtd.c             |  42 ++--
 arch/arm/src/rp2040/rp2040_i2c.c                   |  57 ++---
 arch/arm/src/rp2040/rp2040_i2c_slave.c             |   2 +-
 arch/arm/src/rp2040/rp2040_i2s.c                   |  63 +----
 arch/arm/src/rp2040/rp2040_spi.c                   |  14 +-
 arch/arm/src/rp2040/rp2040_ws2812.c                |  28 +--
 arch/arm/src/rtl8720c/amebaz_driver.c              |  10 +-
 arch/arm/src/rtl8720c/amebaz_driver.h              |   4 +-
 arch/arm/src/s32k1xx/s32k1xx_edma.c                |  32 +--
 arch/arm/src/s32k1xx/s32k1xx_lpi2c.c               |  99 ++------
 arch/arm/src/s32k1xx/s32k1xx_lpspi.c               |  12 +-
 arch/arm/src/s32k3xx/s32k3xx_edma.c                |  32 +--
 arch/arm/src/s32k3xx/s32k3xx_lpi2c.c               |  97 ++-----
 arch/arm/src/s32k3xx/s32k3xx_lpspi.c               |  12 +-
 arch/arm/src/s32k3xx/s32k3xx_qspi.c                |  12 +-
 arch/arm/src/sam34/sam4cm_tc.c                     |  37 +--
 arch/arm/src/sam34/sam_aes.c                       |  24 +-
 arch/arm/src/sam34/sam_dmac.c                      |  61 +----
 arch/arm/src/sam34/sam_hsmci.c                     |  28 +--
 arch/arm/src/sam34/sam_spi.c                       |  12 +-
 arch/arm/src/sam34/sam_twi.c                       |  42 +---
 arch/arm/src/sama5/sam_adc.c                       |  10 +-
 arch/arm/src/sama5/sam_can.c                       |  90 ++-----
 arch/arm/src/sama5/sam_dmac.c                      |  38 +--
 arch/arm/src/sama5/sam_ehci.c                      | 157 ++++--------
 arch/arm/src/sama5/sam_hsmci.c                     |  28 +--
 arch/arm/src/sama5/sam_nand.c                      |   6 +-
 arch/arm/src/sama5/sam_nand.h                      |   4 +-
 arch/arm/src/sama5/sam_ohci.c                      | 141 ++++-------
 arch/arm/src/sama5/sam_pmecc.c                     |  12 +-
 arch/arm/src/sama5/sam_sdmmc.c                     |  26 +-
 arch/arm/src/sama5/sam_spi.c                       |  12 +-
 arch/arm/src/sama5/sam_ssc.c                       |  79 ++----
 arch/arm/src/sama5/sam_tc.c                        |  45 +---
 arch/arm/src/sama5/sam_trng.c                      |  11 +-
 arch/arm/src/sama5/sam_twi.c                       |  43 +---
 arch/arm/src/sama5/sam_udphs.c                     |   4 +-
 arch/arm/src/sama5/sam_xdmac.c                     |  36 +--
 arch/arm/src/samd2l2/sam_dmac.c                    |  33 +--
 arch/arm/src/samd2l2/sam_i2c_master.c              |  60 +----
 arch/arm/src/samd2l2/sam_spi.c                     |  20 +-
 arch/arm/src/samd5e5/sam_dmac.c                    |  33 +--
 arch/arm/src/samd5e5/sam_i2c_master.c              |  53 +---
 arch/arm/src/samd5e5/sam_progmem.c                 |  46 +---
 arch/arm/src/samd5e5/sam_spi.c                     |  24 +-
 arch/arm/src/samd5e5/sam_tc.c                      |  45 +---
 arch/arm/src/samd5e5/sam_tc.h                      |   3 +-
 arch/arm/src/samd5e5/sam_usb.c                     |  87 ++-----
 arch/arm/src/samv7/sam_hsmci.c                     |  28 +--
 arch/arm/src/samv7/sam_mcan.c                      | 124 +++------
 arch/arm/src/samv7/sam_progmem.c                   |  33 +--
 arch/arm/src/samv7/sam_qspi.c                      |  13 +-
 arch/arm/src/samv7/sam_qspi_spi.c                  |  12 +-
 arch/arm/src/samv7/sam_spi.c                       |  12 +-
 arch/arm/src/samv7/sam_spi_slave.c                 |  86 ++-----
 arch/arm/src/samv7/sam_ssc.c                       |  79 ++----
 arch/arm/src/samv7/sam_tc.c                        |  35 +--
 arch/arm/src/samv7/sam_trng.c                      |  11 +-
 arch/arm/src/samv7/sam_twihs.c                     |  77 +++---
 arch/arm/src/samv7/sam_usbdevhs.c                  |   4 +-
 arch/arm/src/samv7/sam_xdmac.c                     |  34 +--
 arch/arm/src/stm32/stm32_1wire.c                   | 100 ++------
 arch/arm/src/stm32/stm32_adc.c                     |  44 +---
 arch/arm/src/stm32/stm32_aes.c                     |  13 +-
 arch/arm/src/stm32/stm32_bbsram.c                  |  67 ++---
 arch/arm/src/stm32/stm32_dma2d.c                   |  29 ++-
 arch/arm/src/stm32/stm32_dma_v1.c                  |  22 +-
 arch/arm/src/stm32/stm32_dma_v2.c                  |  22 +-
 arch/arm/src/stm32/stm32_foc.c                     |  15 +-
 arch/arm/src/stm32/stm32_hrtim.c                   |  14 +-
 arch/arm/src/stm32/stm32_hrtim.h                   |   1 -
 arch/arm/src/stm32/stm32_i2c.c                     |  83 ++----
 arch/arm/src/stm32/stm32_i2c_alt.c                 |  83 ++----
 arch/arm/src/stm32/stm32_i2c_v2.c                  |  96 ++-----
 arch/arm/src/stm32/stm32_i2s.c                     |  79 ++----
 arch/arm/src/stm32/stm32_ltdc.c                    |  48 ++--
 arch/arm/src/stm32/stm32_otgfshost.c               | 107 ++------
 arch/arm/src/stm32/stm32_otghshost.c               | 105 ++------
 arch/arm/src/stm32/stm32_rng.c                     |  11 +-
 arch/arm/src/stm32/stm32_rtc_lowerhalf.c           |  32 +--
 arch/arm/src/stm32/stm32_sdio.c                    |  27 +-
 arch/arm/src/stm32/stm32_spi.c                     |  12 +-
 arch/arm/src/stm32/stm32f10xxf30xx_flash.c         |  38 ++-
 arch/arm/src/stm32/stm32f20xxf40xx_flash.c         |  34 +--
 arch/arm/src/stm32/stm32f40xxx_i2c.c               |  81 ++----
 arch/arm/src/stm32/stm32l15xx_flash.c              |  38 ++-
 arch/arm/src/stm32f0l0g0/stm32_adc.c               |  43 +---
 arch/arm/src/stm32f0l0g0/stm32_aes.c               |  15 +-
 arch/arm/src/stm32f0l0g0/stm32_dma_v1.c            |  24 +-
 arch/arm/src/stm32f0l0g0/stm32_i2c.c               | 113 ++-------
 arch/arm/src/stm32f0l0g0/stm32_rng.c               |  10 +-
 arch/arm/src/stm32f0l0g0/stm32_spi.c               |  23 +-
 arch/arm/src/stm32f7/stm32_adc.c                   |  39 +--
 arch/arm/src/stm32f7/stm32_bbsram.c                |  67 ++---
 arch/arm/src/stm32f7/stm32_dma.c                   |  22 +-
 arch/arm/src/stm32f7/stm32_dma2d.c                 |  29 ++-
 arch/arm/src/stm32f7/stm32_flash.c                 |  38 +--
 arch/arm/src/stm32f7/stm32_foc.c                   |  15 +-
 arch/arm/src/stm32f7/stm32_i2c.c                   | 100 ++------
 arch/arm/src/stm32f7/stm32_ltdc.c                  |  48 ++--
 arch/arm/src/stm32f7/stm32_otghost.c               | 105 ++------
 arch/arm/src/stm32f7/stm32_qspi.c                  |  14 +-
 arch/arm/src/stm32f7/stm32_rng.c                   |  12 +-
 arch/arm/src/stm32f7/stm32_rtc_lowerhalf.c         |  37 ++-
 arch/arm/src/stm32f7/stm32_sai.c                   |  99 ++------
 arch/arm/src/stm32f7/stm32_sdmmc.c                 |  27 +-
 arch/arm/src/stm32f7/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32h7/stm32_bbsram.c                |  67 ++---
 arch/arm/src/stm32h7/stm32_flash.c                 |  69 ++---
 arch/arm/src/stm32h7/stm32_i2c.c                   | 100 ++------
 arch/arm/src/stm32h7/stm32_otghost.c               | 105 ++------
 arch/arm/src/stm32h7/stm32_qspi.c                  |  25 +-
 arch/arm/src/stm32h7/stm32_rtc_lowerhalf.c         |  37 ++-
 arch/arm/src/stm32h7/stm32_sdmmc.c                 |  27 +-
 arch/arm/src/stm32h7/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32h7/stm32_spi_slave.c             |  34 +--
 arch/arm/src/stm32l4/stm32l4_1wire.c               |  98 ++------
 arch/arm/src/stm32l4/stm32l4_flash.c               |  34 +--
 arch/arm/src/stm32l4/stm32l4_i2c.c                 |  98 ++------
 arch/arm/src/stm32l4/stm32l4_otgfshost.c           | 105 ++------
 arch/arm/src/stm32l4/stm32l4_qspi.c                |  14 +-
 arch/arm/src/stm32l4/stm32l4_rng.c                 |  11 +-
 arch/arm/src/stm32l4/stm32l4_rtc_lowerhalf.c       |  37 ++-
 arch/arm/src/stm32l4/stm32l4_sai.c                 |  75 ++----
 arch/arm/src/stm32l4/stm32l4_sdmmc.c               |  27 +-
 arch/arm/src/stm32l4/stm32l4_spi.c                 |  21 +-
 arch/arm/src/stm32l4/stm32l4x6xx_dma.c             |  22 +-
 arch/arm/src/stm32l5/stm32l5_flash.c               |  47 +---
 arch/arm/src/stm32l5/stm32l5_spi.c                 |  33 +--
 arch/arm/src/stm32u5/stm32_flash.c                 |  47 +---
 arch/arm/src/stm32u5/stm32_spi.c                   |  21 +-
 arch/arm/src/stm32wb/stm32wb_blehci.c              |   7 +-
 arch/arm/src/stm32wb/stm32wb_flash.c               |  34 +--
 arch/arm/src/stm32wb/stm32wb_rtc_lowerhalf.c       |  37 ++-
 arch/arm/src/stm32wb/stm32wb_spi.c                 |  21 +-
 arch/arm/src/stm32wl5/stm32wl5_flash.c             |  34 +--
 arch/arm/src/stm32wl5/stm32wl5_spi.c               |  12 +-
 arch/arm/src/tiva/common/tiva_adclow.c             |  12 +-
 arch/arm/src/tiva/common/tiva_can.c                |  33 ++-
 arch/arm/src/tiva/common/tiva_i2c.c                | 152 +++++------
 arch/arm/src/tiva/common/tiva_ssi.c                |  39 +--
 arch/arm/src/tlsr82/tlsr82_adc.c                   |   8 +-
 arch/arm/src/tlsr82/tlsr82_aes.c                   |   8 +-
 arch/arm/src/tlsr82/tlsr82_serial.c                |   4 +-
 arch/arm/src/xmc4/xmc4_spi.c                       |  12 +-
 arch/arm64/src/qemu/qemu_serial.c                  |   4 -
 arch/avr/src/avr/up_spi.c                          |  12 +-
 arch/mips/src/pic32mx/pic32mx_spi.c                |  12 +-
 arch/mips/src/pic32mz/pic32mz_dma.c                |  40 +--
 arch/mips/src/pic32mz/pic32mz_i2c.c                |  96 +++----
 arch/mips/src/pic32mz/pic32mz_spi.c                |  12 +-
 arch/renesas/src/rx65n/rx65n_dtc.c                 |   3 -
 arch/renesas/src/rx65n/rx65n_riic.c                |  37 +--
 arch/renesas/src/rx65n/rx65n_rspi.c                |  10 +-
 arch/renesas/src/rx65n/rx65n_rspi_sw.c             |  10 +-
 arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c       |  22 +-
 arch/renesas/src/rx65n/rx65n_sbram.c               |  77 ++----
 arch/renesas/src/rx65n/rx65n_usbdev.c              |   2 -
 arch/renesas/src/rx65n/rx65n_usbhost.c             | 144 +++++------
 arch/risc-v/src/bl602/bl602_i2c.c                  |  44 +---
 arch/risc-v/src/bl602/bl602_netdev.c               |  21 +-
 arch/risc-v/src/bl602/bl602_os_hal.c               |  35 +--
 arch/risc-v/src/bl602/bl602_rtc_lowerhalf.c        |  10 +-
 arch/risc-v/src/bl602/bl602_spi.c                  |  29 +--
 arch/risc-v/src/esp32c3/esp32c3_adc.c              |  16 +-
 arch/risc-v/src/esp32c3/esp32c3_aes.c              |  20 +-
 arch/risc-v/src/esp32c3/esp32c3_bignum.c           |   8 +-
 arch/risc-v/src/esp32c3/esp32c3_dma.c              |  13 +-
 arch/risc-v/src/esp32c3/esp32c3_i2c.c              |  95 +------
 arch/risc-v/src/esp32c3/esp32c3_rng.c              |  15 +-
 arch/risc-v/src/esp32c3/esp32c3_sha.c              |  12 +-
 arch/risc-v/src/esp32c3/esp32c3_spi.c              |  30 +--
 arch/risc-v/src/esp32c3/esp32c3_spiflash_mtd.c     |  50 ++--
 arch/risc-v/src/esp32c3/esp32c3_wifi_adapter.c     |   8 +-
 arch/risc-v/src/mpfs/mpfs_emmcsd.c                 |  27 +-
 arch/risc-v/src/mpfs/mpfs_i2c.c                    |  90 +------
 arch/risc-v/src/mpfs/mpfs_spi.c                    |  38 ++-
 arch/x86_64/src/intel64/intel64_rng.c              |   4 -
 arch/xtensa/src/common/xtensa_hostfs.c             |   2 +-
 arch/xtensa/src/esp32/esp32_aes.c                  |  20 +-
 arch/xtensa/src/esp32/esp32_himem.c                |  22 +-
 arch/xtensa/src/esp32/esp32_i2c.c                  | 124 ++-------
 arch/xtensa/src/esp32/esp32_rng.c                  |  15 +-
 arch/xtensa/src/esp32/esp32_spi.c                  |  67 ++---
 arch/xtensa/src/esp32/esp32_spiflash.c             |  35 ++-
 arch/xtensa/src/esp32/esp32_wifi_adapter.c         |   8 +-
 arch/xtensa/src/esp32s2/esp32s2_i2c.c              | 104 +-------
 arch/xtensa/src/esp32s2/esp32s2_rng.c              |  15 +-
 arch/xtensa/src/esp32s2/esp32s2_spi.c              |  23 +-
 arch/xtensa/src/esp32s3/esp32s3_dma.c              |  13 +-
 arch/xtensa/src/esp32s3/esp32s3_i2c.c              | 139 ++--------
 arch/xtensa/src/esp32s3/esp32s3_spi.c              |  37 +--
 arch/xtensa/src/esp32s3/esp32s3_spiflash_mtd.c     |  50 ++--
 arch/z16/src/z16f/z16f_espi.c                      |  10 +-
 arch/z80/src/ez80/ez80_i2c.c                       |  33 +--
 arch/z80/src/ez80/ez80_rtc_lowerhalf.c             |  15 +-
 arch/z80/src/ez80/ez80_spi.c                       |  10 +-
 arch/z80/src/z8/z8_i2c.c                           |  14 +-
 audio/audio.c                                      |  23 +-
 boards/arm/cxd56xx/common/src/cxd56_imageproc.c    |  65 ++---
 boards/arm/cxd56xx/spresense/src/cxd56_power.c     |  14 +-
 .../arm/imxrt/imxrt1064-evk/scripts/user-space.ld  |   2 -
 boards/arm/imxrt/teensy-4.x/scripts/user-space.ld  |   2 -
 .../arm/lpc214x/mcu123-lpc214x/src/lpc2148_spi1.c  |   8 +-
 boards/arm/lpc214x/zp214xpa/src/lpc2148_spi1.c     |   8 +-
 .../stm32/mikroe-stm32f4/src/stm32_touchscreen.c   |  37 +--
 boards/arm/str71x/olimex-strp711/src/str71_spi.c   |  12 +-
 .../pic32mx/pic32mx7mmb/src/pic32_touchscreen.c    |  39 +--
 crypto/random_pool.c                               |  28 +--
 drivers/1wire/1wire.c                              |   9 +-
 drivers/1wire/ds28e17.c                            |  42 +---
 drivers/analog/adc.c                               |  16 +-
 drivers/analog/comp.c                              |  30 +--
 drivers/analog/dac.c                               |  14 +-
 drivers/analog/ltc1867l.c                          |  14 +-
 drivers/analog/opamp.c                             |  16 +-
 drivers/audio/cs4344.c                             |  84 ++-----
 drivers/audio/cs4344.h                             |   3 +-
 drivers/audio/cs43l22.c                            |  83 ++----
 drivers/audio/cs43l22.h                            |   2 +-
 drivers/audio/cxd56.c                              |   1 -
 drivers/audio/cxd56.h                              |   1 -
 drivers/audio/cxd56_src.c                          |   1 -
 drivers/audio/tone.c                               |  17 +-
 drivers/audio/vs1053.c                             |  35 ++-
 drivers/audio/wm8776.c                             |  83 +-----
 drivers/audio/wm8776.h                             |   3 +-
 drivers/audio/wm8904.c                             |  83 ++----
 drivers/audio/wm8904.h                             |   3 +-
 drivers/audio/wm8994.c                             |  44 ++--
 drivers/audio/wm8994.h                             |   3 +-
 drivers/bch/Make.defs                              |   2 +-
 drivers/bch/bch.h                                  |   6 +-
 drivers/bch/bchdev_driver.c                        |  30 +--
 drivers/bch/bchlib_sem.c                           |  44 ----
 drivers/bch/bchlib_setup.c                         |   2 +-
 drivers/bch/bchlib_teardown.c                      |   2 +-
 drivers/can/can.c                                  |  53 ++--
 drivers/can/mcp2515.c                              |  70 ++----
 drivers/eeprom/i2c_xx24xx.c                        |  57 ++---
 drivers/eeprom/spi_xx25xx.c                        |  54 ++--
 drivers/efuse/efuse.c                              |  14 +-
 drivers/i2c/i2c_driver.c                           |  26 +-
 drivers/i2s/i2schar.c                              |  17 +-
 drivers/input/ads7843e.c                           |  51 ++--
 drivers/input/ads7843e.h                           |   3 +-
 drivers/input/cypress_mbr3108.c                    |  33 ++-
 drivers/input/ft5x06.c                             |  61 ++---
 drivers/input/keyboard_upper.c                     |  56 ++---
 drivers/input/max11802.c                           |  50 ++--
 drivers/input/max11802.h                           |   3 +-
 drivers/input/mxt.c                                |  59 ++---
 drivers/input/nunchuck.c                           |  53 ++--
 drivers/input/spq10kbd.c                           |  29 +--
 drivers/input/stmpe811.h                           |   3 +-
 drivers/input/stmpe811_adc.c                       |  18 +-
 drivers/input/stmpe811_base.c                      |   2 +-
 drivers/input/stmpe811_gpio.c                      |  26 +-
 drivers/input/stmpe811_tsc.c                       |  36 +--
 drivers/input/touchscreen_upper.c                  |  43 ++--
 drivers/input/tsc2007.c                            |  35 +--
 drivers/ioexpander/mcp23x17.c                      |  57 ++---
 drivers/ioexpander/mcp23x17.h                      |   4 +-
 drivers/ioexpander/pca9538.c                       |  57 ++---
 drivers/ioexpander/pca9538.h                       |  18 +-
 drivers/ioexpander/pca9555.c                       |  57 ++---
 drivers/ioexpander/pca9555.h                       |  18 +-
 drivers/ioexpander/pcf8574.c                       |  53 ++--
 drivers/ioexpander/pcf8574.h                       |   4 +-
 drivers/ioexpander/skeleton.c                      |  59 ++---
 drivers/ioexpander/tca64xx.c                       |  58 ++---
 drivers/ioexpander/tca64xx.h                       |   4 +-
 drivers/ipcc/ipcc_close.c                          |   4 +-
 drivers/ipcc/ipcc_open.c                           |   4 +-
 drivers/ipcc/ipcc_poll.c                           |  10 +-
 drivers/ipcc/ipcc_priv.h                           |   3 +-
 drivers/ipcc/ipcc_read.c                           |  12 +-
 drivers/ipcc/ipcc_register.c                       |   5 +-
 drivers/ipcc/ipcc_unlink.c                         |   4 +-
 drivers/ipcc/ipcc_write.c                          |  14 +-
 drivers/lcd/ft80x.c                                |  67 ++---
 drivers/lcd/ft80x.h                                |   3 +-
 drivers/lcd/ht16k33_14seg.c                        |  23 +-
 drivers/lcd/pcf8574_lcd_backpack.c                 |  41 +--
 drivers/lcd/st7032.c                               |  21 +-
 drivers/lcd/tda19988.c                             |  44 ++--
 drivers/leds/rgbled.c                              |  18 +-
 drivers/leds/userled_upper.c                       |  53 ++--
 drivers/leds/ws2812.c                              |  18 +-
 drivers/loop/losetup.c                             |  25 +-
 drivers/misc/rwbuffer.c                            | 108 +++-----
 drivers/mmcsd/mmcsd_sdio.c                         |  58 ++---
 drivers/mmcsd/mmcsd_spi.c                          |  83 +++---
 drivers/modem/altair/altmdm_sys.c                  |   8 +-
 drivers/modem/altair/altmdm_sys.h                  |   3 +-
 drivers/motor/foc/foc_dev.c                        |  16 +-
 drivers/motor/motor.c                              |  20 +-
 drivers/mtd/mtd_config.c                           |   2 +-
 drivers/mtd/mtd_nand.c                             |  45 +---
 drivers/mtd/rpmsgmtd.c                             |   8 +-
 drivers/net/phy_notify.c                           |  36 +--
 drivers/net/slip.c                                 |  58 +----
 drivers/net/telnet.c                               |  36 +--
 drivers/net/tun.c                                  |  86 ++-----
 drivers/pipes/pipe.c                               |  10 +-
 drivers/pipes/pipe_common.c                        |  81 +++---
 drivers/pipes/pipe_common.h                        |   3 +-
 drivers/power/battery/battery_charger.c            |  43 ++--
 drivers/power/battery/battery_gauge.c              |  43 ++--
 drivers/power/battery/battery_monitor.c            |  43 ++--
 drivers/power/pm/pm.h                              |   4 +-
 drivers/power/pm/pm_initialize.c                   |   4 +-
 drivers/power/pm/pm_register.c                     |   4 +-
 drivers/power/pm/pm_unregister.c                   |   4 +-
 drivers/power/supply/powerled.c                    |  16 +-
 drivers/power/supply/regulator.c                   |  51 ++--
 drivers/power/supply/smps.c                        |  16 +-
 drivers/rc/lirc_dev.c                              |  17 +-
 drivers/sensors/adxl345.h                          |   3 +-
 drivers/sensors/adxl345_base.c                     |  12 +-
 drivers/sensors/adxl372.c                          |  17 +-
 drivers/sensors/aht10.c                            |  85 ++-----
 drivers/sensors/bmg160.c                           |  30 +--
 drivers/sensors/dhtxx.c                            |  16 +-
 drivers/sensors/fakesensor.c                       |   1 +
 drivers/sensors/hall3ph.c                          |  24 +-
 drivers/sensors/hc_sr04.c                          |  25 +-
 drivers/sensors/hdc1008.c                          |  46 ++--
 drivers/sensors/hts221.c                           |  25 +-
 drivers/sensors/hyt271.c                           |  20 +-
 drivers/sensors/kxtj9.c                            |  18 +-
 drivers/sensors/lis2dh.c                           |  19 +-
 drivers/sensors/lis3dh.c                           |  61 +----
 drivers/sensors/lis3dsh.c                          |  30 ++-
 drivers/sensors/lis3mdl.c                          |  30 ++-
 drivers/sensors/lps25h.c                           |  21 +-
 drivers/sensors/lsm330_spi.c                       |  38 ++-
 drivers/sensors/max44009.c                         |  29 +--
 drivers/sensors/mlx90393.c                         |  29 ++-
 drivers/sensors/mpu60x0.c                          |   2 -
 drivers/sensors/ms5611.c                           |  11 +-
 drivers/sensors/qencoder.c                         |  24 +-
 drivers/sensors/scd30.c                            |  33 +--
 drivers/sensors/scd41.c                            |  33 +--
 drivers/sensors/sensor.c                           |   6 +-
 drivers/sensors/sgp30.c                            |  37 +--
 drivers/sensors/sht21.c                            |  33 +--
 drivers/sensors/sht3x.c                            |  27 +-
 drivers/sensors/sps30.c                            |  33 +--
 drivers/sensors/t67xx.c                            |  14 +-
 drivers/sensors/usensor.c                          |  22 +-
 drivers/sensors/xen1210.c                          |  12 +-
 drivers/sensors/xen1210.h                          |   3 +-
 drivers/sensors/zerocross.c                        |  28 +--
 drivers/serial/ptmx.c                              |  23 +-
 drivers/serial/pty.c                               |  51 ++--
 drivers/serial/pty.h                               |   2 +-
 drivers/serial/serial.c                            |  94 +++----
 drivers/serial/uart_bth4.c                         |  11 +-
 drivers/serial/uart_rpmsg.c                        |  12 +-
 drivers/spi/spi_bitbang.c                          |   8 +-
 drivers/spi/spi_driver.c                           |  26 +-
 drivers/spi/spi_slave_driver.c                     |  21 +-
 drivers/syslog/ramlog.c                            |  45 ++--
 drivers/syslog/syslog_device.c                     |  43 ++--
 drivers/timers/capture.c                           |  24 +-
 drivers/timers/oneshot.c                           |  12 +-
 drivers/timers/pwm.c                               |  23 +-
 drivers/timers/rpmsg_rtc.c                         |  20 +-
 drivers/timers/rtc.c                               |  26 +-
 drivers/timers/timer.c                             |  26 +-
 drivers/timers/watchdog.c                          |  26 +-
 drivers/usbdev/adb.c                               |  45 ++--
 drivers/usbdev/usbmsc.c                            |  20 +-
 drivers/usbdev/usbmsc.h                            |  23 +-
 drivers/usbdev/usbmsc_scsi.c                       |  35 +--
 drivers/usbhost/usbhost_cdcacm.c                   |  76 ++----
 drivers/usbhost/usbhost_cdcmbim.c                  |  68 ++---
 drivers/usbhost/usbhost_devaddr.c                  |  30 +--
 drivers/usbhost/usbhost_ft232r.c                   |  76 ++----
 drivers/usbhost/usbhost_hidkbd.c                   | 119 +++------
 drivers/usbhost/usbhost_hidmouse.c                 | 111 +++-----
 drivers/usbhost/usbhost_hub.c                      |  10 -
 drivers/usbhost/usbhost_max3421e.c                 |  88 +++----
 drivers/usbhost/usbhost_skeleton.c                 |  61 +----
 drivers/usbhost/usbhost_storage.c                  |  89 ++-----
 drivers/usbhost/usbhost_xboxcontroller.c           | 120 +++------
 drivers/usbmisc/fusb301.c                          |  22 +-
 drivers/usbmisc/fusb303.c                          |  30 +--
 drivers/usrsock/usrsock_dev.c                      |  54 ++--
 drivers/video/isx012.c                             |  26 +-
 drivers/video/isx019.c                             |  64 ++---
 drivers/video/max7456.c                            |  59 +----
 drivers/video/video.c                              |  76 ++----
 drivers/video/video_framebuff.c                    |  13 +-
 drivers/video/video_framebuff.h                    |   4 +-
 drivers/video/vnc/vnc_updater.c                    |   9 +-
 drivers/wireless/cc1101.c                          |  49 ++--
 drivers/wireless/gs2200m.c                         |  40 +--
 drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c     |   4 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_driver.c  |   4 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c    |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.h    |  26 +-
 .../ieee80211/bcm43xxx/bcmf_gspi_f2_frame.c        |   8 +-
 .../wireless/ieee80211/bcm43xxx/bcmf_interface.c   |  10 +-
 .../wireless/ieee80211/bcm43xxx/bcmf_interface.h   |  23 --
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdio.c    |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdio.h    |  26 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_sdpcm.c   |  16 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_utils.c   |   9 -
 drivers/wireless/ieee80211/bcm43xxx/bcmf_utils.h   |   4 -
 drivers/wireless/ieee802154/mrf24j40/mrf24j40.c    |  10 +-
 drivers/wireless/ieee802154/mrf24j40/mrf24j40.h    |   4 +-
 .../ieee802154/mrf24j40/mrf24j40_interrupt.c       |   8 +-
 .../wireless/ieee802154/mrf24j40/mrf24j40_radif.c  |   9 +-
 drivers/wireless/ieee802154/xbee/xbee.c            |  25 +-
 drivers/wireless/ieee802154/xbee/xbee.h            |   7 +-
 drivers/wireless/ieee802154/xbee/xbee_mac.c        |   4 +-
 drivers/wireless/ieee802154/xbee/xbee_netdev.c     |  19 +-
 drivers/wireless/lpwan/sx127x/sx127x.c             |  54 ++--
 drivers/wireless/nrf24l01.c                        |  45 ++--
 drivers/wireless/spirit/drivers/spirit_netdev.c    | 137 ++--------
 fs/driver/fs_blockproxy.c                          |  12 +-
 fs/driver/fs_mtdproxy.c                            |  12 +-
 fs/driver/fs_registerblockdriver.c                 |   4 +-
 fs/driver/fs_registerdriver.c                      |   4 +-
 fs/driver/fs_registermtddriver.c                   |   4 +-
 fs/driver/fs_unregisterblockdriver.c               |   4 +-
 fs/driver/fs_unregisterdriver.c                    |   4 +-
 fs/driver/fs_unregistermtddriver.c                 |   4 +-
 fs/fat/fs_fat32.c                                  | 279 ++++++++++-----------
 fs/fat/fs_fat32.h                                  |   9 +-
 fs/fat/fs_fat32attrib.c                            |  16 +-
 fs/fat/fs_fat32util.c                              |  18 --
 fs/hostfs/hostfs.c                                 | 191 ++++++--------
 fs/hostfs/hostfs.h                                 |   8 -
 fs/inode/fs_files.c                                |  58 ++---
 fs/inode/fs_foreachinode.c                         |   8 +-
 fs/inode/fs_inode.c                                |   8 +-
 fs/inode/fs_inodeaddref.c                          |   4 +-
 fs/inode/fs_inodefind.c                            |   4 +-
 fs/inode/fs_inoderelease.c                         |   6 +-
 fs/inode/inode.h                                   |   8 +-
 fs/littlefs/lfs_vfs.c                              | 126 ++++------
 fs/mmap/fs_munmap.c                                |  12 +-
 fs/mmap/fs_rammap.c                                |   6 +-
 fs/mmap/fs_rammap.h                                |   4 +-
 fs/mount/fs_automount.c                            |  42 ++--
 fs/mount/fs_mount.c                                |  12 +-
 fs/mount/fs_umount2.c                              |  14 +-
 fs/mqueue/mq_open.c                                |   4 +-
 fs/mqueue/mq_unlink.c                              |  10 +-
 fs/nfs/nfs_mount.h                                 |   4 +-
 fs/nfs/nfs_vfsops.c                                | 178 ++++++-------
 fs/nxffs/nxffs.h                                   |   3 +-
 fs/nxffs/nxffs_dirent.c                            |  18 +-
 fs/nxffs/nxffs_initialize.c                        |   2 +-
 fs/nxffs/nxffs_ioctl.c                             |  10 +-
 fs/nxffs/nxffs_open.c                              |  52 ++--
 fs/nxffs/nxffs_read.c                              |  14 +-
 fs/nxffs/nxffs_stat.c                              |  18 +-
 fs/nxffs/nxffs_truncate.c                          |  12 +-
 fs/nxffs/nxffs_unlink.c                            |   4 +-
 fs/nxffs/nxffs_write.c                             |  16 +-
 fs/romfs/fs_romfs.c                                | 128 +++++-----
 fs/romfs/fs_romfs.h                                |   4 +-
 fs/romfs/fs_romfsutil.c                            |  18 --
 fs/rpmsgfs/rpmsgfs.c                               | 169 ++++++-------
 fs/rpmsgfs/rpmsgfs_server.c                        |  37 +--
 fs/semaphore/sem_close.c                           |   6 +-
 fs/semaphore/sem_open.c                            |   4 +-
 fs/semaphore/sem_unlink.c                          |  10 +-
 fs/smartfs/smartfs.h                               |   8 +-
 fs/smartfs/smartfs_smart.c                         | 217 ++++++++--------
 fs/smartfs/smartfs_utils.c                         |  18 --
 fs/spiffs/src/spiffs_vfs.c                         |   2 +-
 fs/unionfs/fs_unionfs.c                            |  67 ++---
 fs/userfs/fs_userfs.c                              | 146 +++++------
 fs/vfs/fs_dir.c                                    |   8 +-
 fs/vfs/fs_eventfd.c                                |  47 ++--
 fs/vfs/fs_fdopen.c                                 |   8 +-
 fs/vfs/fs_mkdir.c                                  |   4 +-
 fs/vfs/fs_poll.c                                   |  17 +-
 fs/vfs/fs_rename.c                                 |  10 +-
 fs/vfs/fs_rmdir.c                                  |   4 +-
 fs/vfs/fs_symlink.c                                |   4 +-
 fs/vfs/fs_timerfd.c                                |  45 ++--
 fs/vfs/fs_unlink.c                                 |   4 +-
 graphics/nxterm/Make.defs                          |   4 -
 graphics/nxterm/nxterm.h                           |  14 +-
 graphics/nxterm/nxterm_driver.c                    |  16 +-
 graphics/nxterm/nxterm_kbdin.c                     |  40 +--
 graphics/nxterm/nxterm_redraw.c                    |   4 +-
 graphics/nxterm/nxterm_register.c                  |   2 +-
 graphics/nxterm/nxterm_resize.c                    |   4 +-
 graphics/nxterm/nxterm_sem.c                       |  97 -------
 graphics/nxterm/nxterm_unregister.c                |   4 +-
 include/nuttx/analog/adc.h                         |   3 +-
 include/nuttx/analog/comp.h                        |   3 +-
 include/nuttx/analog/dac.h                         |  17 +-
 include/nuttx/analog/opamp.h                       |   4 +-
 include/nuttx/audio/audio.h                        |   4 +-
 include/nuttx/can/can.h                            |   6 +-
 include/nuttx/drivers/rwbuffer.h                   |   6 +-
 include/nuttx/fs/fs.h                              |   4 +-
 include/nuttx/leds/ws2812.h                        |   4 +-
 include/nuttx/lib/lib.h                            |  12 +-
 include/nuttx/motor/foc/foc.h                      |   5 +-
 include/nuttx/mtd/nand.h                           |   4 +-
 include/nuttx/mutex.h                              | 103 +++++++-
 include/nuttx/nx/nxmu.h                            |  20 --
 include/nuttx/power/battery_charger.h              |   4 +-
 include/nuttx/power/battery_gauge.h                |   4 +-
 include/nuttx/power/battery_monitor.h              |   4 +-
 include/nuttx/power/powerled.h                     |   4 +-
 include/nuttx/power/regulator.h                    |   3 +-
 include/nuttx/power/smps.h                         |   4 +-
 include/nuttx/sched.h                              |   2 +-
 include/nuttx/serial/serial.h                      |   8 +-
 include/nuttx/spi/spi_bitbang.h                    |   4 +-
 include/nuttx/tls.h                                |   2 +-
 include/nuttx/usb/usbhost_devaddr.h                |   4 +-
 include/nuttx/wireless/cc1101.h                    |   5 +-
 include/nuttx/wireless/ieee80211/bcmf_gspi.h       |   3 +-
 libs/libc/audio/lib_buffer.c                       |  44 +---
 libs/libc/locale/lib_gettext.c                     |  15 +-
 libs/libc/pthread/pthread_keycreate.c              |  10 +-
 libs/libc/pthread/pthread_keydelete.c              |   8 +-
 libs/libc/stdio/lib_fclose.c                       |   2 +-
 libs/libc/stdio/lib_ftello.c                       |   4 +-
 libs/libc/stdio/lib_libfflush.c                    |  14 +-
 libs/libc/stdio/lib_libfilesem.c                   |  14 +-
 libs/libc/stdio/lib_libfread.c                     |   6 +-
 libs/libc/stdio/lib_libfwrite.c                    |  12 +-
 libs/libc/stdio/lib_libstream.c                    |  30 +--
 libs/libc/stdio/lib_puts.c                         |   4 +-
 libs/libc/stdio/lib_rdflush.c                      |   6 +-
 libs/libc/stdio/lib_rewind.c                       |   4 +-
 libs/libc/stdio/lib_setvbuf.c                      |  14 +-
 libs/libc/stdio/lib_vfprintf.c                     |   4 +-
 libs/libc/stdio/lib_vfscanf.c                      |   4 +-
 libs/libc/stdlib/lib_atexit.c                      |   8 +-
 libs/libc/stdlib/lib_mktemp.c                      |  14 +-
 libs/libc/time/lib_localtime.c                     |  35 +--
 libs/libc/userfs/lib_userfs.c                      |   8 +-
 libs/libc/wqueue/work_cancel.c                     |   4 +-
 libs/libc/wqueue/work_queue.c                      |   5 +-
 libs/libc/wqueue/work_usrthread.c                  |  13 +-
 libs/libc/wqueue/wqueue.h                          |   5 +-
 libs/libnx/nxfonts/nxfonts_cache.c                 |  98 ++------
 libs/libnx/nxmu/Make.defs                          |   5 +-
 libs/libnx/nxmu/nx_connect.c                       |   9 +-
 libs/libnx/nxmu/nxmu_semtake.c                     |  55 ----
 mm/iob/iob_initialize.c                            |  11 +-
 mm/kasan/kasan.c                                   |   8 +-
 mm/mm_gran/mm_gran.h                               |   4 +-
 mm/mm_gran/mm_grancritical.c                       |   4 +-
 mm/mm_gran/mm_graninit.c                           |   2 +-
 mm/mm_gran/mm_granrelease.c                        |   2 +-
 mm/mm_heap/Make.defs                               |   2 +-
 mm/mm_heap/mm.h                                    |  14 +-
 mm/mm_heap/mm_addfreechunk.c                       |   2 +-
 mm/mm_heap/mm_extend.c                             |   6 +-
 mm/mm_heap/mm_foreach.c                            |   6 +-
 mm/mm_heap/mm_free.c                               |   7 +-
 mm/mm_heap/mm_initialize.c                         |  11 +-
 mm/mm_heap/{mm_sem.c => mm_lock.c}                 |  85 ++-----
 mm/mm_heap/mm_malloc.c                             |   6 +-
 mm/mm_heap/mm_memalign.c                           |   6 +-
 mm/mm_heap/mm_realloc.c                            |  12 +-
 mm/mm_heap/mm_shrinkchunk.c                        |   2 +-
 mm/shm/shm.h                                       |  16 +-
 mm/shm/shm_initialize.c                            |   2 +-
 mm/shm/shmat.c                                     |  10 +-
 mm/shm/shmctl.c                                    |  16 +-
 mm/shm/shmdt.c                                     |   4 +-
 mm/shm/shmget.c                                    |  18 +-
 net/can/can_conn.c                                 |  38 +--
 net/icmp/icmp_conn.c                               |  18 +-
 net/icmpv6/icmpv6_conn.c                           |  18 +-
 net/local/local.h                                  |   3 +-
 net/local/local_conn.c                             |   4 +-
 net/local/local_connect.c                          |  19 +-
 net/local/local_sendmsg.c                          |   8 +-
 net/netlink/netlink_conn.c                         |  37 +--
 net/pkt/pkt_conn.c                                 |  35 +--
 net/route/net_cacheroute.c                         |  69 ++---
 net/rpmsg/rpmsg_sockif.c                           |  85 +++----
 net/udp/udp_conn.c                                 |  31 +--
 net/usrsock/usrsock_conn.c                         |  41 +--
 net/usrsock/usrsock_devif.c                        |  13 +-
 net/utils/net_lock.c                               | 129 +---------
 sched/group/group_create.c                         |   4 +-
 sched/pthread/pthread_completejoin.c               |   8 +-
 sched/pthread/pthread_create.c                     |   4 +-
 sched/pthread/pthread_detach.c                     |   4 +-
 sched/pthread/pthread_join.c                       |  12 +-
 sched/pthread/pthread_release.c                    |   4 +-
 sched/task/spawn.h                                 |  21 +-
 sched/task/task_posixspawn.c                       |  14 +-
 sched/task/task_spawn.c                            |  12 +-
 sched/task/task_spawnparms.c                       |  26 +-
 sched/task/task_tls_alloc.c                        |   9 +-
 sched/tls/task_initinfo.c                          |   6 +-
 sched/tls/task_uninitinfo.c                        |   4 +-
 wireless/bluetooth/bt_conn.c                       |   2 +-
 wireless/bluetooth/bt_ioctl.c                      |  17 +-
 wireless/bluetooth/bt_netdev.c                     |   9 -
 wireless/ieee802154/Kconfig                        |   7 -
 wireless/ieee802154/mac802154.c                    |  89 ++++---
 wireless/ieee802154/mac802154.h                    |   2 +-
 wireless/ieee802154/mac802154_assoc.c              |  50 ++--
 wireless/ieee802154/mac802154_data.c               |  22 +-
 wireless/ieee802154/mac802154_device.c             |  74 +++---
 wireless/ieee802154/mac802154_internal.h           |  59 +----
 wireless/ieee802154/mac802154_netdev.c             |  25 +-
 wireless/ieee802154/mac802154_poll.c               |  22 +-
 wireless/ieee802154/mac802154_rxenable.c           |  32 +--
 wireless/ieee802154/mac802154_scan.c               |  27 +-
 wireless/ieee802154/mac802154_start.c              |   7 +-
 wireless/pktradio/pktradio_metadata.c              |  20 +-
 710 files changed, 7503 insertions(+), 14852 deletions(-)

diff --git a/arch/arm/src/am335x/am335x_i2c.c b/arch/arm/src/am335x/am335x_i2c.c
index cf92262001..5df0429d18 100644
--- a/arch/arm/src/am335x/am335x_i2c.c
+++ b/arch/arm/src/am335x/am335x_i2c.c
@@ -36,6 +36,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
 #include <nuttx/clock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -181,7 +182,7 @@ struct am335x_i2c_priv_s
   const struct am335x_i2c_config_s *config;
 
   int refs;                    /* Reference count */
-  sem_t sem_excl;              /* Mutual exclusion semaphore */
+  mutex_t lock;                /* Mutual exclusion mutex */
 #ifndef CONFIG_I2C_POLLED
   sem_t sem_isr;               /* Interrupt wait semaphore */
 #endif
@@ -219,9 +220,6 @@ static inline void am335x_i2c_putreg(struct am335x_i2c_priv_s *priv,
 static inline void am335x_i2c_modifyreg(struct am335x_i2c_priv_s *priv,
                                         uint16_t offset, uint32_t clearbits,
                                         uint32_t setbits);
-static inline int am335x_i2c_sem_wait(struct am335x_i2c_priv_s *priv);
-static int
-am335x_i2c_sem_wait_noncancelable(struct am335x_i2c_priv_s *priv);
 
 #ifdef CONFIG_AM335X_I2C_DYNTIMEO
 static uint32_t am335x_i2c_toticks(int msgc, struct i2c_msg_s *msgs);
@@ -231,10 +229,6 @@ static inline int
 am335x_i2c_sem_waitdone(struct am335x_i2c_priv_s *priv);
 static inline bool
 am335x_i2c_sem_waitstop(struct am335x_i2c_priv_s *priv);
-static inline void am335x_i2c_sem_post(struct am335x_i2c_priv_s *priv);
-static inline void am335x_i2c_sem_init(struct am335x_i2c_priv_s *priv);
-static inline void
-am335x_i2c_sem_destroy(struct am335x_i2c_priv_s *priv);
 
 #ifdef CONFIG_I2C_TRACE
 static void am335x_i2c_tracereset(struct am335x_i2c_priv_s *priv);
@@ -320,6 +314,10 @@ static struct am335x_i2c_priv_s am335x_i2c0_priv =
   .ops        = &am335x_i2c_ops,
   .config     = &am335x_i2c0_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr    = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate   = INTSTATE_IDLE,
   .msgc       = 0,
   .msgv       = NULL,
@@ -351,6 +349,10 @@ static struct am335x_i2c_priv_s am335x_i2c1_priv =
   .ops        = &am335x_i2c_ops,
   .config     = &am335x_i2c1_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr    = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate   = INTSTATE_IDLE,
   .msgc       = 0,
   .msgv       = NULL,
@@ -382,6 +384,10 @@ static struct am335x_i2c_priv_s am335x_i2c2_priv =
   .ops        = &am335x_i2c_ops,
   .config     = &am335x_i2c2_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr    = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate   = INTSTATE_IDLE,
   .msgc       = 0,
   .msgv       = NULL,
@@ -439,34 +445,6 @@ static inline void am335x_i2c_modifyreg(struct am335x_i2c_priv_s *priv,
   modifyreg32(priv->config->base + offset, clearbits, setbits);
 }
 
-/****************************************************************************
- * Name: am335x_i2c_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.  May be interrupted by
- *   a signal.
- *
- ****************************************************************************/
-
-static inline int am335x_i2c_sem_wait(struct am335x_i2c_priv_s *priv)
-{
-  return nxsem_wait(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: am335x_i2c_sem_wait_noncancelable
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.
- *
- ****************************************************************************/
-
-static int
-am335x_i2c_sem_wait_noncancelable(struct am335x_i2c_priv_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->sem_excl);
-}
-
 /****************************************************************************
  * Name: am335x_i2c_toticks
  *
@@ -691,57 +669,6 @@ am335x_i2c_sem_waitstop(struct am335x_i2c_priv_s *priv)
   return false;
 }
 
-/****************************************************************************
- * Name: am335x_i2c_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void am335x_i2c_sem_post(struct am335x_i2c_priv_s *priv)
-{
-  nxsem_post(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: am335x_i2c_sem_init
- *
- * Description:
- *   Initialize semaphores
- *
- ****************************************************************************/
-
-static inline void am335x_i2c_sem_init(struct am335x_i2c_priv_s *priv)
-{
-  nxsem_init(&priv->sem_excl, 0, 1);
-
-#ifndef CONFIG_I2C_POLLED
-  /* This semaphore is used for signaling and, hence, should not have
-   * priority inheritance enabled.
-   */
-
-  nxsem_init(&priv->sem_isr, 0, 0);
-  nxsem_set_protocol(&priv->sem_isr, SEM_PRIO_NONE);
-#endif
-}
-
-/****************************************************************************
- * Name: am335x_i2c_sem_destroy
- *
- * Description:
- *   Destroy semaphores.
- *
- ****************************************************************************/
-
-static inline void am335x_i2c_sem_destroy(struct am335x_i2c_priv_s *priv)
-{
-  nxsem_destroy(&priv->sem_excl);
-#ifndef CONFIG_I2C_POLLED
-  nxsem_destroy(&priv->sem_isr);
-#endif
-}
-
 /****************************************************************************
  * Name: am335x_i2c_trace*
  *
@@ -1382,7 +1309,7 @@ static int am335x_i2c_transfer(struct i2c_master_s *dev,
 
   /* Ensure that address or flags don't change meanwhile */
 
-  ret = am335x_i2c_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1498,7 +1425,7 @@ static int am335x_i2c_transfer(struct i2c_master_s *dev,
       priv->ptr = NULL;
     }
 
-  am335x_i2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -1535,7 +1462,7 @@ static int am335x_i2c_reset(struct i2c_master_s *dev)
 
   /* Lock out other clients */
 
-  ret = am335x_i2c_sem_wait_noncancelable(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1630,7 +1557,7 @@ out:
 
   /* Release the port for re-use by other clients */
 
-  am335x_i2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_I2C_RESET */
@@ -1683,7 +1610,6 @@ struct i2c_master_s *am335x_i2cbus_initialize(int port)
 
   if ((volatile int)priv->refs++ == 0)
     {
-      am335x_i2c_sem_init(priv);
       am335x_i2c_init(priv);
     }
 
@@ -1728,9 +1654,6 @@ int am335x_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   am335x_i2c_deinit(priv);
 
-  /* Release unused resources */
-
-  am335x_i2c_sem_destroy(priv);
   return OK;
 }
 
diff --git a/arch/arm/src/am335x/am335x_lcdc.c b/arch/arm/src/am335x/am335x_lcdc.c
index 75ffe59509..be8e5e64c9 100644
--- a/arch/arm/src/am335x/am335x_lcdc.c
+++ b/arch/arm/src/am335x/am335x_lcdc.c
@@ -53,7 +53,6 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
 #include <nuttx/video/fb.h>
 
 #include "arm_internal.h"
@@ -143,7 +142,6 @@ struct am335x_lcd_dev_s
 
   struct am335x_panel_info_s panel;
 
-  sem_t exclsem;        /* Assure mutually exclusive access */
   nxgl_coord_t stride;  /* Width of framebuffer in bytes */
   size_t fbsize;        /* Size of the framebuffer allocation */
 };
@@ -586,7 +584,6 @@ int am335x_lcd_initialize(const struct am335x_panel_info_s *panel)
 
   /* Initialize the device state singleton */
 
-  nxsem_init(&priv->exclsem, 0, 1);
   memcpy(&priv->panel, panel, sizeof(struct am335x_panel_info_s));
 
   /* Save framebuffer information */
diff --git a/arch/arm/src/cxd56xx/cxd56_adc.c b/arch/arm/src/cxd56xx/cxd56_adc.c
index c1df7dee00..69687774c2 100644
--- a/arch/arm/src/cxd56xx/cxd56_adc.c
+++ b/arch/arm/src/cxd56xx/cxd56_adc.c
@@ -36,7 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/irq.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <arch/chip/scu.h>
 #include <arch/chip/adc.h>
 
@@ -174,7 +174,7 @@ struct cxd56adc_dev_s
   struct scufifo_wm_s *wm;        /* water mark */
   struct math_filter_s *filter;   /* math filter */
   struct scuev_notify_s * notify; /* notify */
-  sem_t            exclsem;       /* exclusive semaphore */
+  mutex_t          lock;          /* exclusive mutex */
   int              crefs;         /* reference count */
 };
 
@@ -718,14 +718,14 @@ static int cxd56_adc_open(struct file *filep)
 
   /* Increment reference counter */
 
-  nxsem_wait_uninterruptible(&priv->exclsem);
+  nxmutex_lock(&priv->lock);
 
   priv->crefs++;
   DEBUGASSERT(priv->crefs > 0);
 
   if (priv->crefs > 1)
     {
-      nxsem_post(&priv->exclsem);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
@@ -738,7 +738,7 @@ static int cxd56_adc_open(struct file *filep)
   priv->seq = seq_open(SEQ_TYPE_NORMAL, type);
   if (!priv->seq)
     {
-      nxsem_post(&priv->exclsem);
+      nxmutex_unlock(&priv->lock);
       return -ENOENT;
     }
 
@@ -751,14 +751,13 @@ static int cxd56_adc_open(struct file *filep)
   ret = set_ofstgain(priv);
   if (ret < 0)
     {
-      nxsem_post(&priv->exclsem);
+      nxmutex_unlock(&priv->lock);
       return ret;
     }
 
   ainfo("open ch%d freq%d scufifo%d\n", priv->ch, priv->freq, priv->fsize);
 
-  nxsem_post(&priv->exclsem);
-
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -781,14 +780,14 @@ static int cxd56_adc_close(struct file *filep)
 
   /* Decrement reference counter */
 
-  nxsem_wait_uninterruptible(&priv->exclsem);
+  nxmutex_lock(&priv->lock);
 
   DEBUGASSERT(priv->crefs > 0);
   priv->crefs--;
 
   if (priv->crefs > 0)
     {
-      nxsem_post(&priv->exclsem);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
@@ -815,8 +814,7 @@ static int cxd56_adc_close(struct file *filep)
       priv->notify = NULL;
     }
 
-  nxsem_post(&priv->exclsem);
-
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -1110,7 +1108,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_lpadc0priv.exclsem, 0, 1);
+  nxmutex_init(&g_lpadc0priv.lock);
 #endif
 #if defined (CONFIG_CXD56_LPADC1) || defined (CONFIG_CXD56_LPADC0_1) || defined (CONFIG_CXD56_LPADC_ALL)
   ret = register_driver("/dev/lpadc1", &g_adcops, 0666, &g_lpadc1priv);
@@ -1120,7 +1118,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_lpadc1priv.exclsem, 0, 1);
+  nxmutex_init(&g_lpadc1priv.lock);
 #endif
 #if defined (CONFIG_CXD56_LPADC2) || defined (CONFIG_CXD56_LPADC_ALL)
   ret = register_driver("/dev/lpadc2", &g_adcops, 0666, &g_lpadc2priv);
@@ -1130,7 +1128,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_lpadc2priv.exclsem, 0, 1);
+  nxmutex_init(&g_lpadc2priv.lock);
 #endif
 #if defined (CONFIG_CXD56_LPADC3) || defined (CONFIG_CXD56_LPADC_ALL)
   ret = register_driver("/dev/lpadc3", &g_adcops, 0666, &g_lpadc3priv);
@@ -1140,7 +1138,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_lpadc3priv.exclsem, 0, 1);
+  nxmutex_init(&g_lpadc3priv.lock);
 #endif
 #ifdef CONFIG_CXD56_HPADC0
   ret = register_driver("/dev/hpadc0", &g_adcops, 0666, &g_hpadc0priv);
@@ -1150,7 +1148,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_hpadc0priv.exclsem, 0, 1);
+  nxmutex_init(&g_hpadc0priv.lock);
 #endif
 #ifdef CONFIG_CXD56_HPADC1
   ret = register_driver("/dev/hpadc1", &g_adcops, 0666, &g_hpadc1priv);
@@ -1160,7 +1158,7 @@ int cxd56_adcinitialize(void)
       return ret;
     }
 
-  nxsem_init(&g_hpadc1priv.exclsem, 0, 1);
+  nxmutex_init(&g_hpadc1priv.lock);
 #endif
 
   return ret;
diff --git a/arch/arm/src/cxd56xx/cxd56_charger.c b/arch/arm/src/cxd56xx/cxd56_charger.c
index 562f869809..325eb27ff5 100644
--- a/arch/arm/src/cxd56xx/cxd56_charger.c
+++ b/arch/arm/src/cxd56xx/cxd56_charger.c
@@ -39,6 +39,7 @@
 #include <math.h>
 
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/power/battery_charger.h>
 #include <nuttx/power/battery_ioctl.h>
 
@@ -64,7 +65,7 @@
 
 struct charger_dev_s
 {
-  sem_t batsem;
+  mutex_t batlock;
 };
 
 /****************************************************************************
@@ -451,7 +452,7 @@ static int charger_ioctl(struct file *filep, int cmd, unsigned long arg)
   struct charger_dev_s *priv = inode->i_private;
   int ret = -ENOTTY;
 
-  nxsem_wait_uninterruptible(&priv->batsem);
+  nxmutex_lock(&priv->batlock);
 
   switch (cmd)
     {
@@ -593,8 +594,7 @@ static int charger_ioctl(struct file *filep, int cmd, unsigned long arg)
         break;
     }
 
-  nxsem_post(&priv->batsem);
-
+  nxmutex_unlock(&priv->batlock);
   return ret;
 }
 
@@ -623,7 +623,7 @@ int cxd56_charger_initialize(const char *devpath)
 
   /* Initialize the CXD5247 device structure */
 
-  nxsem_init(&priv->batsem, 0, 1);
+  nxmutex_init(&priv->batlock);
 
   /* Register battery driver */
 
diff --git a/arch/arm/src/cxd56xx/cxd56_clock.c b/arch/arm/src/cxd56xx/cxd56_clock.c
index 313f047407..f5796fe50c 100644
--- a/arch/arm/src/cxd56xx/cxd56_clock.c
+++ b/arch/arm/src/cxd56xx/cxd56_clock.c
@@ -31,6 +31,7 @@
 #include <stdint.h>
 
 #include <arch/chip/pm.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "chip.h"
@@ -155,7 +156,7 @@ static uint32_t g_active_imgdevs = 0;
 
 /* Exclusive control */
 
-static sem_t g_clockexc = SEM_INITIALIZER(1);
+static mutex_t g_clocklock = NXMUTEX_INITIALIZER;
 
 /* For peripherals inside SCU block
  *
@@ -219,19 +220,19 @@ const struct scu_peripheral g_scuhpadc =
  * Private Functions
  ****************************************************************************/
 
-static void clock_semtake(sem_t *id)
+static void clock_lock(mutex_t *lock)
 {
   if (!up_interrupt_context())
     {
-      nxsem_wait_uninterruptible(id);
+      nxmutex_lock(lock);
     }
 }
 
-static void clock_semgive(sem_t *id)
+static void clock_unlock(mutex_t *lock)
 {
   if (!up_interrupt_context())
     {
-      nxsem_post(id);
+      nxmutex_unlock(lock);
     }
 }
 
@@ -889,11 +890,11 @@ static void cxd56_spim_clock_disable(void)
 
 static void cxd56_img_spi_clock_enable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
   enable_pwd(PDID_APP_SUB);
   cxd56_img_clock_enable();
   putreg32(0x00010002, CXD56_CRG_GEAR_IMG_SPI);
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -906,11 +907,11 @@ static void cxd56_img_spi_clock_enable(void)
 
 static void cxd56_img_spi_clock_disable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
   putreg32(0, CXD56_CRG_GEAR_IMG_SPI);
   cxd56_img_clock_disable();
   disable_pwd(PDID_APP_SUB);
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 #endif
 
@@ -926,11 +927,11 @@ static void cxd56_img_spi_clock_disable(void)
 
 static void cxd56_img_wspi_clock_enable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
   enable_pwd(PDID_APP_SUB);
   cxd56_img_clock_enable();
   putreg32(0x00010004, CXD56_CRG_GEAR_IMG_WSPI);
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -943,11 +944,11 @@ static void cxd56_img_wspi_clock_enable(void)
 
 static void cxd56_img_wspi_clock_disable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
   putreg32(0, CXD56_CRG_GEAR_IMG_WSPI);
   cxd56_img_clock_disable();
   disable_pwd(PDID_APP_SUB);
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 #endif
 
@@ -1089,7 +1090,7 @@ void cxd56_spi_clock_gear_adjust(int port, uint32_t maxfreq)
       return;
     }
 
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
   baseclock = cxd56_get_appsmp_baseclock();
   if (baseclock != 0)
     {
@@ -1108,7 +1109,7 @@ void cxd56_spi_clock_gear_adjust(int port, uint32_t maxfreq)
       putreg32(gear, addr);
     }
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 #if defined(CONFIG_CXD56_I2C2)
@@ -1320,7 +1321,7 @@ void cxd56_img_uart_clock_enable()
 {
   uint32_t val = 0;
 
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   enable_pwd(PDID_APP_SUB);
   cxd56_img_clock_enable();
@@ -1333,7 +1334,7 @@ void cxd56_img_uart_clock_enable()
 #endif /* CONFIG_CXD56_UART2 */
   putreg32(val, CXD56_CRG_GEAR_IMG_UART);
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -1348,7 +1349,7 @@ void cxd56_img_uart_clock_disable()
 {
   uint32_t val = 0;
 
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   val = getreg32(CXD56_CRG_GEAR_IMG_UART);
   val &= ~(1UL << 16);
@@ -1357,7 +1358,7 @@ void cxd56_img_uart_clock_disable()
   cxd56_img_clock_disable();
   disable_pwd(PDID_APP_SUB);
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -1370,13 +1371,13 @@ void cxd56_img_uart_clock_disable()
 
 void cxd56_img_cisif_clock_enable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   enable_pwd(PDID_APP_SUB);
   cxd56_img_clock_enable();
   g_active_imgdevs |= FLAG_IMG_CISIF;
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -1389,13 +1390,13 @@ void cxd56_img_cisif_clock_enable(void)
 
 void cxd56_img_cisif_clock_disable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   g_active_imgdevs &= ~FLAG_IMG_CISIF;
   cxd56_img_clock_disable();
   disable_pwd(PDID_APP_SUB);
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -1408,13 +1409,13 @@ void cxd56_img_cisif_clock_disable(void)
 
 void cxd56_img_ge2d_clock_enable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   enable_pwd(PDID_APP_SUB);
   cxd56_img_clock_enable();
   g_active_imgdevs |= FLAG_IMG_GE2D;
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 /****************************************************************************
@@ -1427,13 +1428,13 @@ void cxd56_img_ge2d_clock_enable(void)
 
 void cxd56_img_ge2d_clock_disable(void)
 {
-  clock_semtake(&g_clockexc);
+  clock_lock(&g_clocklock);
 
   g_active_imgdevs &= ~FLAG_IMG_GE2D;
   cxd56_img_clock_disable();
   disable_pwd(PDID_APP_SUB);
 
-  clock_semgive(&g_clockexc);
+  clock_unlock(&g_clocklock);
 }
 
 static uint32_t cxd56_get_clock(enum clock_source cs)
diff --git a/arch/arm/src/cxd56xx/cxd56_dmac.c b/arch/arm/src/cxd56xx/cxd56_dmac.c
index 434ba055a2..80cab93047 100644
--- a/arch/arm/src/cxd56xx/cxd56_dmac.c
+++ b/arch/arm/src/cxd56xx/cxd56_dmac.c
@@ -34,7 +34,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include "cxd56_dmac.h"
 
@@ -290,7 +290,7 @@ struct dma_channel_s
 /* This is the array of all DMA channels */
 
 static struct dma_channel_s g_dmach[NCHANNELS];
-static sem_t g_dmaexc;
+static mutex_t g_dmalock;
 
 static int dma_init(int ch);
 static int dma_uninit(int ch);
@@ -727,7 +727,7 @@ void weak_function arm_dma_initialize(void)
       up_enable_irq(irq_map[i]);
     }
 
-  nxsem_init(&g_dmaexc, 0, 1);
+  nxmutex_init(&g_dmalock);
 }
 
 /****************************************************************************
@@ -762,7 +762,7 @@ DMA_HANDLE cxd56_dmachannel(int ch, ssize_t maxsize)
 
   /* Get exclusive access to allocate channel */
 
-  nxsem_wait_uninterruptible(&g_dmaexc);
+  nxmutex_lock(&g_dmalock);
 
   if (ch < 0 || ch >= NCHANNELS)
     {
@@ -806,12 +806,11 @@ DMA_HANDLE cxd56_dmachannel(int ch, ssize_t maxsize)
 
   dmach->inuse  = true;
 
-  nxsem_post(&g_dmaexc);
-
+  nxmutex_unlock(&g_dmalock);
   return (DMA_HANDLE)dmach;
 
 err:
-  nxsem_post(&g_dmaexc);
+  nxmutex_unlock(&g_dmalock);
   return NULL;
 }
 
@@ -845,7 +844,7 @@ void cxd56_dmafree(DMA_HANDLE handle)
       return;
     }
 
-  nxsem_wait_uninterruptible(&g_dmaexc);
+  nxmutex_lock(&g_dmalock);
 
   if (!dmach->inuse)
     {
@@ -863,7 +862,7 @@ void cxd56_dmafree(DMA_HANDLE handle)
   dmach->inuse = false;
 
 err:
-  nxsem_post(&g_dmaexc);
+  nxmutex_unlock(&g_dmalock);
 }
 
 /****************************************************************************
diff --git a/arch/arm/src/cxd56xx/cxd56_emmc.c b/arch/arm/src/cxd56xx/cxd56_emmc.c
index 3955578118..5fd3fbc960 100644
--- a/arch/arm/src/cxd56xx/cxd56_emmc.c
+++ b/arch/arm/src/cxd56xx/cxd56_emmc.c
@@ -35,6 +35,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/irq.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include <arch/board/board.h>
@@ -91,7 +92,7 @@ struct emmc_dma_desc_s
 
 struct cxd56_emmc_state_s
 {
-  sem_t excsem;
+  mutex_t lock;
   int crefs;
   uint32_t total_sectors;
 };
@@ -143,16 +144,6 @@ struct cxd56_emmc_state_s g_emmcdev;
  * Private Functions
  ****************************************************************************/
 
-static int emmc_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-static void emmc_givesem(sem_t *sem)
-{
-  nxsem_post(sem);
-}
-
 static void emmc_cmdstarted(void)
 {
   uint32_t val;
@@ -429,7 +420,7 @@ static void emmc_send(int datatype, uint32_t opcode, uint32_t arg,
 
   /* Wait for command or data transfer done */
 
-  ret = emmc_takesem(&g_waitsem);
+  ret = nxsem_wait_uninterruptible(&g_waitsem);
   if (ret < 0)
     {
       return;
@@ -592,8 +583,7 @@ static int emmc_interrupt(int irq, void *context, void *arg)
       ferr("End-bit error/write no CRC.\n");
     }
 
-  emmc_givesem(&g_waitsem);
-
+  nxsem_post(&g_waitsem);
   return OK;
 }
 
@@ -705,7 +695,7 @@ static int cxd56_emmc_readsectors(struct cxd56_emmc_state_s *priv,
       return -ENOMEM;
     }
 
-  ret = emmc_takesem(&priv->excsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       kmm_free(descs);
@@ -746,9 +736,8 @@ static int cxd56_emmc_readsectors(struct cxd56_emmc_state_s *priv,
     }
 
 finish:
-  emmc_givesem(&priv->excsem);
+  nxmutex_unlock(&priv->lock);
   kmm_free(descs);
-
   return ret;
 }
 
@@ -767,7 +756,7 @@ static int cxd56_emmc_writesectors(struct cxd56_emmc_state_s *priv,
       return -ENOMEM;
     }
 
-  ret = emmc_takesem(&priv->excsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       kmm_free(descs);
@@ -822,9 +811,8 @@ static int cxd56_emmc_writesectors(struct cxd56_emmc_state_s *priv,
   emmc_flushwritefifo();
 
 finish:
-  emmc_givesem(&priv->excsem);
+  nxmutex_unlock(&priv->lock);
   kmm_free(descs);
-
   return ret;
 }
 #endif
@@ -839,14 +827,14 @@ static int cxd56_emmc_open(struct inode *inode)
 
   /* Just increment the reference count on the driver */
 
-  ret = emmc_takesem(&priv->excsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
     }
 
   priv->crefs++;
-  emmc_givesem(&priv->excsem);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -861,14 +849,14 @@ static int cxd56_emmc_close(struct inode *inode)
   /* Decrement the reference count on the block driver */
 
   DEBUGASSERT(priv->crefs > 0);
-  ret = emmc_takesem(&priv->excsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
     }
 
   priv->crefs--;
-  emmc_givesem(&priv->excsem);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -952,7 +940,7 @@ int cxd56_emmcinitialize(void)
   priv = &g_emmcdev;
 
   memset(priv, 0, sizeof(struct cxd56_emmc_state_s));
-  nxsem_init(&priv->excsem, 0, 1);
+  nxmutex_init(&priv->lock);
   nxsem_init(&g_waitsem, 0, 0);
   nxsem_set_protocol(&g_waitsem, SEM_PRIO_NONE);
 
diff --git a/arch/arm/src/cxd56xx/cxd56_farapi.c b/arch/arm/src/cxd56xx/cxd56_farapi.c
index f9501af8da..61ae9b1f36 100644
--- a/arch/arm/src/cxd56xx/cxd56_farapi.c
+++ b/arch/arm/src/cxd56xx/cxd56_farapi.c
@@ -28,6 +28,7 @@
 #include <nuttx/sched.h>
 #include <nuttx/irq.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <assert.h>
 #include <debug.h>
 #include <errno.h>
@@ -113,7 +114,7 @@ extern struct modulelist_s _image_modlist_base[];
  ****************************************************************************/
 
 static sem_t g_farwait;
-static sem_t g_farlock;
+static mutex_t g_farlock;
 static struct pm_cpu_wakelock_s g_wlock =
 {
   .count = 0,
@@ -124,11 +125,6 @@ static struct pm_cpu_wakelock_s g_wlock =
  * Private Functions
  ****************************************************************************/
 
-static int farapi_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
 #ifdef CONFIG_CXD56_FARAPI_DEBUG
 static void dump_farapi_message(struct farmsg_s *msg)
 {
@@ -225,7 +221,7 @@ void farapi_main(int id, void *arg, struct modulelist_s *mlist)
     }
 #endif
 
-  farapi_semtake(&g_farlock);
+  nxmutex_lock(&g_farlock);
 
   api = &msg.u.api;
 
@@ -256,7 +252,7 @@ void farapi_main(int id, void *arg, struct modulelist_s *mlist)
 
   /* Wait event flag message as Far API done */
 
-  farapi_semtake(&g_farwait);
+  nxsem_wait_uninterruptible(&g_farwait);
 
   /* Permit hot sleep with Far API done */
 
@@ -265,8 +261,7 @@ void farapi_main(int id, void *arg, struct modulelist_s *mlist)
   dump_farapi_message(&msg);
 
 err:
-  nxsem_post(&g_farlock);
-
+  nxmutex_unlock(&g_farlock);
 #ifdef CONFIG_SMP
   if (0 != cpu)
     {
@@ -295,7 +290,7 @@ void cxd56_farapiinitialize(void)
     }
 
 #endif
-  nxsem_init(&g_farlock, 0, 1);
+  nxmutex_init(&g_farlock);
   nxsem_init(&g_farwait, 0, 0);
   nxsem_set_protocol(&g_farwait, SEM_PRIO_NONE);
 
diff --git a/arch/arm/src/cxd56xx/cxd56_gauge.c b/arch/arm/src/cxd56xx/cxd56_gauge.c
index b26ed62088..dc73d50240 100644
--- a/arch/arm/src/cxd56xx/cxd56_gauge.c
+++ b/arch/arm/src/cxd56xx/cxd56_gauge.c
@@ -36,6 +36,7 @@
 #include <debug.h>
 
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/power/battery_gauge.h>
 #include <nuttx/power/battery_ioctl.h>
 
@@ -55,7 +56,7 @@
 
 struct bat_gauge_dev_s
 {
-  sem_t batsem;
+  mutex_t batlock;
 };
 
 /****************************************************************************
@@ -279,7 +280,7 @@ static int gauge_ioctl(struct file *filep, int cmd, unsigned long arg)
   struct bat_gauge_dev_s *priv = inode->i_private;
   int ret = -ENOTTY;
 
-  nxsem_wait_uninterruptible(&priv->batsem);
+  nxmutex_lock(&priv->batlock);
 
   switch (cmd)
     {
@@ -317,8 +318,7 @@ static int gauge_ioctl(struct file *filep, int cmd, unsigned long arg)
         break;
     }
 
-  nxsem_post(&priv->batsem);
-
+  nxmutex_unlock(&priv->batlock);
   return ret;
 }
 
@@ -347,7 +347,7 @@ int cxd56_gauge_initialize(const char *devpath)
 
   /* Initialize the CXD5247 device structure */
 
-  nxsem_init(&priv->batsem, 0, 1);
+  nxmutex_init(&priv->batlock);
 
   /* Register battery driver */
 
diff --git a/arch/arm/src/cxd56xx/cxd56_ge2d.c b/arch/arm/src/cxd56xx/cxd56_ge2d.c
index be8f61b31f..5b15795576 100644
--- a/arch/arm/src/cxd56xx/cxd56_ge2d.c
+++ b/arch/arm/src/cxd56xx/cxd56_ge2d.c
@@ -27,6 +27,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/irq.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include <stdio.h>
@@ -50,8 +51,6 @@ static ssize_t ge2d_read(struct file *filep, char *buffer,
 static ssize_t ge2d_write(struct file *filep, const char *buffer,
                           size_t len);
 static int ge2d_ioctl(struct file *filep, int cmd, unsigned long arg);
-static int ge2d_semtake(sem_t *id);
-static void ge2d_semgive(sem_t *id);
 static int ge2d_irqhandler(int irq, void *context, void *arg);
 
 /****************************************************************************
@@ -66,30 +65,12 @@ static const struct file_operations g_ge2dfops =
 };
 
 static sem_t g_wait;
-static sem_t g_lock;
+static mutex_t g_lock;
 
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: ge2d_semtake
- ****************************************************************************/
-
-static int ge2d_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
-/****************************************************************************
- * Name: ge2d_semgive
- ****************************************************************************/
-
-static void ge2d_semgive(sem_t *id)
-{
-  nxsem_post(id);
-}
-
 /****************************************************************************
  * Name: ge2d_read
  ****************************************************************************/
@@ -119,7 +100,7 @@ static ssize_t ge2d_write(struct file *filep, const char *buffer,
 
   /* Get exclusive access */
 
-  ge2d_semtake(&g_lock);
+  nxmutex_lock(&g_lock);
 
   /* Set operation buffer and start processing.
    * Descriptor start address bit 0 is select to bus, always 1 (memory),
@@ -141,14 +122,13 @@ static ssize_t ge2d_write(struct file *filep, const char *buffer,
 
   /* Wait for interrupts for processing done. */
 
-  ge2d_semtake(&g_wait);
+  nxsem_wait_uninterruptible(&g_wait);
 
   /* Disable interrupts */
 
   putreg32(0, GE2D_INTR_ENABLE);
 
-  ge2d_semgive(&g_lock);
-
+  nxmutex_unlock(&g_lock);
   return len;
 }
 
@@ -192,8 +172,7 @@ static int ge2d_irqhandler(int irq, void *context, void *arg)
 
   /* Release semaphore anyway */
 
-  ge2d_semgive(&g_wait);
-
+  nxsem_post(&g_wait);
   return OK;
 }
 
@@ -205,7 +184,7 @@ int cxd56_ge2dinitialize(const char *devname)
 {
   int ret;
 
-  nxsem_init(&g_lock, 0, 1);
+  nxmutex_init(&g_lock);
   nxsem_init(&g_wait, 0, 0);
   nxsem_set_protocol(&g_wait, SEM_PRIO_NONE);
 
@@ -238,7 +217,7 @@ void cxd56_ge2duninitialize(const char *devname)
 
   cxd56_img_ge2d_clock_disable();
 
-  nxsem_destroy(&g_lock);
+  nxmutex_destroy(&g_lock);
   nxsem_destroy(&g_wait);
 
   unregister_driver(devname);
diff --git a/arch/arm/src/cxd56xx/cxd56_geofence.c b/arch/arm/src/cxd56xx/cxd56_geofence.c
index 50dd06cb79..572f3188c0 100644
--- a/arch/arm/src/cxd56xx/cxd56_geofence.c
+++ b/arch/arm/src/cxd56xx/cxd56_geofence.c
@@ -33,6 +33,7 @@
 #include <debug.h>
 
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/board.h>
 #include <nuttx/spi/spi.h>
@@ -58,7 +59,7 @@
 
 struct cxd56_geofence_dev_s
 {
-  sem_t          devsem;
+  mutex_t        devlock;
   struct pollfd *fds[CONFIG_GEOFENCE_NPOLLWAITERS];
 };
 
@@ -435,7 +436,7 @@ static void cxd56_geofence_sighandler(uint32_t data, void *userdata)
     (struct cxd56_geofence_dev_s *)userdata;
   int ret;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return;
@@ -443,7 +444,7 @@ static void cxd56_geofence_sighandler(uint32_t data, void *userdata)
 
   poll_notify(priv->fds, CONFIG_GEOFENCE_NPOLLWAITERS, POLLIN);
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
 }
 
 /****************************************************************************
@@ -557,7 +558,7 @@ static int cxd56_geofence_poll(struct file *filep,
   inode = filep->f_inode;
   priv  = (struct cxd56_geofence_dev_s *)inode->i_private;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -608,7 +609,7 @@ static int cxd56_geofence_poll(struct file *filep,
     }
 
 errout:
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
   return ret;
 }
 
@@ -640,7 +641,7 @@ static int cxd56_geofence_register(const char *devpath)
     }
 
   memset(priv, 0, sizeof(struct cxd56_geofence_dev_s));
-  nxsem_init(&priv->devsem, 0, 1);
+  nxmutex_init(&priv->devlock);
 
   ret = cxd56_geofence_initialize(priv);
   if (ret < 0)
diff --git a/arch/arm/src/cxd56xx/cxd56_gnss.c b/arch/arm/src/cxd56xx/cxd56_gnss.c
index bc4dcd2fb7..b7868061b0 100644
--- a/arch/arm/src/cxd56xx/cxd56_gnss.c
+++ b/arch/arm/src/cxd56xx/cxd56_gnss.c
@@ -34,6 +34,7 @@
 #include <debug.h>
 
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/board.h>
 #include <nuttx/signal.h>
 #include <nuttx/fs/fs.h>
@@ -154,7 +155,7 @@ struct cxd56_devsig_table_s
 
 struct cxd56_gnss_dev_s
 {
-  sem_t                           devsem;
+  mutex_t                         devlock;
   sem_t                           syncsem;
   uint8_t                         num_open;
   uint8_t                         notify_data;
@@ -165,7 +166,7 @@ struct cxd56_gnss_dev_s
   struct cxd56_gnss_sig_s         sigs[CONFIG_CXD56_GNSS_NSIGNALRECEIVERS];
 #endif
   struct cxd56_gnss_shared_info_s shared_info;
-  sem_t                           ioctllock;
+  mutex_t                         ioctllock;
   sem_t                           apiwait;
   int                             apiret;
 };
@@ -1483,7 +1484,7 @@ static int cxd56_gnss_set_signal(struct file *filep, unsigned long arg)
   inode = filep->f_inode;
   priv  = (struct cxd56_gnss_dev_s *)inode->i_private;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -2270,7 +2271,7 @@ static void cxd56_gnss_common_signalhandler(uint32_t data,
   int                      i;
   int                      ret;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return;
@@ -2294,7 +2295,7 @@ static void cxd56_gnss_common_signalhandler(uint32_t data,
       fw_gd_setnotifymask(sigtype, FALSE);
     }
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
 }
 #endif /* CONFIG_CXD56_GNSS_NSIGNALRECEIVERS != 0 */
 
@@ -2378,7 +2379,7 @@ static void cxd56_gnss_default_sighandler(uint32_t data, void *userdata)
       break;
     }
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return;
@@ -2386,7 +2387,7 @@ static void cxd56_gnss_default_sighandler(uint32_t data, void *userdata)
 
   poll_notify(priv->fds, CONFIG_CXD56_GNSS_NPOLLWAITERS, POLLIN);
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
 
 #if CONFIG_CXD56_GNSS_NSIGNALRECEIVERS != 0
   cxd56_gnss_common_signalhandler(data, userdata);
@@ -2594,7 +2595,7 @@ static int cxd56_gnss_open(struct file *filep)
       usleep(100 * 1000);
     }
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -2695,7 +2696,7 @@ static int cxd56_gnss_close(struct file *filep)
   inode = filep->f_inode;
   priv  = (struct cxd56_gnss_dev_s *)inode->i_private;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -2842,7 +2843,7 @@ static int cxd56_gnss_ioctl(struct file *filep, int cmd,
       return -EINVAL;
     }
 
-  ret = nxsem_wait(&priv->ioctllock);
+  ret = nxmutex_lock(&priv->ioctllock);
   if (ret < 0)
     {
       return ret;
@@ -2850,8 +2851,7 @@ static int cxd56_gnss_ioctl(struct file *filep, int cmd,
 
   ret = g_cmdlist[cmd](filep, arg);
 
-  nxsem_post(&priv->ioctllock);
-
+  nxmutex_unlock(&priv->ioctllock);
   return ret;
 }
 
@@ -2882,7 +2882,7 @@ static int cxd56_gnss_poll(struct file *filep, struct pollfd *fds,
   inode = filep->f_inode;
   priv  = (struct cxd56_gnss_dev_s *)inode->i_private;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -2933,7 +2933,7 @@ static int cxd56_gnss_poll(struct file *filep, struct pollfd *fds,
     }
 
 errout:
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
   return ret;
 }
 
@@ -3015,7 +3015,7 @@ static int cxd56_gnss_register(const char *devpath)
 
   memset(priv, 0, sizeof(struct cxd56_gnss_dev_s));
 
-  ret = nxsem_init(&priv->devsem, 0, 1);
+  ret = nxmutex_init(&priv->devlock);
   if (ret < 0)
     {
       gnsserr("Failed to initialize gnss devsem!\n");
@@ -3031,7 +3031,7 @@ static int cxd56_gnss_register(const char *devpath)
 
   nxsem_set_protocol(&priv->apiwait, SEM_PRIO_NONE);
 
-  ret = nxsem_init(&priv->ioctllock, 0, 1);
+  ret = nxmutex_init(&priv->ioctllock);
   if (ret < 0)
     {
       gnsserr("Failed to initialize gnss ioctllock!\n");
diff --git a/arch/arm/src/cxd56xx/cxd56_hostif.c b/arch/arm/src/cxd56xx/cxd56_hostif.c
index a86db14fb7..087c1587f5 100644
--- a/arch/arm/src/cxd56xx/cxd56_hostif.c
+++ b/arch/arm/src/cxd56xx/cxd56_hostif.c
@@ -24,6 +24,7 @@
 
 #include <nuttx/config.h>
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/irq.h>
 
 #include <stdio.h>
@@ -89,7 +90,7 @@ struct cxd56_hifdev_s
   uint32_t      flags;
   const void    *buffer;
   size_t        len;
-  sem_t         exclsem;
+  mutex_t       lock;
   int           crefs;
 };
 
@@ -220,14 +221,14 @@ static int hif_open(struct file *filep)
 
   /* Increment reference counter */
 
-  nxsem_wait_uninterruptible(&priv->exclsem);
+  nxmutex_lock(&priv->lock);
 
   priv->crefs++;
   DEBUGASSERT(priv->crefs > 0);
 
   if (priv->crefs > 1)
     {
-      nxsem_post(&priv->exclsem);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
@@ -238,8 +239,7 @@ static int hif_open(struct file *filep)
       priv->flags |= O_NONBLOCK;
     }
 
-  nxsem_post(&priv->exclsem);
-
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -256,13 +256,12 @@ static int hif_close(struct file *filep)
 
   /* Decrement reference counter */
 
-  nxsem_wait_uninterruptible(&priv->exclsem);
+  nxmutex_lock(&priv->lock);
 
   DEBUGASSERT(priv->crefs > 0);
   priv->crefs--;
 
-  nxsem_post(&priv->exclsem);
-
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -424,7 +423,7 @@ static int hif_initialize(struct hostif_buff_s *buffer)
           return ret;
         }
 
-      nxsem_init(&priv->exclsem, 0, 1);
+      nxmutex_init(&priv->lock);
       priv->crefs = 0;
     }
 
diff --git a/arch/arm/src/cxd56xx/cxd56_i2c.c b/arch/arm/src/cxd56xx/cxd56_i2c.c
index 165a16c3c1..931a6e57f4 100644
--- a/arch/arm/src/cxd56xx/cxd56_i2c.c
+++ b/arch/arm/src/cxd56xx/cxd56_i2c.c
@@ -34,6 +34,7 @@
 #include <assert.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/i2c/i2c_master.h>
 
 #include <nuttx/irq.h>
@@ -79,7 +80,7 @@ struct cxd56_i2cdev_s
   int8_t           port;       /* Port number */
   uint32_t         base_freq;  /* branch frequency */
 
-  sem_t            mutex;      /* Only one thread can access at a time */
+  mutex_t          lock;       /* Only one thread can access at a time */
   sem_t            wait;       /* Place to wait for transfer completion */
   struct wdog_s    timeout;    /* watchdog to timeout when bus hung */
   uint32_t         frequency;  /* Current I2C frequency */
@@ -103,6 +104,8 @@ static struct cxd56_i2cdev_s g_i2c0dev =
   .port = 0,
   .base = CXD56_SCU_I2C0_BASE,
   .irqid = CXD56_IRQ_SCU_I2C0,
+  .lock = NXMUTEX_INITIALIZER,
+  .wait = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .refs = 0,
 };
 #endif
@@ -112,6 +115,8 @@ static struct cxd56_i2cdev_s g_i2c1dev =
   .port = 1,
   .base = CXD56_SCU_I2C1_BASE,
   .irqid = CXD56_IRQ_SCU_I2C1,
+  .lock = NXMUTEX_INITIALIZER,
+  .wait = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .refs = 0,
 };
 #endif
@@ -121,6 +126,8 @@ static struct cxd56_i2cdev_s g_i2c2dev =
   .port = 2,
   .base = CXD56_I2CM_BASE,
   .irqid = CXD56_IRQ_I2CM,
+  .lock = NXMUTEX_INITIALIZER,
+  .wait = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .refs = 0,
 };
 #endif
@@ -129,9 +136,6 @@ static struct cxd56_i2cdev_s g_i2c2dev =
  * Private Functions
  ****************************************************************************/
 
-static inline int i2c_takesem(sem_t *sem);
-static inline int i2c_givesem(sem_t *sem);
-
 static inline uint32_t i2c_reg_read(struct cxd56_i2cdev_s *priv,
                                     uint32_t offset);
 static inline void i2c_reg_write(struct cxd56_i2cdev_s *priv,
@@ -158,24 +162,6 @@ static int  cxd56_i2c_transfer_scu(struct i2c_master_s *dev,
                                    struct i2c_msg_s *msgs, int count);
 #endif
 
-/****************************************************************************
- * Name: i2c_takesem
- ****************************************************************************/
-
-static inline int i2c_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: i2c_givesem
- ****************************************************************************/
-
-static inline int i2c_givesem(sem_t *sem)
-{
-  return nxsem_post(sem);
-}
-
 /****************************************************************************
  * Name: cxd56_i2c_pincontrol
  *
@@ -372,7 +358,7 @@ static void cxd56_i2c_timeout(wdparm_t arg)
   irqstate_t flags            = enter_critical_section();
 
   priv->error = -ENODEV;
-  i2c_givesem(&priv->wait);
+  nxsem_post(&priv->wait);
   leave_critical_section(flags);
 }
 
@@ -479,7 +465,7 @@ static int cxd56_i2c_interrupt(int irq, void *context, void *arg)
       ret = wd_cancel(&priv->timeout);
       if (ret == OK)
         {
-          i2c_givesem(&priv->wait);
+          nxsem_post(&priv->wait);
         }
     }
 
@@ -542,7 +528,7 @@ static int cxd56_i2c_receive(struct cxd56_i2cdev_s *priv, int last)
 
       i2c_reg_rmw(priv, CXD56_IC_INTR_MASK, INTR_RX_FULL, INTR_RX_FULL);
       leave_critical_section(flags);
-      i2c_takesem(&priv->wait);
+      nxsem_wait_uninterruptible(&priv->wait);
 
       if (priv->error != OK)
         {
@@ -589,8 +575,7 @@ static int cxd56_i2c_send(struct cxd56_i2cdev_s *priv, int last)
   i2c_reg_rmw(priv, CXD56_IC_INTR_MASK, INTR_TX_EMPTY, INTR_TX_EMPTY);
   leave_critical_section(flags);
 
-  i2c_takesem(&priv->wait);
-
+  nxsem_wait_uninterruptible(&priv->wait);
   return 0;
 }
 
@@ -618,7 +603,7 @@ static int cxd56_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  i2c_takesem(&priv->mutex);
+  nxmutex_lock(&priv->lock);
 
   /* Check wait semaphore value. If the value is not 0, the transfer can not
    * be performed normally.
@@ -696,8 +681,7 @@ static int cxd56_i2c_transfer(struct i2c_master_s *dev,
 
   cxd56_i2c_clock_gate_enable(priv->port);
 
-  i2c_givesem(&priv->mutex);
-
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -835,7 +819,7 @@ static int cxd56_i2c_transfer_scu(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  i2c_takesem(&priv->mutex);
+  nxmutex_lock(&priv->lock);
 
   /* Apply frequency for request msgs */
 
@@ -869,8 +853,7 @@ static int cxd56_i2c_transfer_scu(struct i2c_master_s *dev,
         }
     }
 
-  i2c_givesem(&priv->mutex);
-
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif
@@ -957,7 +940,7 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 #ifdef CONFIG_CXD56_I2C0
   if (port == 0)
     {
-      priv        = &g_i2c0dev;
+      priv          = &g_i2c0dev;
 #  ifndef CONFIG_CXD56_I2C0_SCUSEQ
       priv->dev.ops = &cxd56_i2c_ops;
 #  else
@@ -969,7 +952,7 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 #ifdef CONFIG_CXD56_I2C1
   if (port == 1)
     {
-      priv        = &g_i2c1dev;
+      priv          = &g_i2c1dev;
 #  ifndef CONFIG_CXD56_I2C1_SCUSEQ
       priv->dev.ops = &cxd56_i2c_ops;
 #  else
@@ -1034,10 +1017,6 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 
   cxd56_i2c_pincontrol(port, true);
 
-  nxsem_init(&priv->mutex, 0, 1);
-  nxsem_init(&priv->wait, 0, 0);
-  nxsem_set_protocol(&priv->wait, SEM_PRIO_NONE);
-
   /* Attach Interrupt Handler */
 
   irq_attach(priv->irqid, cxd56_i2c_interrupt, priv);
@@ -1100,8 +1079,6 @@ int cxd56_i2cbus_uninitialize(struct i2c_master_s *dev)
   irq_detach(priv->irqid);
 
   wd_cancel(&priv->timeout);
-  nxsem_destroy(&priv->mutex);
-  nxsem_destroy(&priv->wait);
 
   return OK;
 }
diff --git a/arch/arm/src/cxd56xx/cxd56_icc.c b/arch/arm/src/cxd56xx/cxd56_icc.c
index ca0622b272..01c2441068 100644
--- a/arch/arm/src/cxd56xx/cxd56_icc.c
+++ b/arch/arm/src/cxd56xx/cxd56_icc.c
@@ -145,21 +145,6 @@ static struct iccdev_s *g_cpumsg[NCPUS];
  * Private Functions
  ****************************************************************************/
 
-static int icc_semtake(sem_t *semid)
-{
-  return nxsem_wait_uninterruptible(semid);
-}
-
-static int icc_semtrytake(sem_t *semid)
-{
-  return nxsem_trywait(semid);
-}
-
-static void icc_semgive(sem_t *semid)
-{
-  nxsem_post(semid);
-}
-
 static struct iccdev_s *icc_getprotocol(int protoid)
 {
   if (protoid < 0 || protoid >= NPROTOCOLS)
@@ -234,7 +219,7 @@ static int icc_irqhandler(int cpuid, uint32_t word[2])
 
   sq_addlast((sq_entry_t *)req, &priv->recvq);
 
-  icc_semgive(&priv->rxwait);
+  nxsem_post(&priv->rxwait);
 
   /* If signal registered by cxd56_iccnotify(), then send POSIX signal to
    * process.
@@ -295,7 +280,7 @@ static int icc_msghandler(int cpuid, int protoid, uint32_t pdata,
 static void icc_rxtimeout(wdparm_t arg)
 {
   struct iccdev_s *priv = (struct iccdev_s *)arg;
-  icc_semgive(&priv->rxwait);
+  nxsem_post(&priv->rxwait);
 }
 
 static int icc_recv(struct iccdev_s *priv, iccmsg_t *msg, int32_t ms)
@@ -308,7 +293,7 @@ static int icc_recv(struct iccdev_s *priv, iccmsg_t *msg, int32_t ms)
     {
       /* Try to take the semaphore without waiging. */
 
-      ret = icc_semtrytake(&priv->rxwait);
+      ret = nxsem_trywait(&priv->rxwait);
       if (ret < 0)
         {
           return ret;
@@ -316,7 +301,7 @@ static int icc_recv(struct iccdev_s *priv, iccmsg_t *msg, int32_t ms)
     }
   else if (ms == 0)
     {
-      icc_semtake(&priv->rxwait);
+      nxsem_wait_uninterruptible(&priv->rxwait);
     }
   else
     {
@@ -324,8 +309,7 @@ static int icc_recv(struct iccdev_s *priv, iccmsg_t *msg, int32_t ms)
       timo = ms * 1000 / CONFIG_USEC_PER_TICK;
       wd_start(&priv->rxtimeout, timo, icc_rxtimeout, (wdparm_t)priv);
 
-      icc_semtake(&priv->rxwait);
-
+      nxsem_wait_uninterruptible(&priv->rxwait);
       wd_cancel(&priv->rxtimeout);
     }
 
diff --git a/arch/arm/src/cxd56xx/cxd56_powermgr.c b/arch/arm/src/cxd56xx/cxd56_powermgr.c
index 264d5ad0bc..0d99196233 100644
--- a/arch/arm/src/cxd56xx/cxd56_powermgr.c
+++ b/arch/arm/src/cxd56xx/cxd56_powermgr.c
@@ -27,6 +27,7 @@
 
 #include <nuttx/config.h>
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/mqueue.h>
 #include <nuttx/queue.h>
 
@@ -149,7 +150,6 @@ static int  cxd56_pm_do_callback(uint8_t id,
 static int  cxd56_pm_needcallback(uint32_t target,
                                   struct cxd56_pm_target_id_s *table);
 static void cxd56_pm_clkchange(struct cxd56_pm_message_s *message);
-static int  cxd56_pm_semtake(sem_t *id);
 static void cxd56_pm_checkfreqlock(void);
 static int  cxd56_pm_maintask(int argc, char *argv[]);
 #if defined(CONFIG_CXD56_HOT_SLEEP)
@@ -167,8 +167,8 @@ static int cxd56_pmmsghandler(int cpuid, int protoid, uint32_t pdata,
 static struct cxd56_pm_target_id_s g_target_id_table;
 static struct file g_queuedesc;
 static sem_t       g_bootsync;
-static sem_t       g_regcblock;
-static sem_t       g_freqlock;
+static mutex_t     g_regcblock;
+static mutex_t     g_freqlock;
 static sem_t       g_freqlockwait;
 static dq_queue_t  g_cbqueue;
 static sq_queue_t  g_freqlockqueue;
@@ -179,11 +179,6 @@ static int         g_freqlock_flag;
 static struct pm_cpu_wakelock_s g_wlock =
   PM_CPUWAKELOCK_INIT(PM_CPUWAKELOCK_TAG('P', 'M', 0));
 
-static int cxd56_pm_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -311,13 +306,13 @@ static void cxd56_pm_clkchange(struct cxd56_pm_message_s *message)
       return;
     }
 
-  cxd56_pm_semtake(&g_regcblock);
+  nxmutex_lock(&g_regcblock);
 
   ret = cxd56_pm_do_callback(id, &g_target_id_table);
 
   cxd56_pmsendmsg(mid, ret);
 
-  nxsem_post(&g_regcblock);
+  nxmutex_unlock(&g_regcblock);
 }
 
 static void cxd56_pm_checkfreqlock(void)
@@ -337,7 +332,7 @@ static void cxd56_pm_checkfreqlock(void)
     {
       g_freqlock_flag = flag;
       cxd56_pmsendmsg(MSGID_FREQLOCK, flag);
-      cxd56_pm_semtake(&g_freqlockwait);
+      nxsem_wait_uninterruptible(&g_freqlockwait);
     }
 }
 
@@ -486,12 +481,12 @@ void *cxd56_pm_register_callback(uint32_t target,
 {
   struct pm_cbentry_s *entry = NULL;
 
-  cxd56_pm_semtake(&g_regcblock);
+  nxmutex_lock(&g_regcblock);
 
   entry = (struct pm_cbentry_s *)kmm_malloc(sizeof(struct pm_cbentry_s));
   if (entry == NULL)
     {
-      nxsem_post(&g_regcblock);
+      nxmutex_unlock(&g_regcblock);
       return NULL;
     }
 
@@ -499,19 +494,19 @@ void *cxd56_pm_register_callback(uint32_t target,
   entry->callback = callback;
 
   dq_addlast((dq_entry_t *)entry, &g_cbqueue);
-  nxsem_post(&g_regcblock);
+  nxmutex_unlock(&g_regcblock);
 
   return (void *)entry;
 }
 
 void cxd56_pm_unregister_callback(void *handle)
 {
-  cxd56_pm_semtake(&g_regcblock);
+  nxmutex_lock(&g_regcblock);
 
   dq_rem((dq_entry_t *)handle, &g_cbqueue);
   kmm_free(handle);
 
-  nxsem_post(&g_regcblock);
+  nxmutex_unlock(&g_regcblock);
 }
 
 static int cxd56_pmmsghandler(int cpuid, int protoid, uint32_t pdata,
@@ -583,7 +578,7 @@ void up_pm_acquire_freqlock(struct pm_cpu_freqlock_s *lock)
 
   up_pm_acquire_wakelock(&g_wlock);
 
-  cxd56_pm_semtake(&g_freqlock);
+  nxmutex_lock(&g_freqlock);
 
   if (lock->flag == PM_CPUFREQLOCK_FLAG_HOLD)
     {
@@ -608,8 +603,7 @@ void up_pm_acquire_freqlock(struct pm_cpu_freqlock_s *lock)
 
   lock->count++;
 
-  nxsem_post(&g_freqlock);
-
+  nxmutex_unlock(&g_freqlock);
   up_pm_release_wakelock(&g_wlock);
 }
 
@@ -640,7 +634,7 @@ void up_pm_release_freqlock(struct pm_cpu_freqlock_s *lock)
 
   up_pm_acquire_wakelock(&g_wlock);
 
-  cxd56_pm_semtake(&g_freqlock);
+  nxmutex_lock(&g_freqlock);
 
   for (entry = sq_peek(&g_freqlockqueue); entry; entry = sq_next(entry))
     {
@@ -657,8 +651,7 @@ void up_pm_release_freqlock(struct pm_cpu_freqlock_s *lock)
     }
 
 exit:
-  nxsem_post(&g_freqlock);
-
+  nxmutex_unlock(&g_freqlock);
   up_pm_release_wakelock(&g_wlock);
 }
 
@@ -683,7 +676,7 @@ int up_pm_get_freqlock_count(struct pm_cpu_freqlock_s *lock)
 
   DEBUGASSERT(lock);
 
-  cxd56_pm_semtake(&g_freqlock);
+  nxmutex_lock(&g_freqlock);
 
   for (entry = sq_peek(&g_freqlockqueue); entry; entry = sq_next(entry))
     {
@@ -694,7 +687,7 @@ int up_pm_get_freqlock_count(struct pm_cpu_freqlock_s *lock)
         }
     }
 
-  nxsem_post(&g_freqlock);
+  nxmutex_unlock(&g_freqlock);
   return count;
 }
 
@@ -831,13 +824,13 @@ int cxd56_pm_initialize(void)
   sq_init(&g_freqlockqueue);
   sq_init(&g_wakelockqueue);
 
-  ret = nxsem_init(&g_regcblock, 0, 1);
+  ret = nxmutex_init(&g_regcblock);
   if (ret < 0)
     {
       return ret;
     }
 
-  ret = nxsem_init(&g_freqlock, 0, 1);
+  ret = nxmutex_init(&g_freqlock);
   if (ret < 0)
     {
       return ret;
@@ -867,8 +860,7 @@ int cxd56_pm_initialize(void)
 
   /* wait until cxd56_pm_maintask thread is ready */
 
-  cxd56_pm_semtake(&g_bootsync);
-
+  nxsem_wait_uninterruptible(&g_bootsync);
   return OK;
 }
 
diff --git a/arch/arm/src/cxd56xx/cxd56_scu.c b/arch/arm/src/cxd56xx/cxd56_scu.c
index 31e9812890..d912669e06 100644
--- a/arch/arm/src/cxd56xx/cxd56_scu.c
+++ b/arch/arm/src/cxd56xx/cxd56_scu.c
@@ -26,6 +26,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/irq.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include <inttypes.h>
@@ -186,8 +187,8 @@ struct decimator_s
 
 struct cxd56_scudev_s
 {
-  sem_t syncwait; /* Semaphore for synchronize with SCU firmware */
-  sem_t syncexc;  /* Semaphore for exclusive access to sync */
+  sem_t syncwait;   /* Semaphore for synchronize with SCU firmware */
+  mutex_t synclock; /* Mutex for exclusive access to sync */
 
   /* SCU hardware resource management bitmaps (1 = allocated) */
 
@@ -230,8 +231,6 @@ static int8_t seq_alloc(void);
 static inline void seq_free(int8_t sid);
 static inline int8_t oneshot_alloc(void);
 static inline void oneshot_free(int8_t tid);
-static int seq_semtake(sem_t *id);
-static void seq_semgive(sem_t *id);
 static void seq_fifosetactive(struct seq_s *seq, int fifoid);
 static void seq_fifosetinactive(struct seq_s *seq, int fifoid);
 static int seq_fifoisactive(struct seq_s *seq, int fifoid);
@@ -359,24 +358,6 @@ static const struct coeff_addr_s g_caddrs[3][2] =
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: seq_semtake
- ****************************************************************************/
-
-static int seq_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
-/****************************************************************************
- * Name: seq_semgive
- ****************************************************************************/
-
-static void seq_semgive(sem_t *id)
-{
-  nxsem_post(id);
-}
-
 /****************************************************************************
  * Name: seq_fifosetactive
  ****************************************************************************/
@@ -1083,7 +1064,7 @@ static int seq_oneshot(int bustype, int slave, uint16_t *inst,
 
   /* Wait for one shot is done */
 
-  seq_semtake(&priv->oneshotwait[tid]);
+  nxsem_wait_uninterruptible(&priv->oneshotwait[tid]);
 
   /* Disable interrupt for one shot sequencer */
 
@@ -1451,7 +1432,7 @@ static void seq_sync(struct seq_s *seq, int req)
 {
   struct cxd56_scudev_s *priv = &g_scudev;
 
-  seq_semtake(&priv->syncexc);
+  nxmutex_lock(&priv->synclock);
 
   /* Save current request */
 
@@ -1468,11 +1449,11 @@ static void seq_sync(struct seq_s *seq, int req)
 
   /* Wait for interrupt from SCU firmware */
 
-  seq_semtake(&priv->syncwait);
+  nxsem_wait_uninterruptible(&priv->syncwait);
 
   priv->currentreq = 0;
 
-  seq_semgive(&priv->syncexc);
+  nxmutex_unlock(&priv->synclock);
 }
 
 /****************************************************************************
@@ -1628,7 +1609,7 @@ static void seq_handleoneshot(struct cxd56_scudev_s *priv, uint32_t intr)
         {
           putreg32(bit, SCU_INT_CLEAR_MAIN);
 
-          seq_semgive(&priv->oneshotwait[i]);
+          nxsem_post(&priv->oneshotwait[i]);
         }
     }
 }
@@ -1655,7 +1636,7 @@ static void seq_handleisopdoneintr(struct cxd56_scudev_s *priv,
       putreg32(1 << 27, SCU_INT_DISABLE_MAIN);
       putreg32(1 << 27, SCU_INT_CLEAR_MAIN);
 
-      seq_semgive(&priv->syncwait);
+      nxsem_post(&priv->syncwait);
     }
 }
 
@@ -1754,7 +1735,7 @@ static int seq_scuirqhandler(int irq, void *context, void *arg)
                   tid = out - 1;
 
                   priv->oneshoterr[tid] = -EIO;
-                  seq_semgive(&priv->oneshotwait[tid]);
+                  nxsem_post(&priv->oneshotwait[tid]);
                 }
             }
         }
@@ -2886,7 +2867,7 @@ static void seq_fifodmadone(DMA_HANDLE handle, uint8_t status, void *arg)
 {
   struct scufifo_s *fifo = (struct scufifo_s *)arg;
   fifo->dmaresult = status;
-  seq_semgive(&fifo->dmawait);
+  nxsem_post(&fifo->dmawait);
 }
 #else
 /****************************************************************************
@@ -3045,7 +3026,7 @@ int seq_read(struct seq_s *seq, int fifoid, char *buffer, int length)
 
       /* Wait for DMA is done */
 
-      seq_semtake(&fifo->dmawait);
+      nxsem_wait_uninterruptible(&fifo->dmawait);
       if (fifo->dmaresult)
         {
           /* ERROR */
@@ -3446,7 +3427,7 @@ void scu_initialize(void)
 
   memset(priv, 0, sizeof(struct cxd56_scudev_s));
 
-  nxsem_init(&priv->syncexc, 0, 1);
+  nxmutex_init(&priv->synclock);
   nxsem_init(&priv->syncwait, 0, 0);
   nxsem_set_protocol(&priv->syncwait, SEM_PRIO_NONE);
 
@@ -3520,7 +3501,7 @@ void scu_uninitialize(void)
   cxd56_scuseq_clock_disable();
 
   nxsem_destroy(&priv->syncwait);
-  nxsem_destroy(&priv->syncexc);
+  nxmutex_destroy(&priv->synclock);
 
   for (i = 0; i < 3; i++)
     {
diff --git a/arch/arm/src/cxd56xx/cxd56_sdhci.c b/arch/arm/src/cxd56xx/cxd56_sdhci.c
index e9012f8ab3..9084db6932 100644
--- a/arch/arm/src/cxd56xx/cxd56_sdhci.c
+++ b/arch/arm/src/cxd56xx/cxd56_sdhci.c
@@ -308,8 +308,6 @@ struct cxd56_sdhcregs_s
 
 /* Low-level helpers ********************************************************/
 
-static int  cxd56_takesem(struct cxd56_sdiodev_s *priv);
-#define     cxd56_givesem(priv) (nxsem_post(&(priv)->waitsem))
 static void cxd56_configwaitints(struct cxd56_sdiodev_s *priv,
               uint32_t waitints, sdio_eventset_t waitevents,
               sdio_eventset_t wkupevents);
@@ -484,27 +482,6 @@ static uint32_t cxd56_sdhci_adma_dscr[CXD56_SDIO_MAX_LEN_ADMA_DSCR * 2];
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: cxd56_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SDIO device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int cxd56_takesem(struct cxd56_sdiodev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: cxd56_configwaitints
  *
@@ -1006,7 +983,7 @@ static void cxd56_endwait(struct cxd56_sdiodev_s *priv,
 
   /* Wake up the waiting thread */
 
-  cxd56_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2599,7 +2576,7 @@ static sdio_eventset_t cxd56_sdio_eventwait(struct sdio_dev_s *dev)
        * there will be no wait.
        */
 
-      ret = cxd56_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog (assuming it was started) and
@@ -2641,7 +2618,7 @@ static sdio_eventset_t cxd56_sdio_eventwait(struct sdio_dev_s *dev)
 
   cxd56_configwaitints(priv, 0, 0, 0);
 #ifdef CONFIG_SDIO_DMA
-  priv->xfrflags   = 0;
+  priv->xfrflags = 0;
   if (priv->aligned_buffer)
     {
       if (priv->dma_cmd == MMCSD_CMD17 || priv->dma_cmd == MMCSD_CMD18)
@@ -2655,7 +2632,6 @@ static sdio_eventset_t cxd56_sdio_eventwait(struct sdio_dev_s *dev)
       /* Free aligned buffer */
 
       kmm_free(priv->aligned_buffer);
-
       priv->aligned_buffer = NULL;
     }
 #endif
diff --git a/arch/arm/src/cxd56xx/cxd56_sph.c b/arch/arm/src/cxd56xx/cxd56_sph.c
index 13a13cf9a6..310686d590 100644
--- a/arch/arm/src/cxd56xx/cxd56_sph.c
+++ b/arch/arm/src/cxd56xx/cxd56_sph.c
@@ -78,8 +78,6 @@ struct sph_dev_s
 
 static int sph_open(struct file *filep);
 static int sph_ioctl(struct file *filep, int cmd, unsigned long arg);
-static int sph_semtake(sem_t *id);
-static void sph_semgive(sem_t *id);
 static int sph_lock(struct sph_dev_s *priv);
 static int sph_trylock(struct sph_dev_s *priv);
 static inline int sph_unlock(struct sph_dev_s *priv);
@@ -148,16 +146,6 @@ static int sph_ioctl(struct file *filep, int cmd, unsigned long arg)
   return ret;
 }
 
-static int sph_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
-static void sph_semgive(sem_t *id)
-{
-  nxsem_post(id);
-}
-
 static int sph_lock(struct sph_dev_s *priv)
 {
   uint32_t sts;
@@ -182,7 +170,7 @@ static int sph_lock(struct sph_dev_s *priv)
           sts = getreg32(CXD56_SPH_STS(priv->id));
           if (sph_state_busy(sts))
             {
-              sph_semtake(&priv->wait);
+              nxsem_wait_uninterruptible(&priv->wait);
             }
 
           /* Get latest status for determining locked owner. */
@@ -268,8 +256,7 @@ static int cxd56_sphirqhandler(int irq, void *context, void *arg)
 
   /* Give semaphore for hardware semaphore is locked */
 
-  sph_semgive(&g_sphdev[id].wait);
-
+  nxsem_post(&g_sphdev[id].wait);
   return OK;
 }
 
diff --git a/arch/arm/src/cxd56xx/cxd56_spi.c b/arch/arm/src/cxd56xx/cxd56_spi.c
index 587a8db229..313b73c024 100644
--- a/arch/arm/src/cxd56xx/cxd56_spi.c
+++ b/arch/arm/src/cxd56xx/cxd56_spi.c
@@ -37,7 +37,7 @@
 #include <arch/chip/pm.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -69,7 +69,7 @@ struct cxd56_spidev_s
 #ifdef CONFIG_CXD56_SPI_INTERRUPTS
   uint8_t          spiirq;      /* SPI IRQ number */
 #endif
-  sem_t            exclsem;     /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;        /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;   /* Requested clock frequency */
   uint32_t         actual;      /* Actual clock frequency */
   uint8_t          nbits;       /* Width of word in bits (4 to 16) */
@@ -402,13 +402,13 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      /* Take the semaphore (perhaps waiting) */
+      /* Take the mutex (perhaps waiting) */
 
-      return nxsem_wait_uninterruptible(&priv->exclsem);
+      return nxmutex_lock(&priv->lock);
     }
   else
     {
-      return nxsem_post(&priv->exclsem);
+      return nxmutex_unlock(&priv->lock);
     }
 }
 
@@ -1244,9 +1244,9 @@ struct spi_dev_s *cxd56_spibus_initialize(int port)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
 #ifdef CONFIG_CXD56_SPI3_SCUSEQ
   /* Enable the SPI, but not enable port 3 when SCU support enabled.
diff --git a/arch/arm/src/cxd56xx/cxd56_sysctl.c b/arch/arm/src/cxd56xx/cxd56_sysctl.c
index 06781693f3..d121167b94 100644
--- a/arch/arm/src/cxd56xx/cxd56_sysctl.c
+++ b/arch/arm/src/cxd56xx/cxd56_sysctl.c
@@ -27,6 +27,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/fs/ioctl.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include <stdio.h>
@@ -57,8 +58,6 @@
  ****************************************************************************/
 
 static int  sysctl_ioctl(struct file *filep, int cmd, unsigned long arg);
-static int  sysctl_semtake(sem_t *semid);
-static void sysctl_semgive(sem_t *semid);
 static int  sysctl_rxhandler(int cpuid, int protoid,
                              uint32_t pdata, uint32_t data,
                              void *userdata);
@@ -67,7 +66,7 @@ static int  sysctl_rxhandler(int cpuid, int protoid,
  * Private Data
  ****************************************************************************/
 
-static sem_t g_exc;
+static mutex_t g_lock;
 static sem_t g_sync;
 static int g_errcode = 0;
 
@@ -96,16 +95,6 @@ static int sysctl_ioctl(struct file *filep, int cmd, unsigned long arg)
   return ret;
 }
 
-static int sysctl_semtake(sem_t *semid)
-{
-  return nxsem_wait_uninterruptible(semid);
-}
-
-static void sysctl_semgive(sem_t *semid)
-{
-  nxsem_post(semid);
-}
-
 static int sysctl_rxhandler(int cpuid, int protoid,
                             uint32_t pdata, uint32_t data,
                             void *userdata)
@@ -115,8 +104,7 @@ static int sysctl_rxhandler(int cpuid, int protoid,
 
   g_errcode = (int)data;
 
-  sysctl_semgive(&g_sync);
-
+  nxsem_post(&g_sync);
   return OK;
 }
 
@@ -131,7 +119,7 @@ int cxd56_sysctlcmd(uint8_t id, uint32_t data)
 
   /* Get exclusive access */
 
-  ret = sysctl_semtake(&g_exc);
+  ret = nxmutex_lock(&g_lock);
   if (ret < 0)
     {
       return ret;
@@ -146,17 +134,17 @@ int cxd56_sysctlcmd(uint8_t id, uint32_t data)
   ret = cxd56_iccsend(CXD56_PROTO_SYSCTL, &msg, SYSCTL_TIMEOUT);
   if (ret < 0)
     {
-      sysctl_semgive(&g_exc);
+      nxmutex_unlock(&g_lock);
       _err("Timeout.\n");
       return ret;
     }
 
   /* Wait for reply message from system CPU */
 
-  ret = sysctl_semtake(&g_sync);
+  ret = nxsem_wait_uninterruptible(&g_sync);
   if (ret < 0)
     {
-      sysctl_semgive(&g_exc);
+      nxmutex_unlock(&g_lock);
       return ret;
     }
 
@@ -164,8 +152,7 @@ int cxd56_sysctlcmd(uint8_t id, uint32_t data)
 
   ret = g_errcode;
 
-  sysctl_semgive(&g_exc);
-
+  nxmutex_unlock(&g_lock);
   return ret;
 }
 
@@ -173,7 +160,7 @@ void cxd56_sysctlinitialize(void)
 {
   cxd56_iccinit(CXD56_PROTO_SYSCTL);
 
-  nxsem_init(&g_exc, 0, 1);
+  nxmutex_init(&g_lock);
   nxsem_init(&g_sync, 0, 0);
   nxsem_set_protocol(&g_sync, SEM_PRIO_NONE);
 
diff --git a/arch/arm/src/cxd56xx/cxd56_uart0.c b/arch/arm/src/cxd56xx/cxd56_uart0.c
index bb00f6191e..9b0a2fb1b4 100644
--- a/arch/arm/src/cxd56xx/cxd56_uart0.c
+++ b/arch/arm/src/cxd56xx/cxd56_uart0.c
@@ -27,7 +27,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/irq.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include <stdio.h>
 #include <stdint.h>
@@ -71,8 +71,6 @@ static ssize_t uart0_read(struct file *filep,
                           char *buffer, size_t len);
 static ssize_t uart0_write(struct file *filep,
                            const char *buffer, size_t len);
-static int uart0_semtake(sem_t *id);
-static void uart0_semgive(sem_t *id);
 
 /****************************************************************************
  * FarAPI prototypes
@@ -99,30 +97,12 @@ static const struct file_operations g_uart0fops =
   .write = uart0_write
 };
 
-static sem_t g_lock;
+static mutex_t g_lock;
 
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: uart0_semtake
- ****************************************************************************/
-
-static int uart0_semtake(sem_t *id)
-{
-  return nxsem_wait_uninterruptible(id);
-}
-
-/****************************************************************************
- * Name: uart0_semgive
- ****************************************************************************/
-
-static void uart0_semgive(sem_t *id)
-{
-  nxsem_post(id);
-}
-
 /****************************************************************************
  * Name: uart0_open
  ****************************************************************************/
@@ -218,13 +198,12 @@ static ssize_t uart0_read(struct file *filep,
 {
   int ret;
 
-  uart0_semtake(&g_lock);
+  nxmutex_lock(&g_lock);
 
   ret = fw_pd_uartreceive(0, buffer, len,
                           ((filep->f_oflags & O_NONBLOCK) != 0));
 
-  uart0_semgive(&g_lock);
-
+  nxmutex_unlock(&g_lock);
   return (ssize_t)ret;
 }
 
@@ -237,13 +216,12 @@ static ssize_t uart0_write(struct file *filep,
 {
   int ret;
 
-  uart0_semtake(&g_lock);
+  nxmutex_lock(&g_lock);
 
   ret = fw_pd_uartsend(0, (void *)buffer, len,
                        ((filep->f_oflags & O_NONBLOCK) != 0));
 
-  uart0_semgive(&g_lock);
-
+  nxmutex_unlock(&g_lock);
   return (ssize_t)ret;
 }
 
@@ -255,7 +233,7 @@ int cxd56_uart0initialize(const char *devname)
 {
   int ret;
 
-  nxsem_init(&g_lock, 0, 1);
+  nxmutex_init(&g_lock);
 
   ret = register_driver(devname, &g_uart0fops, 0666, NULL);
   if (ret != 0)
@@ -273,7 +251,7 @@ int cxd56_uart0initialize(const char *devname)
 void cxd56_uart0uninitialize(const char *devname)
 {
   unregister_driver(devname);
-  nxsem_destroy(&g_lock);
+  nxmutex_destroy(&g_lock);
 }
 
 #endif /* CONFIG_CXD56_UART0 */
diff --git a/arch/arm/src/cxd56xx/cxd56_udmac.c b/arch/arm/src/cxd56xx/cxd56_udmac.c
index d8b93f45bf..1d1a89389d 100644
--- a/arch/arm/src/cxd56xx/cxd56_udmac.c
+++ b/arch/arm/src/cxd56xx/cxd56_udmac.c
@@ -33,6 +33,7 @@
 
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include "arm_internal.h"
@@ -67,8 +68,8 @@ struct dma_channel_s
 
 struct dma_controller_s
 {
-  sem_t exclsem; /* Protects channel table */
-  sem_t chansem; /* Count of free channels */
+  mutex_t lock;                 /* Protects channel table */
+  sem_t   chansem;              /* Count of free channels */
 };
 
 /****************************************************************************
@@ -238,7 +239,7 @@ void cxd56_udmainitialize(void)
 
   /* Initialize the channel list  */
 
-  nxsem_init(&g_dmac.exclsem, 0, 1);
+  nxmutex_init(&g_dmac.lock);
   nxsem_init(&g_dmac.chansem, 0, CXD56_DMA_NCHANNELS);
 
   for (i = 0; i < CXD56_DMA_NCHANNELS; i++)
@@ -306,7 +307,7 @@ DMA_HANDLE cxd56_udmachannel(void)
 
   /* Get exclusive access to the DMA channel list */
 
-  ret = nxsem_wait_uninterruptible(&g_dmac.exclsem);
+  ret = nxmutex_lock(&g_dmac.lock);
   if (ret < 0)
     {
       nxsem_post(&g_dmac.chansem);
@@ -332,7 +333,7 @@ DMA_HANDLE cxd56_udmachannel(void)
         }
     }
 
-  nxsem_post(&g_dmac.exclsem);
+  nxmutex_unlock(&g_dmac.lock);
 
   /* Attach DMA interrupt vector */
 
diff --git a/arch/arm/src/efm32/efm32_dma.c b/arch/arm/src/efm32/efm32_dma.c
index 4ab79bceb6..37976b1941 100644
--- a/arch/arm/src/efm32/efm32_dma.c
+++ b/arch/arm/src/efm32/efm32_dma.c
@@ -33,6 +33,7 @@
 
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include "arm_internal.h"
@@ -67,7 +68,7 @@ struct dma_channel_s
 
 struct dma_controller_s
 {
-  sem_t exclsem;                 /* Protects channel table */
+  mutex_t lock;                  /* Protects channel table */
   sem_t chansem;                 /* Count of free channels */
 };
 
@@ -265,7 +266,7 @@ void weak_function arm_dma_initialize(void)
 
   /* Initialize the channel list  */
 
-  nxsem_init(&g_dmac.exclsem, 0, 1);
+  nxmutex_init(&g_dmac.lock);
   nxsem_init(&g_dmac.chansem, 0, EFM32_DMA_NCHANNELS);
 
   for (i = 0; i < EFM32_DMA_NCHANNELS; i++)
@@ -343,7 +344,7 @@ DMA_HANDLE efm32_dmachannel(void)
 
   /* Get exclusive access to the DMA channel list */
 
-  ret = nxsem_wait_uninterruptible(&g_dmac.exclsem);
+  ret = nxmutex_lock(&g_dmac.lock);
   if (ret < 0)
     {
       nxsem_post(&g_dmac.chansem);
@@ -372,7 +373,7 @@ DMA_HANDLE efm32_dmachannel(void)
         }
     }
 
-  nxsem_post(&g_dmac.exclsem);
+  nxmutex_unlock(&g_dmac.lock);
 
   /* Since we have reserved a DMA descriptor by taking a count from chansem,
    * it would be a serious logic failure if we could not find a free channel
diff --git a/arch/arm/src/efm32/efm32_i2c.c b/arch/arm/src/efm32/efm32_i2c.c
index 2889495b08..8538771e2d 100644
--- a/arch/arm/src/efm32/efm32_i2c.c
+++ b/arch/arm/src/efm32/efm32_i2c.c
@@ -53,6 +53,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
 #include <nuttx/clock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -218,7 +219,7 @@ struct efm32_i2c_priv_s
   const struct efm32_i2c_config_s *config;
 
   int refs;                    /* Reference count */
-  sem_t sem_excl;              /* Mutual exclusion semaphore */
+  mutex_t lock;                /* Mutual exclusion mutex */
 #ifndef CONFIG_I2C_POLLED
   sem_t sem_isr;               /* Interrupt wait semaphore */
 #endif
@@ -260,18 +261,12 @@ static inline void efm32_i2c_putreg(struct efm32_i2c_priv_s *priv,
 static inline void efm32_i2c_modifyreg(struct efm32_i2c_priv_s *priv,
                                        uint8_t offset, uint32_t clearbits,
                                        uint32_t setbits);
-static inline int efm32_i2c_sem_wait(struct efm32_i2c_priv_s *priv);
-static int
-efm32_i2c_sem_wait_noncancelable(struct efm32_i2c_priv_s *priv);
 
 #ifdef CONFIG_EFM32_I2C_DYNTIMEO
 static uint32_t efm32_i2c_toticks(int msgc, struct i2c_msg_s *msgs);
 #endif /* CONFIG_EFM32_I2C_DYNTIMEO */
 
 static inline int efm32_i2c_sem_waitdone(struct efm32_i2c_priv_s *priv);
-static inline void efm32_i2c_sem_post(struct efm32_i2c_priv_s *priv);
-static inline void efm32_i2c_sem_init(struct efm32_i2c_priv_s *priv);
-static inline void efm32_i2c_sem_destroy(struct efm32_i2c_priv_s *priv);
 
 #ifdef CONFIG_I2C_TRACE
 static void efm32_i2c_tracereset(struct efm32_i2c_priv_s *priv);
@@ -335,6 +330,10 @@ static struct efm32_i2c_priv_s efm32_i2c0_priv =
   .ops = &efm32_i2c_ops,
   .config = &efm32_i2c0_config,
   .refs = 0,
+  .lock = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .result = I2CRESULT_NONE,
   .msgc = 0,
   .msgv = NULL,
@@ -362,6 +361,10 @@ static struct efm32_i2c_priv_s efm32_i2c1_priv =
   .ops = &efm32_i2c_ops,
   .config = &efm32_i2c1_config,
   .refs = 0,
+  .lock = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .result = I2CRESULT_NONE,
   .msgc = 0,
   .msgv = NULL,
@@ -459,34 +462,6 @@ static const char *efm32_i2c_state_str(int i2c_state)
 }
 #endif
 
-/****************************************************************************
- * Name: efm32_i2c_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.  May be interrupted by
- *   a signal.
- *
- ****************************************************************************/
-
-static inline int efm32_i2c_sem_wait(struct efm32_i2c_priv_s *priv)
-{
-  return nxsem_wait(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: efm32_i2c_sem_wait_noncancelable
- *
- * Description:
- *   Take the exclusive access, waiting as necessary
- *
- ****************************************************************************/
-
-static int
-efm32_i2c_sem_wait_noncancelable(struct efm32_i2c_priv_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->sem_excl);
-}
-
 /****************************************************************************
  * Name: efm32_i2c_toticks
  *
@@ -628,57 +603,6 @@ static inline int efm32_i2c_sem_waitdone(struct efm32_i2c_priv_s *priv)
 }
 #endif
 
-/****************************************************************************
- * Name: efm32_i2c_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void efm32_i2c_sem_post(struct efm32_i2c_priv_s *priv)
-{
-  nxsem_post(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: efm32_i2c_sem_init
- *
- * Description:
- *   Initialize semaphores
- *
- ****************************************************************************/
-
-static inline void efm32_i2c_sem_init(struct efm32_i2c_priv_s *priv)
-{
-  nxsem_init(&priv->sem_excl, 0, 1);
-
-#ifndef CONFIG_I2C_POLLED
-  /* This semaphore is used for signaling and, hence, should not have
-   * priority inheritance enabled.
-   */
-
-  nxsem_init(&priv->sem_isr, 0, 0);
-  nxsem_set_protocol(&priv->sem_isr, SEM_PRIO_NONE);
-#endif
-}
-
-/****************************************************************************
- * Name: efm32_i2c_sem_destroy
- *
- * Description:
- *   Destroy semaphores.
- *
- ****************************************************************************/
-
-static inline void efm32_i2c_sem_destroy(struct efm32_i2c_priv_s *priv)
-{
-  nxsem_destroy(&priv->sem_excl);
-#ifndef CONFIG_I2C_POLLED
-  nxsem_destroy(&priv->sem_isr);
-#endif
-}
-
 /****************************************************************************
  * Name: efm32_i2c_trace*
  *
@@ -1415,7 +1339,7 @@ static int efm32_i2c_transfer(struct i2c_master_s *dev,
 
   /* Ensure that address or flags don't change meanwhile */
 
-  ret = efm32_i2c_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1546,7 +1470,7 @@ static int efm32_i2c_transfer(struct i2c_master_s *dev,
   priv->dcnt = 0;
   priv->ptr = NULL;
 
-  efm32_i2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -1582,7 +1506,7 @@ int efm32_i2c_reset(struct i2c_master_s *dev)
 
   /* Lock out other clients */
 
-  ret = efm32_i2c_sem_wait_noncancelable(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1671,7 +1595,7 @@ out:
 
   /* Release the port for re-use by other clients */
 
-  efm32_i2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_I2C_RESET */
@@ -1721,7 +1645,6 @@ struct i2c_master_s *efm32_i2cbus_initialize(int port)
 
   if ((volatile int)priv->refs++ == 0)
     {
-      efm32_i2c_sem_init(priv);
       efm32_i2c_init(priv);
     }
 
@@ -1765,9 +1688,6 @@ int efm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   efm32_i2c_deinit(priv);
 
-  /* Release unused resources */
-
-  efm32_i2c_sem_destroy(priv);
   return OK;
 }
 
diff --git a/arch/arm/src/efm32/efm32_spi.c b/arch/arm/src/efm32/efm32_spi.c
index 0421e48fb1..a7cc78955e 100644
--- a/arch/arm/src/efm32/efm32_spi.c
+++ b/arch/arm/src/efm32/efm32_spi.c
@@ -35,6 +35,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
 #include <nuttx/clock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/spi/spi.h>
 
@@ -116,7 +117,7 @@ struct efm32_spidev_s
   sem_t txdmasem;            /* Wait for TX DMA to complete */
 #endif
 
-  sem_t exclsem;             /* Supports mutually exclusive access */
+  mutex_t lock;              /* Supports mutually exclusive access */
   uint32_t frequency;        /* Requested clock frequency */
   uint32_t actual;           /* Actual clock frequency */
   uint8_t mode;              /* Mode 0,1,2,3 */
@@ -718,11 +719,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1576,9 +1577,9 @@ static int spi_portinitialize(struct efm32_spidev_s *priv)
 
   spi_putreg(config, EFM32_USART_CMD_OFFSET, USART_CMD_MASTEREN);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
 #ifdef CONFIG_EFM32_SPI_DMA
   /* Allocate two DMA channels... one for the RX and one for the TX side of
diff --git a/arch/arm/src/efm32/efm32_usbhost.c b/arch/arm/src/efm32/efm32_usbhost.c
index 60535480f6..d0db19b06c 100644
--- a/arch/arm/src/efm32/efm32_usbhost.c
+++ b/arch/arm/src/efm32/efm32_usbhost.c
@@ -38,6 +38,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/clock.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/usbhost.h>
@@ -250,7 +251,7 @@ struct efm32_usbhost_s
   volatile bool     connected; /* Connected to device */
   volatile bool     change;    /* Connection change */
   volatile bool     pscwait;   /* True: Thread is waiting for a port event */
-  sem_t             exclsem;   /* Support mutually exclusive access */
+  mutex_t           lock;      /* Support mutually exclusive access */
   sem_t             pscsem;    /* Semaphore to wait for a port event */
   struct efm32_ctrlinfo_s ep0; /* Root hub port EP0 description */
 
@@ -303,11 +304,6 @@ static inline void efm32_modifyreg(uint32_t addr, uint32_t clrbits,
 #  define efm32_pktdump(m,b,n)
 #endif
 
-/* Semaphores ***************************************************************/
-
-static int efm32_takesem(sem_t *sem);
-#define efm32_givesem(s) nxsem_post(s);
-
 /* Byte stream access helper functions **************************************/
 
 static inline uint16_t efm32_getle16(const uint8_t *val);
@@ -746,20 +742,6 @@ static inline void efm32_modifyreg(uint32_t addr, uint32_t clrbits,
   efm32_putreg(addr, (((efm32_getreg(addr)) & ~clrbits) | setbits));
 }
 
-/****************************************************************************
- * Name: efm32_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int efm32_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
 /****************************************************************************
  * Name: efm32_getle16
  *
@@ -1269,7 +1251,7 @@ static void efm32_chan_wakeup(struct efm32_usbhost_s *priv,
                                      USBHOST_VTRACE2_CHANWAKEUP_OUT,
                           chan->epno, chan->result);
 
-          efm32_givesem(&chan->waitsem);
+          nxsem_post(chan->waitsem);
           chan->waiter = false;
         }
 
@@ -2965,7 +2947,7 @@ static void efm32_gint_connected(struct efm32_usbhost_s *priv)
       priv->smstate = SMSTATE_ATTACHED;
       if (priv->pscwait)
         {
-          efm32_givesem(&priv->pscsem);
+          nxsem_post(&priv->pscsem);
           priv->pscwait = false;
         }
     }
@@ -3012,7 +2994,7 @@ static void efm32_gint_disconnected(struct efm32_usbhost_s *priv)
 
       if (priv->pscwait)
         {
-          efm32_givesem(&priv->pscsem);
+          nxsem_post(&priv->pscsem);
           priv->pscwait = false;
         }
     }
@@ -3918,7 +3900,7 @@ static int efm32_wait(struct usbhost_connection_s *conn,
       /* Wait for the next connection event */
 
       priv->pscwait = true;
-      ret = efm32_takesem(&priv->pscsem);
+      ret = nxsem_wait_uninterruptible(&priv->pscsem);
       if (ret < 0)
         {
           return ret;
@@ -4099,7 +4081,7 @@ static int efm32_ep0configure(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4123,7 +4105,7 @@ static int efm32_ep0configure(struct usbhost_driver_s *drvr,
 
   efm32_chan_configure(priv, ep0info->inndx);
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -4166,7 +4148,7 @@ static int efm32_epalloc(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4187,7 +4169,7 @@ static int efm32_epalloc(struct usbhost_driver_s *drvr,
       ret = efm32_xfrep_alloc(priv, epdesc, ep);
     }
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -4220,7 +4202,7 @@ static int efm32_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 
   /* We must have exclusive access to the USB host hardware and structures */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4252,7 +4234,7 @@ static int efm32_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
       kmm_free(ctrlep);
     }
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -4490,7 +4472,7 @@ static int efm32_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
    * structures.
    */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4534,7 +4516,7 @@ static int efm32_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
             {
               /* All success transactions exit here */
 
-              efm32_givesem(&priv->exclsem);
+              nxmutex_unlock(&priv->lock);
               return OK;
             }
 
@@ -4549,7 +4531,7 @@ static int efm32_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
 
   /* All failures exit here after all retries and timeouts are exhausted */
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return -ETIMEDOUT;
 }
 
@@ -4577,7 +4559,7 @@ static int efm32_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
 
   /* We must have exclusive access to the USB host hardware and structures */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4625,7 +4607,7 @@ static int efm32_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
                 {
                   /* All success transactins exit here */
 
-                  efm32_givesem(&priv->exclsem);
+                  nxmutex_unlock(&priv->lock);
                   return OK;
                 }
 
@@ -4641,7 +4623,7 @@ static int efm32_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
 
   /* All failures exit here after all retries and timeouts are exhausted */
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return -ETIMEDOUT;
 }
 
@@ -4698,7 +4680,7 @@ static ssize_t efm32_transfer(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the USB host hardware and structures */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return (ssize_t)ret;
@@ -4715,7 +4697,7 @@ static ssize_t efm32_transfer(struct usbhost_driver_s *drvr,
       nbytes = efm32_out_transfer(priv, chidx, buffer, buflen);
     }
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return nbytes;
 }
 
@@ -4770,7 +4752,7 @@ static int efm32_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
 
   /* We must have exclusive access to the USB host hardware and structures */
 
-  ret = efm32_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -4787,7 +4769,7 @@ static int efm32_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
       ret = efm32_out_asynch(priv, chidx, buffer, buflen, callback, arg);
     }
 
-  efm32_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -4846,7 +4828,7 @@ static int efm32_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 
       /* Wake'em up! */
 
-      efm32_givesem(&chan->waitsem);
+      nxsem_post(&chan->waitsem);
       chan->waiter = false;
     }
 
@@ -4923,7 +4905,7 @@ static int efm32_connect(struct usbhost_driver_s *drvr,
   if (priv->pscwait)
     {
       priv->pscwait = false;
-      efm32_givesem(&priv->pscsem);
+      nxsem_post(&priv->pscsem);
     }
 
   leave_critical_section(flags);
@@ -5277,10 +5259,10 @@ static inline void efm32_sw_initialize(struct efm32_usbhost_s *priv)
 
   usbhost_devaddr_initialize(&priv->rhport);
 
-  /* Initialize semaphores */
+  /* Initialize semaphores & mutex */
 
   nxsem_init(&priv->pscsem,  0, 0);
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* The pscsem semaphore is used for signaling and, hence, should not have
    * priority inheritance enabled.
diff --git a/arch/arm/src/gd32f4/gd32f4xx_dma.c b/arch/arm/src/gd32f4/gd32f4xx_dma.c
index fb374baa25..777e7dfb85 100644
--- a/arch/arm/src/gd32f4/gd32f4xx_dma.c
+++ b/arch/arm/src/gd32f4/gd32f4xx_dma.c
@@ -211,32 +211,6 @@ static void gd32_dma_clock_enable(uint32_t dmabase)
   modifyreg32(regaddr, 0, rcu_en);
 }
 
-/****************************************************************************
- * Name: gd32_dmasem_take
- *
- * Description:
- *   Used to request exclusive access to a DMA channel.
- *
- ****************************************************************************/
-
-static int gd32_dmasem_take(struct gd32_dma_channel_s *dmachan)
-{
-  return nxsem_wait_uninterruptible(&dmachan->chsem);
-}
-
-/****************************************************************************
- * Name: gd32_dmasem_give
- *
- * Description:
- *   Used to free exclusive access to a DMA channel.
- *
- ****************************************************************************/
-
-static inline void gd32_dmasem_give(struct gd32_dma_channel_s *dmachan)
-{
-  nxsem_post(&dmachan->chsem);
-}
-
 /****************************************************************************
  * Name: gd32_dma_channel_get
  *
@@ -647,10 +621,9 @@ DMA_HANDLE gd32_dma_channel_alloc(uint8_t periph_req)
 
   /* Get exclusive access to the DMA channel */
 
-  ret = gd32_dmasem_take(dmachan);
+  ret = nxsem_wait_uninterruptible(&dmachan->chsem);
   if (ret < 0)
     {
-      gd32_dmasem_give(dmachan);
       return NULL;
     }
 
@@ -692,7 +665,7 @@ void gd32_dma_channel_free(DMA_HANDLE handle)
 
   /* Release the channel */
 
-  gd32_dmasem_give(dmachan);
+  nxsem_post(&dmachan->chsem);
 }
 
 /****************************************************************************
diff --git a/arch/arm/src/gd32f4/gd32f4xx_fmc.c b/arch/arm/src/gd32f4/gd32f4xx_fmc.c
index 2716f02b6d..44a35af109 100644
--- a/arch/arm/src/gd32f4/gd32f4xx_fmc.c
+++ b/arch/arm/src/gd32f4/gd32f4xx_fmc.c
@@ -24,7 +24,7 @@
 
 #include <nuttx/config.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include <stdbool.h>
 #include <assert.h>
@@ -41,43 +41,12 @@
  * Private Data
  ****************************************************************************/
 
-static sem_t g_gd32_fmc_sem = SEM_INITIALIZER(1);
+static mutex_t g_gd32_fmc_lock = NXMUTEX_INITIALIZER;
 
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: gd32_fmc_sem_lock
- *
- * Description:
- *   Lock semaphore
- *
- * Return Value:
- *   Zero(OK)  - On success
- *   EINVAL    - Invalid attempt to get the semaphore
- *   ECANCELED - May be returned if the thread is canceled while waiting
- *
- ****************************************************************************/
-
-static int gd32_fmc_sem_lock(void)
-{
-  return nxsem_wait_uninterruptible(&g_gd32_fmc_sem);
-}
-
-/****************************************************************************
- * Name: gd32_fmc_sem_unlock
- *
- * Description:
- *   Lock semaphore
- *
- ****************************************************************************/
-
-static void gd32_fmc_sem_unlock(void)
-{
-  nxsem_post(&g_gd32_fmc_sem);
-}
-
 /****************************************************************************
  * Name: gd32_fmc_state_get
  *
@@ -203,7 +172,7 @@ int gd32_fmc_unlock(void)
 {
   int ret;
 
-  ret = gd32_fmc_sem_lock();
+  ret = nxmutex_lock(&g_gd32_fmc_lock);
   if (ret < 0)
     {
       return ret;
@@ -217,8 +186,7 @@ int gd32_fmc_unlock(void)
       putreg32(FMC_UNLOCK_KEY1, GD32_FMC_KEY);
     }
 
-  gd32_fmc_sem_unlock();
-
+  nxmutex_unlock(&g_gd32_fmc_lock);
   return ret;
 }
 
@@ -234,7 +202,7 @@ int gd32_fmc_lock(void)
 {
   int ret;
 
-  ret = gd32_fmc_sem_lock();
+  ret = nxmutex_lock(&g_gd32_fmc_lock);
   if (ret < 0)
     {
       return ret;
@@ -244,8 +212,7 @@ int gd32_fmc_lock(void)
 
   modifyreg32(GD32_FMC_CTL, 0, FMC_CTL_LK);
 
-  gd32_fmc_sem_unlock();
-
+  nxmutex_unlock(&g_gd32_fmc_lock);
   return ret;
 }
 
diff --git a/arch/arm/src/gd32f4/gd32f4xx_progmem.c b/arch/arm/src/gd32f4/gd32f4xx_progmem.c
index 25c0e52880..19156c7d5a 100644
--- a/arch/arm/src/gd32f4/gd32f4xx_progmem.c
+++ b/arch/arm/src/gd32f4/gd32f4xx_progmem.c
@@ -31,7 +31,7 @@
 #include <arch/board/board.h>
 #include <nuttx/progmem.h>
 #include <nuttx/irq.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include "gd32f4xx_progmem.h"
 #include "gd32f4xx_fmc.h"
@@ -126,7 +126,7 @@ typedef struct
 static const size_t sector_sizes[FMC_PROGMEM_SECTOR_NUM] =
                                                FMC_PROGMEM_SECTOR_SIZES;
 
-static sem_t g_gd32_progmem_sem = SEM_INITIALIZER(1);
+static mutex_t g_gd32_progmem_lock = NXMUTEX_INITIALIZER;
 
 /****************************************************************************
  * Private Function Prototypes
@@ -248,37 +248,6 @@ static fmc_sector_info_struct gd32_fmc_sector_info_get(uint32_t addr)
   return sector_info;
 }
 
-/****************************************************************************
- * Name: gd32_progmem_sem_lock
- *
- * Description:
- *   Lock semaphore
- *
- * Return Value:
- *   Zero(OK)  - On success
- *   EINVAL    - Invalid attempt to get the semaphore
- *   ECANCELED - May be returned if the thread is canceled while waiting
- *
- ****************************************************************************/
-
-static int gd32_progmem_sem_lock(void)
-{
-  return nxsem_wait_uninterruptible(&g_gd32_progmem_sem);
-}
-
-/****************************************************************************
- * Name: gd32_progmem_sem_unlock
- *
- * Description:
- *   Lock semaphore
- *
- ****************************************************************************/
-
-static void gd32_progmem_sem_unlock(void)
-{
-  nxsem_post(&g_gd32_progmem_sem);
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -572,8 +541,7 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
       return -EFAULT;
     }
 
-  ret = gd32_progmem_sem_lock();
-
+  ret = nxmutex_lock(&g_gd32_progmem_lock);
   if (ret < 0)
     {
       return -EFAULT;
@@ -590,7 +558,7 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
       if (getreg8(addr) != *byte)
         {
           gd32_fmc_lock();
-          gd32_progmem_sem_unlock();
+          nxmutex_unlock(&g_gd32_progmem_lock);
           return -EIO;
         }
 
@@ -599,8 +567,7 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
     }
 
   gd32_fmc_lock();
-
-  gd32_progmem_sem_unlock();
+  nxmutex_unlock(&g_gd32_progmem_lock);
 
   return count;
 }
@@ -653,8 +620,7 @@ ssize_t up_progmem_read(size_t addr, void *buf, size_t count)
       return -EFAULT;
     }
 
-  ret = gd32_progmem_sem_lock();
-
+  ret = nxmutex_lock(&g_gd32_progmem_lock);
   if (ret < 0)
     {
       return -EFAULT;
@@ -668,7 +634,7 @@ ssize_t up_progmem_read(size_t addr, void *buf, size_t count)
       addr++;
     }
 
-  gd32_progmem_sem_unlock();
+  nxmutex_unlock(&g_gd32_progmem_lock);
 }
 #endif
 
diff --git a/arch/arm/src/gd32f4/gd32f4xx_spi.c b/arch/arm/src/gd32f4/gd32f4xx_spi.c
index 86cfec3ca4..a9807b8a06 100644
--- a/arch/arm/src/gd32f4/gd32f4xx_spi.c
+++ b/arch/arm/src/gd32f4/gd32f4xx_spi.c
@@ -57,6 +57,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/spi/spi.h>
 
@@ -148,7 +149,7 @@ struct gd32_spidev_s
   uint32_t         spiclock;     /* Clocking for the SPI module */
   uint32_t         frequency;    /* Requested clock frequency */
   uint32_t         actual;       /* Actual clock frequency */
-  sem_t            exclsem;      /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;         /* Held while chip is selected for mutual exclusion */
   uint8_t          nbits;        /* Width of word in bits (8 to 16) */
   uint8_t          mode;         /* Mode 0,1,2,3 */
 #ifdef CONFIG_GD32F4_SPI_INTERRUPT
@@ -1096,11 +1097,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -2111,9 +2112,9 @@ static void spi_bus_initialize(struct gd32_spidev_s *priv)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI lock that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
 #ifdef CONFIG_GD32F4_SPI_DMA
   /* Initialize the SPI semaphores that is used to wait for DMA completion.
diff --git a/arch/arm/src/imx1/imx_spi.c b/arch/arm/src/imx1/imx_spi.c
index 1521fc0b1f..192675048a 100644
--- a/arch/arm/src/imx1/imx_spi.c
+++ b/arch/arm/src/imx1/imx_spi.c
@@ -34,6 +34,7 @@
 #include <nuttx/spi/spi.h>
 
 #include <nuttx/irq.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <arch/board/board.h>
 
@@ -85,7 +86,7 @@ struct imx_spidev_s
 #ifndef CONFIG_SPI_POLLWAIT
   sem_t waitsem;                /* Wait for transfer to complete */
 #endif
-  sem_t exclsem;                /* Supports mutually exclusive access */
+  mutex_t lock;                 /* Supports mutually exclusive access */
 
   /* These following are the source and destination buffers of the transfer.
    * they are retained in this structure so that they will be accessible
@@ -703,11 +704,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1116,7 +1117,7 @@ struct spi_dev_s *imx_spibus_initialize(int port)
   nxsem_init(&priv->waitsem, 0, 0);
   nxsem_set_protocol(&priv->waitsem, SEM_PRIO_NONE);
 #endif
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Initialize control register:
    * min frequency, ignore ready, master mode, mode=0, 8-bit
diff --git a/arch/arm/src/imx6/imx_ecspi.c b/arch/arm/src/imx6/imx_ecspi.c
index cf55b92848..a9bb01eb18 100644
--- a/arch/arm/src/imx6/imx_ecspi.c
+++ b/arch/arm/src/imx6/imx_ecspi.c
@@ -31,6 +31,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/spi/spi.h>
 
@@ -128,7 +129,7 @@ struct imx_spidev_s
 #ifndef CONFIG_SPI_POLLWAIT
   sem_t waitsem;                /* Wait for transfer to complete */
 #endif
-  sem_t exclsem;                /* Supports mutually exclusive access */
+  mutex_t lock;                 /* Supports mutually exclusive access */
 
   /* These following are the source and destination buffers of the transfer.
    * they are retained in this structure so that they will be accessible
@@ -777,11 +778,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1292,7 +1293,7 @@ struct spi_dev_s *imx_spibus_initialize(int port)
   nxsem_init(&priv->waitsem, 0, 0);
   nxsem_set_protocol(&priv->waitsem, SEM_PRIO_NONE);
 #endif
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Initialize control register:
    * min frequency, ignore ready, master mode, mode=0, 8-bit
diff --git a/arch/arm/src/imxrt/imxrt_edma.c b/arch/arm/src/imxrt/imxrt_edma.c
index cb74c81afe..3125b87908 100644
--- a/arch/arm/src/imxrt/imxrt_edma.c
+++ b/arch/arm/src/imxrt/imxrt_edma.c
@@ -57,6 +57,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/queue.h>
 #include <nuttx/spinlock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include "arm_internal.h"
@@ -136,9 +137,9 @@ struct imxrt_dmach_s
 
 struct imxrt_edma_s
 {
-  /* These semaphores protect the DMA channel and descriptor tables */
+  /* These mutex protect the DMA channel and descriptor tables */
 
-  sem_t chsem;                    /* Protects channel table */
+  mutex_t chlock;                 /* Protects channel table */
 #if CONFIG_IMXRT_EDMA_NTCD > 0
   sem_t dsem;                     /* Supports wait for free descriptors */
 #endif
@@ -171,25 +172,6 @@ static struct imxrt_edmatcd_s g_tcd_pool[CONFIG_IMXRT_EDMA_NTCD]
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: imxrt_takechsem() and imxrt_givechsem()
- *
- * Description:
- *   Used to get exclusive access to the DMA channel table for channel
- *   allocation.
- *
- ****************************************************************************/
-
-static int imxrt_takechsem(void)
-{
-  return nxsem_wait_uninterruptible(&g_edma.chsem);
-}
-
-static inline void imxrt_givechsem(void)
-{
-  nxsem_post(&g_edma.chsem);
-}
-
 /****************************************************************************
  * Name: imxrt_takedsem() and imxrt_givedsem()
  *
@@ -764,9 +746,9 @@ void weak_function arm_dma_initialize(void)
       g_edma.dmach[i].chan = i;
     }
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&g_edma.chsem, 0, 1);
+  nxmutex_init(&g_edma.chlock);
 #if CONFIG_IMXRT_EDMA_NTCD > 0
   nxsem_init(&g_edma.dsem, 0, CONFIG_IMXRT_EDMA_NTCD);
 
@@ -880,7 +862,7 @@ DMACH_HANDLE imxrt_dmach_alloc(uint32_t dmamux, uint8_t dchpri)
   /* Search for an available DMA channel */
 
   dmach = NULL;
-  ret = imxrt_takechsem();
+  ret = nxmutex_lock(&g_edma.chlock);
   if (ret < 0)
     {
       return NULL;
@@ -917,7 +899,7 @@ DMACH_HANDLE imxrt_dmach_alloc(uint32_t dmamux, uint8_t dchpri)
         }
     }
 
-  imxrt_givechsem();
+  nxmutex_unlock(&g_edma.chlock);
 
   /* Show the result of the allocation */
 
diff --git a/arch/arm/src/imxrt/imxrt_ehci.c b/arch/arm/src/imxrt/imxrt_ehci.c
index 9a7e0be44c..e91d373c52 100644
--- a/arch/arm/src/imxrt/imxrt_ehci.c
+++ b/arch/arm/src/imxrt/imxrt_ehci.c
@@ -36,6 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/wqueue.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/usbhost.h>
@@ -275,7 +276,7 @@ struct imxrt_ehci_s
 {
   volatile bool pscwait;        /* TRUE: Thread is waiting for port status change event */
 
-  sem_t exclsem;                /* Support mutually exclusive access */
+  mutex_t lock;                 /* Support mutually exclusive access */
   sem_t pscsem;                 /* Semaphore to wait for port status change events */
 
   struct imxrt_epinfo_s ep0;    /* Endpoint 0 */
@@ -416,12 +417,6 @@ static inline void imxrt_putreg(uint32_t regval, volatile uint32_t *regaddr);
 static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
          unsigned int delay);
 
-/* Semaphores ***************************************************************/
-
-static int imxrt_takesem(sem_t *sem);
-static int imxrt_takesem_noncancelable(sem_t *sem);
-#define imxrt_givesem(s) nxsem_post(s);
-
 /* Allocators ***************************************************************/
 
 static struct imxrt_qh_s *imxrt_qh_alloc(void);
@@ -1053,61 +1048,13 @@ static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
   return (regval == donebits) ? OK : -ETIMEDOUT;
 }
 
-/****************************************************************************
- * Name: imxrt_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int imxrt_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: imxrt_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int imxrt_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: imxrt_qh_alloc
  *
  * Description:
  *   Allocate a Queue Head (QH) structure by removing it from the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1133,7 +1080,7 @@ static struct imxrt_qh_s *imxrt_qh_alloc(void)
  * Description:
  *   Free a Queue Head (QH) structure by returning it to the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1154,7 +1101,7 @@ static void imxrt_qh_free(struct imxrt_qh_s *qh)
  *   Allocate a Queue Element Transfer Descriptor (qTD) by removing it from
  *   the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1182,7 +1129,7 @@ static struct imxrt_qtd_s *imxrt_qtd_alloc(void)
  *   free list
  *
  * Assumption:
- *   Caller holds the exclsem
+ *   Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1630,7 +1577,7 @@ static inline uint8_t imxrt_ehci_speed(uint8_t usbspeed)
  *   this to minimize race conditions.  This logic would have to be expanded
  *   if we want to have more than one packet in flight at a time!
  *
- * Assumption:  The caller holds the EHCI exclsem
+ * Assumption:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -1676,7 +1623,7 @@ static int imxrt_ioc_setup(struct imxrt_rhport_s *rhport,
  * Description:
  *   Wait for the IOC event.
  *
- * Assumption:  The caller does *NOT* hold the EHCI exclsem.  That would
+ * Assumption:  The caller does *NOT* hold the EHCI lock.  That would
  * cause a deadlock when the bottom-half, worker thread needs to take the
  * semaphore.
  *
@@ -1692,7 +1639,7 @@ static int imxrt_ioc_wait(struct imxrt_epinfo_s *epinfo)
 
   while (epinfo->iocwait)
     {
-      ret = imxrt_takesem(&epinfo->iocsem);
+      ret = nxsem_wait_uninterruptible(&epinfo->iocsem);
       if (ret < 0)
         {
           break;
@@ -1708,7 +1655,7 @@ static int imxrt_ioc_wait(struct imxrt_epinfo_s *epinfo)
  * Description:
  *   Add a new, ready-to-go QH w/attached qTDs to the asynchronous queue.
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -2155,7 +2102,7 @@ static struct imxrt_qtd_s *imxrt_qtd_statusphase(uint32_t tokenbits)
  *   This is a blocking function; it will not return until the control
  *   transfer has completed.
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2438,7 +2385,7 @@ errout_with_qh:
  *     frame list), followed by shorter poll rates, with queue heads with a
  *     poll rate of one, on the very end."
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2542,8 +2489,8 @@ errout_with_qh:
  * Description:
  *   Wait for an IN or OUT transfer to complete.
  *
- * Assumption:  The caller holds the EHCI exclsem.  The caller must be aware
- *   that the EHCI exclsem will released while waiting for the transfer to
+ * Assumption:  The caller holds the EHCI lock.  The caller must be aware
+ *   that the EHCI lock will released while waiting for the transfer to
  *   complete, but will be re-acquired when before returning.  The state of
  *   EHCI resources could be very different upon return.
  *
@@ -2561,29 +2508,29 @@ static ssize_t imxrt_transfer_wait(struct imxrt_epinfo_s *epinfo)
   int ret;
   int ret2;
 
-  /* Release the EHCI semaphore while we wait.  Other threads need the
+  /* Release the EHCI lock while we wait.  Other threads need the
    * opportunity to access the EHCI resources while we wait.
    *
    * REVISIT:  Is this safe?  NO.  This is a bug and needs rethinking.
    * We need to lock all of the port-resources (not EHCI common) until
-   * the transfer is complete.  But we can't use the common EHCI exclsem
+   * the transfer is complete.  But we can't use the common EHCI lock
    * or we will deadlock while waiting (because the working thread that
-   * wakes this thread up needs the exclsem).
+   * wakes this thread up needs the lock).
    */
 
   /* REVISIT */
 
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Wait for the IOC completion event */
 
   ret = imxrt_ioc_wait(epinfo);
 
-  /* Re-acquire the EHCI semaphore.  The caller expects to be holding
+  /* Re-acquire the EHCI lock.  The caller expects to be holding
    * this upon return.
    */
 
-  ret2 = imxrt_takesem_noncancelable(&g_ehci.exclsem);
+  ret2 = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0 && ret2 < 0)
     {
       ret = ret2;
@@ -2607,9 +2554,7 @@ static ssize_t imxrt_transfer_wait(struct imxrt_epinfo_s *epinfo)
     }
 #endif
 
-  /* Did imxrt_ioc_wait() or imxrt_takesem_noncancelable() report an
-   * error?
-   */
+  /* Did imxrt_ioc_wait() or nxmutex_lock() report an error? */
 
   if (ret < 0)
     {
@@ -2917,7 +2862,7 @@ static int imxrt_qh_ioccheck(struct imxrt_qh_s *qh, uint32_t **bp, void *arg)
           /* Yes... wake it up */
 
           epinfo->iocwait = false;
-          imxrt_givesem(&epinfo->iocsem);
+          nxsem_post(&epinfo->iocsem);
         }
 
 #ifdef CONFIG_USBHOST_ASYNCH
@@ -3076,7 +3021,7 @@ static int imxrt_qh_cancel(struct imxrt_qh_s *qh, uint32_t **bp, void *arg)
  *   detected (actual number of bytes received was less than the expected
  *   number of bytes)."
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -3213,7 +3158,7 @@ static inline void imxrt_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      imxrt_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3253,7 +3198,7 @@ static inline void imxrt_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      imxrt_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3330,7 +3275,7 @@ static void imxrt_ehci_bottomhalf(void *arg)
    * real option (other than to reschedule and delay).
    */
 
-  imxrt_takesem_noncancelable(&g_ehci.exclsem);
+  nxmutex_lock(&g_ehci.lock);
 
   /* Handle all unmasked interrupt sources
    * USB Interrupt (USBINT)
@@ -3441,7 +3386,7 @@ static void imxrt_ehci_bottomhalf(void *arg)
 
   /* We are done with the EHCI structures */
 
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Re-enable relevant EHCI interrupts.  Interrupts should still be enabled
    * at the level of the interrupt controller.
@@ -3600,7 +3545,7 @@ static int imxrt_wait(struct usbhost_connection_s *conn,
        */
 
       g_ehci.pscwait = true;
-      ret = imxrt_takesem(&g_ehci.pscsem);
+      ret = nxsem_wait_uninterruptible(&g_ehci.pscsem);
       if (ret < 0)
         {
           return ret;
@@ -3935,7 +3880,7 @@ static int imxrt_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the EHCI data structures. */
 
-  ret = imxrt_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0)
     {
       /* Remember the new device address and max packet size */
@@ -3944,7 +3889,7 @@ static int imxrt_ep0configure(struct usbhost_driver_s *drvr,
       epinfo->speed     = speed;
       epinfo->maxpacket = maxpacketsize;
 
-      imxrt_givesem(&g_ehci.exclsem);
+      nxmutex_unlock(&g_ehci.lock);
     }
 
   return ret;
@@ -4307,7 +4252,7 @@ static int imxrt_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
    * structures.
    */
 
-  ret = imxrt_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4319,7 +4264,7 @@ static int imxrt_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Now initiate the transfer */
@@ -4334,13 +4279,13 @@ static int imxrt_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   /* And wait for the transfer to complete */
 
   nbytes = imxrt_transfer_wait(ep0info);
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes >= 0 ? OK : (int)nbytes;
 
 errout_with_iocwait:
   ep0info->iocwait = false;
-errout_with_sem:
-  imxrt_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4409,7 +4354,7 @@ static ssize_t imxrt_transfer(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = imxrt_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return (ssize_t)ret;
@@ -4423,7 +4368,7 @@ static ssize_t imxrt_transfer(struct usbhost_driver_s *drvr,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4461,14 +4406,14 @@ static ssize_t imxrt_transfer(struct usbhost_driver_s *drvr,
   /* Then wait for the transfer to complete */
 
   nbytes = imxrt_transfer_wait(epinfo);
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes;
 
 errout_with_iocwait:
   epinfo->iocwait = false;
-errout_with_sem:
+errout_with_lock:
   uerr("!!!\n");
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return (ssize_t)ret;
 }
 
@@ -4523,7 +4468,7 @@ static int imxrt_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * structures.
    */
 
-  ret = imxrt_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4535,7 +4480,7 @@ static int imxrt_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4572,14 +4517,14 @@ static int imxrt_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
 
   /* The transfer is in progress */
 
-  imxrt_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return OK;
 
 errout_with_callback:
   epinfo->callback = NULL;
   epinfo->arg      = NULL;
-errout_with_sem:
-  imxrt_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -4627,7 +4572,7 @@ static int imxrt_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * interrupt level.
    */
 
-  ret = imxrt_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4670,7 +4615,7 @@ static int imxrt_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 #endif
     {
       ret = OK;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Handle the cancellation according to the type of the transfer */
@@ -4733,7 +4678,7 @@ static int imxrt_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
       default:
         usbhost_trace1(EHCI_TRACE1_BADXFRTYPE, epinfo->xfrtype);
         ret = -ENOSYS;
-        goto errout_with_sem;
+        goto errout_with_lock;
     }
 
   /* Find and remove the QH.  There are four possibilities:
@@ -4763,7 +4708,7 @@ exit_terminate:
       /* Yes... wake it up */
 
       DEBUGASSERT(callback == NULL);
-      imxrt_givesem(&epinfo->iocsem);
+      nxsem_post(&epinfo->iocsem);
     }
 
   /* No.. Is there a pending asynchronous transfer? */
@@ -4778,11 +4723,11 @@ exit_terminate:
 #else
   /* Wake up the waiting thread */
 
-  imxrt_givesem(&epinfo->iocsem);
+  nxsem_post(&epinfo->iocsem);
 #endif
 
-errout_with_sem:
-  imxrt_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4829,7 +4774,7 @@ static int imxrt_connect(struct usbhost_driver_s *drvr,
   if (g_ehci.pscwait)
     {
       g_ehci.pscwait = false;
-      imxrt_givesem(&g_ehci.pscsem);
+      nxsem_post(&g_ehci.pscsem);
     }
 
   leave_critical_section(flags);
@@ -5055,7 +5000,7 @@ struct usbhost_connection_s *imxrt_ehci_initialize(int controller)
 
   /* Initialize the EHCI state data structure */
 
-  nxsem_init(&g_ehci.exclsem, 0, 1);
+  nxmutex_init(&g_ehci.lock);
   nxsem_init(&g_ehci.pscsem, 0, 0);
 
   /* The pscsem semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/imxrt/imxrt_enc.c b/arch/arm/src/imxrt/imxrt_enc.c
index 5a8f49a487..92ed32915d 100644
--- a/arch/arm/src/imxrt/imxrt_enc.c
+++ b/arch/arm/src/imxrt/imxrt_enc.c
@@ -32,7 +32,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
 #include <nuttx/sensors/qencoder.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include "chip.h"
 #include "arm_internal.h"
@@ -302,7 +302,7 @@ struct imxrt_enc_lowerhalf_s
 
   const struct imxrt_qeconfig_s *config;  /* static configuration */
   struct qe_index_s *data;
-  sem_t sem_excl;                         /* Mutual exclusion semaphore to
+  mutex_t lock;                           /* Mutual exclusion mutex to
                                            * ensure atomic 32-bit reads.
                                            */
 };
@@ -324,10 +324,6 @@ static inline void imxrt_enc_modifyreg16
 static void imxrt_enc_clock_enable (uint32_t base);
 static void imxrt_enc_clock_disable (uint32_t base);
 
-static inline int imxrt_enc_sem_wait(struct imxrt_enc_lowerhalf_s *priv);
-static inline void imxrt_enc_sem_post
-                    (struct imxrt_enc_lowerhalf_s *priv);
-
 static int imxrt_enc_reconfig(struct imxrt_enc_lowerhalf_s *priv,
                               uint16_t args);
 static void imxrt_enc_set_initial_val(struct imxrt_enc_lowerhalf_s *priv,
@@ -635,32 +631,6 @@ void imxrt_enc_clock_disable(uint32_t base)
 #endif /* CONFIG_ARCH_FAMILY_IMXRT105x || CONFIG_ARCH_FAMILY_IMXRT106x */
 }
 
-/****************************************************************************
- * Name: imxrt_enc_sem_wait
- *
- * Description:
- *   Take exclusive access to the position register, waiting as necessary
- *
- ****************************************************************************/
-
-static inline int imxrt_enc_sem_wait(struct imxrt_enc_lowerhalf_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: imxrt_enc_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void imxrt_enc_sem_post(struct imxrt_enc_lowerhalf_s *priv)
-{
-  nxsem_post(&priv->sem_excl);
-}
-
 /****************************************************************************
  * Name: imxrt_enc_reconfig
  *
@@ -939,7 +909,7 @@ static int imxrt_setup(struct qe_lowerhalf_s *lower)
   uint32_t regval;
   int ret;
 
-  ret = imxrt_enc_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1003,8 +973,7 @@ static int imxrt_setup(struct qe_lowerhalf_s *lower)
   regval = ((config->init_flags >> MOD_SHIFT) & 1) ? ENC_CTRL2_MOD : 0;
   imxrt_enc_putreg16(priv, IMXRT_ENC_CTRL2_OFFSET, regval);
 
-  imxrt_enc_sem_post(priv);
-
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -1026,7 +995,7 @@ static int imxrt_shutdown(struct qe_lowerhalf_s *lower)
 
   /* Ensure any in-progress operations are done. */
 
-  ret = imxrt_enc_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1059,7 +1028,7 @@ static int imxrt_shutdown(struct qe_lowerhalf_s *lower)
 
   imxrt_enc_clock_disable(priv->config->base);
 
-  imxrt_enc_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
@@ -1080,7 +1049,7 @@ static int imxrt_position(struct qe_lowerhalf_s *lower, int32_t *pos)
   int i;
   int ret;
 
-  ret = imxrt_enc_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1107,13 +1076,13 @@ static int imxrt_position(struct qe_lowerhalf_s *lower, int32_t *pos)
 
   if (lpos != imxrt_enc_getreg16(priv, IMXRT_ENC_LPOSH_OFFSET))
     {
-      imxrt_enc_sem_post(priv);
+      nxmutex_unlock(&priv->lock);
       return -EAGAIN;
     }
 
   upos = imxrt_enc_getreg16(priv, IMXRT_ENC_UPOSH_OFFSET);
 
-  imxrt_enc_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
 
   *pos = (int32_t)((upos << 16) | lpos);
   return OK;
@@ -1135,14 +1104,14 @@ static int imxrt_reset(struct qe_lowerhalf_s *lower)
 
   /* Write a 1 to the SWIP bit to load UINIT and LINIT into UPOS and LPOS */
 
-  ret = imxrt_enc_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
     }
 
   imxrt_enc_modifyreg16(priv, IMXRT_ENC_CTRL_OFFSET, 0, ENC_CTRL_SWIP);
-  imxrt_enc_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
@@ -1258,7 +1227,7 @@ int imxrt_qeinitialize(const char *devpath, int enc)
 
   /* Initialize private data */
 
-  nxsem_init(&priv->sem_excl, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Register the upper-half driver */
 
diff --git a/arch/arm/src/imxrt/imxrt_flexspi.c b/arch/arm/src/imxrt/imxrt_flexspi.c
index 7c836af4fe..60473461d5 100644
--- a/arch/arm/src/imxrt/imxrt_flexspi.c
+++ b/arch/arm/src/imxrt/imxrt_flexspi.c
@@ -39,7 +39,7 @@
 #include <nuttx/wdog.h>
 #include <nuttx/clock.h>
 #include <nuttx/kmalloc.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "barriers.h"
@@ -71,7 +71,7 @@ struct imxrt_flexspidev_s
 
   bool initialized;            /* TRUE: Controller has been initialized */
 
-  sem_t exclsem;               /* Assures mutually exclusive access to
+  mutex_t lock;                /* Assures mutually exclusive access to
                                 * FlexSPI */
 };
 
@@ -1104,11 +1104,11 @@ static int imxrt_flexspi_lock(struct flexspi_dev_s *dev, bool lock)
   spiinfo("lock=%d\n", lock);
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1268,11 +1268,11 @@ struct flexspi_dev_s *imxrt_flexspi_initialize(int intf)
     {
       /* No perform one time initialization */
 
-      /* Initialize the FlexSPI semaphore that enforces mutually exclusive
+      /* Initialize the FlexSPI mutex that enforces mutually exclusive
        * access to the FlexSPI registers.
        */
 
-      nxsem_init(&priv->exclsem, 0, 1);
+      nxmutex_init(&priv->lock);
 
       /* Perform hardware initialization. Puts the FlexSPI into an active
        * state.
diff --git a/arch/arm/src/imxrt/imxrt_lpi2c.c b/arch/arm/src/imxrt/imxrt_lpi2c.c
index 1c968b134d..6cc97bbac7 100644
--- a/arch/arm/src/imxrt/imxrt_lpi2c.c
+++ b/arch/arm/src/imxrt/imxrt_lpi2c.c
@@ -37,6 +37,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
 #include <nuttx/clock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -192,7 +193,7 @@ struct imxrt_lpi2c_priv_s
   const struct imxrt_lpi2c_config_s *config;
 
   int refs;                    /* Reference count */
-  sem_t sem_excl;              /* Mutual exclusion semaphore */
+  mutex_t lock;                /* Mutual exclusion mutex */
 #ifndef CONFIG_I2C_POLLED
   sem_t sem_isr;               /* Interrupt wait semaphore */
 #endif
@@ -235,11 +236,6 @@ static inline void imxrt_lpi2c_putreg(struct imxrt_lpi2c_priv_s *priv,
 static inline void imxrt_lpi2c_modifyreg(struct imxrt_lpi2c_priv_s *priv,
                                          uint16_t offset, uint32_t clearbits,
                                          uint32_t setbits);
-static inline int imxrt_lpi2c_sem_wait(struct imxrt_lpi2c_priv_s *priv);
-#ifdef CONFIG_I2C_RESET
-static int
-imxrt_lpi2c_sem_wait_noncancelable(struct imxrt_lpi2c_priv_s *priv);
-#endif
 
 #ifdef CONFIG_IMXRT_LPI2C_DYNTIMEO
 static uint32_t imxrt_lpi2c_toticks(int msgc, struct i2c_msg_s *msgs);
@@ -249,12 +245,6 @@ static inline int
 imxrt_lpi2c_sem_waitdone(struct imxrt_lpi2c_priv_s *priv);
 static inline void
 imxrt_lpi2c_sem_waitstop(struct imxrt_lpi2c_priv_s *priv);
-static inline void
-imxrt_lpi2c_sem_post(struct imxrt_lpi2c_priv_s *priv);
-static inline void
-imxrt_lpi2c_sem_init(struct imxrt_lpi2c_priv_s *priv);
-static inline void
-imxrt_lpi2c_sem_destroy(struct imxrt_lpi2c_priv_s *priv);
 
 #ifdef CONFIG_I2C_TRACE
 static void imxrt_lpi2c_tracereset(struct imxrt_lpi2c_priv_s *priv);
@@ -363,6 +353,10 @@ static struct imxrt_lpi2c_priv_s imxrt_lpi2c1_priv =
   .ops           = &imxrt_lpi2c_ops,
   .config        = &imxrt_lpi2c1_config,
   .refs          = 0,
+  .lock          = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate      = INTSTATE_IDLE,
   .msgc          = 0,
   .msgv          = NULL,
@@ -404,6 +398,10 @@ static struct imxrt_lpi2c_priv_s imxrt_lpi2c2_priv =
   .ops           = &imxrt_lpi2c_ops,
   .config        = &imxrt_lpi2c2_config,
   .refs          = 0,
+  .lock          = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate      = INTSTATE_IDLE,
   .msgc          = 0,
   .msgv          = NULL,
@@ -445,6 +443,10 @@ static struct imxrt_lpi2c_priv_s imxrt_lpi2c3_priv =
   .ops           = &imxrt_lpi2c_ops,
   .config        = &imxrt_lpi2c3_config,
   .refs          = 0,
+  .lock          = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate      = INTSTATE_IDLE,
   .msgc          = 0,
   .msgv          = NULL,
@@ -486,6 +488,10 @@ static struct imxrt_lpi2c_priv_s imxrt_lpi2c4_priv =
   .ops           = &imxrt_lpi2c_ops,
   .config        = &imxrt_lpi2c4_config,
   .refs          = 0,
+  .lock          = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .intstate      = INTSTATE_IDLE,
   .msgc          = 0,
   .msgv          = NULL,
@@ -543,36 +549,6 @@ static inline void imxrt_lpi2c_modifyreg(struct imxrt_lpi2c_priv_s *priv,
   modifyreg32(priv->config->base + offset, clearbits, setbits);
 }
 
-/****************************************************************************
- * Name: imxrt_lpi2c_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.  May be interrupted by
- *   a signal.
- *
- ****************************************************************************/
-
-static inline int imxrt_lpi2c_sem_wait(struct imxrt_lpi2c_priv_s *priv)
-{
-  return nxsem_wait(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: imxrt_lpi2c_sem_wait_noncancelable
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_I2C_RESET
-static int
-imxrt_lpi2c_sem_wait_noncancelable(struct imxrt_lpi2c_priv_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->sem_excl);
-}
-#endif
-
 /****************************************************************************
  * Name: imxrt_lpi2c_toticks
  *
@@ -856,58 +832,6 @@ imxrt_lpi2c_sem_waitstop(struct imxrt_lpi2c_priv_s *priv)
   i2cinfo("Timeout with Status Register: %" PRIx32 "\n", regval);
 }
 
-/****************************************************************************
- * Name: imxrt_lpi2c_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void imxrt_lpi2c_sem_post(struct imxrt_lpi2c_priv_s *priv)
-{
-  nxsem_post(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: imxrt_lpi2c_sem_init
- *
- * Description:
- *   Initialize semaphores
- *
- ****************************************************************************/
-
-static inline void imxrt_lpi2c_sem_init(struct imxrt_lpi2c_priv_s *priv)
-{
-  nxsem_init(&priv->sem_excl, 0, 1);
-
-#ifndef CONFIG_I2C_POLLED
-  /* This semaphore is used for signaling and, hence, should not have
-   * priority inheritance enabled.
-   */
-
-  nxsem_init(&priv->sem_isr, 0, 0);
-  nxsem_set_protocol(&priv->sem_isr, SEM_PRIO_NONE);
-#endif
-}
-
-/****************************************************************************
- * Name: imxrt_lpi2c_sem_destroy
- *
- * Description:
- *   Destroy semaphores.
- *
- ****************************************************************************/
-
-static inline void
-imxrt_lpi2c_sem_destroy(struct imxrt_lpi2c_priv_s *priv)
-{
-  nxsem_destroy(&priv->sem_excl);
-#ifndef CONFIG_I2C_POLLED
-  nxsem_destroy(&priv->sem_isr);
-#endif
-}
-
 /****************************************************************************
  * Name: imxrt_dma_callback
  *
@@ -915,6 +839,7 @@ imxrt_lpi2c_sem_destroy(struct imxrt_lpi2c_priv_s *priv)
  *   This function performs the next I2C operation
  *
  ****************************************************************************/
+
 #ifdef CONFIG_IMXRT_LPI2C_DMA
 static void imxrt_dma_callback(DMACH_HANDLE handle, void *arg, bool done,
                               int result)
@@ -2077,7 +2002,7 @@ static int imxrt_lpi2c_transfer(struct i2c_master_s *dev,
 
   /* Ensure that address or flags don't change meanwhile */
 
-  ret = imxrt_lpi2c_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2178,7 +2103,7 @@ static int imxrt_lpi2c_transfer(struct i2c_master_s *dev,
   priv->dcnt = 0;
   priv->ptr = NULL;
 
-  imxrt_lpi2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2215,7 +2140,7 @@ static int imxrt_lpi2c_reset(struct i2c_master_s *dev)
 
   /* Lock out other clients */
 
-  ret = imxrt_lpi2c_sem_wait_noncancelable(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2313,7 +2238,7 @@ out:
 
   /* Release the port for re-use by other clients */
 
-  imxrt_lpi2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_I2C_RESET */
@@ -2371,7 +2296,6 @@ struct i2c_master_s *imxrt_i2cbus_initialize(int port)
 
   if ((volatile int)priv->refs++ == 0)
     {
-      imxrt_lpi2c_sem_init(priv);
       imxrt_lpi2c_init(priv);
 
 #ifdef CONFIG_IMXRT_LPI2C_DMA
@@ -2434,9 +2358,6 @@ int imxrt_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   imxrt_lpi2c_deinit(priv);
 
-  /* Release unused resources */
-
-  imxrt_lpi2c_sem_destroy(priv);
   return OK;
 }
 
diff --git a/arch/arm/src/imxrt/imxrt_lpspi.c b/arch/arm/src/imxrt/imxrt_lpspi.c
index cdc32c3294..79a445bf0c 100644
--- a/arch/arm/src/imxrt/imxrt_lpspi.c
+++ b/arch/arm/src/imxrt/imxrt_lpspi.c
@@ -59,7 +59,7 @@
 
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include <arch/board/board.h>
@@ -112,7 +112,7 @@ struct imxrt_lpspidev_s
 #ifdef CONFIG_IMXRT_LPSPI_INTERRUPTS
   uint8_t spiirq;             /* SPI IRQ number */
 #endif
-  sem_t exclsem;              /* Held while chip is selected for mutual exclusion */
+  mutex_t lock;               /* Held while chip is selected for mutual exclusion */
   uint32_t frequency;         /* Requested clock frequency */
   uint32_t actual;            /* Actual clock frequency */
   int8_t nbits;               /* Width of word in bits */
@@ -883,11 +883,11 @@ static int imxrt_lpspi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1711,9 +1711,9 @@ static void imxrt_lpspi_bus_initialize(struct imxrt_lpspidev_s *priv)
 
   imxrt_lpspi_setmode((struct spi_dev_s *)priv, SPIDEV_MODE0);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Enable LPSPI */
 
diff --git a/arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c b/arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c
index a9415697bf..bbf765f8f9 100644
--- a/arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c
+++ b/arch/arm/src/imxrt/imxrt_rtc_lowerhalf.c
@@ -32,6 +32,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/timers/rtc.h>
 
 #include "arm_internal.h"
@@ -61,7 +62,7 @@ struct imxrt_lowerhalf_s
    * this file.
    */
 
-  sem_t devsem;                     /* Threads can only exclusively access the RTC */
+  mutex_t devlock;                  /* Threads can only exclusively access the RTC */
 
 #ifdef CONFIG_RTC_ALARM
   /* Alarm callback information */
@@ -297,10 +298,10 @@ static int imxrt_setalarm(struct rtc_lowerhalf_s *lower,
 
   /* Get exclusive access to the alarm */
 
-  ret = nxsem_wait(&rtc->devsem);
+  ret = nxmutex_lock(&rtc->devlock);
   if (ret < 0)
     {
-      rtcerr("ERROR: nxsem_wait failed: %d\n", ret);
+      rtcerr("ERROR: nxmutex_lock failed: %d\n", ret);
       return ret;
     }
 
@@ -329,7 +330,7 @@ static int imxrt_setalarm(struct rtc_lowerhalf_s *lower,
         }
     }
 
-  nxsem_post(&rtc->devsem);
+  nxmutex_unlock(&rtc->devlock);
   return ret;
 }
 #endif
@@ -364,10 +365,10 @@ static int imxrt_setrelative(struct rtc_lowerhalf_s *lower,
 
   /* Get exclusive access to the alarm */
 
-  ret = nxsem_wait(&rtc->devsem);
+  ret = nxmutex_lock(&rtc->devlock);
   if (ret < 0)
     {
-      rtcerr("ERROR: nxsem_wait failed: %d\n", ret);
+      rtcerr("ERROR: nxmutex_lock failed: %d\n", ret);
       return ret;
     }
 
@@ -402,7 +403,7 @@ static int imxrt_setrelative(struct rtc_lowerhalf_s *lower,
         }
     }
 
-  nxsem_post(&rtc->devsem);
+  nxmutex_unlock(&rtc->devlock);
   return ret;
 }
 #endif
@@ -513,8 +514,7 @@ static int imxrt_rdalarm(struct rtc_lowerhalf_s *lower,
 
 struct rtc_lowerhalf_s *imxrt_rtc_lowerhalf(void)
 {
-  nxsem_init(&g_rtc_lowerhalf.devsem, 0, 1);
-
+  nxmutex_init(&g_rtc_lowerhalf.devlock);
   return (struct rtc_lowerhalf_s *)&g_rtc_lowerhalf;
 }
 
diff --git a/arch/arm/src/imxrt/imxrt_usdhc.c b/arch/arm/src/imxrt/imxrt_usdhc.c
index 3f39b06af3..2546421229 100644
--- a/arch/arm/src/imxrt/imxrt_usdhc.c
+++ b/arch/arm/src/imxrt/imxrt_usdhc.c
@@ -246,8 +246,6 @@ struct imxrt_sdhcregs_s
 
 /* Low-level helpers ********************************************************/
 
-static int  imxrt_takesem(struct imxrt_dev_s *priv);
-#define     imxrt_givesem(priv) (nxsem_post(&priv->waitsem))
 static void imxrt_configwaitints(struct imxrt_dev_s *priv, uint32_t waitints,
               sdio_eventset_t waitevents, sdio_eventset_t wkupevents);
 static void imxrt_configxfrints(struct imxrt_dev_s *priv, uint32_t xfrints);
@@ -497,27 +495,6 @@ static struct imxrt_sdhcregs_s g_sampleregs[DEBUG_NSAMPLES];
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: imxrt_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SDIO device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int imxrt_takesem(struct imxrt_dev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: imxrt_configwaitints
  *
@@ -1150,7 +1127,7 @@ static void imxrt_endwait(struct imxrt_dev_s *priv,
 
   /* Wake up the waiting thread */
 
-  imxrt_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2818,7 +2795,7 @@ static sdio_eventset_t imxrt_eventwait(struct sdio_dev_s *dev)
        * incremented and there will be no wait.
        */
 
-      ret = imxrt_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog (assuming it was started) and
diff --git a/arch/arm/src/kinetis/kinetis_edma.c b/arch/arm/src/kinetis/kinetis_edma.c
index 2785e72ec4..f513d28ba2 100644
--- a/arch/arm/src/kinetis/kinetis_edma.c
+++ b/arch/arm/src/kinetis/kinetis_edma.c
@@ -59,6 +59,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/queue.h>
 #include <nuttx/spinlock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include "arm_internal.h"
@@ -138,9 +139,9 @@ struct kinetis_dmach_s
 
 struct kinetis_edma_s
 {
-  /* These semaphores protect the DMA channel and descriptor tables */
+  /* These mutex protect the DMA channel and descriptor tables */
 
-  sem_t chsem;                    /* Protects channel table */
+  mutex_t chlock;                 /* Protects channel table */
 #if CONFIG_KINETIS_EDMA_NTCD > 0
   sem_t dsem;                     /* Supports wait for free descriptors */
 #endif
@@ -173,25 +174,6 @@ static struct kinetis_edmatcd_s g_tcd_pool[CONFIG_KINETIS_EDMA_NTCD]
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: kinetis_takechsem() and kinetis_givechsem()
- *
- * Description:
- *   Used to get exclusive access to the DMA channel table for channel
- *   allocation.
- *
- ****************************************************************************/
-
-static int kinetis_takechsem(void)
-{
-  return nxsem_wait_uninterruptible(&g_edma.chsem);
-}
-
-static inline void kinetis_givechsem(void)
-{
-  nxsem_post(&g_edma.chsem);
-}
-
 /****************************************************************************
  * Name: kinetis_takedsem() and kinetis_givedsem()
  *
@@ -745,9 +727,9 @@ void weak_function arm_dma_initialize(void)
       g_edma.dmach[i].chan = i;
     }
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphore */
 
-  nxsem_init(&g_edma.chsem, 0, 1);
+  nxmutex_init(&g_edma.chlock);
 #if CONFIG_KINETIS_EDMA_NTCD > 0
   nxsem_init(&g_edma.dsem, 0, CONFIG_KINETIS_EDMA_NTCD);
 
@@ -857,7 +839,7 @@ DMACH_HANDLE kinetis_dmach_alloc(uint8_t dmamux, uint8_t dchpri)
   /* Search for an available DMA channel */
 
   dmach = NULL;
-  ret = kinetis_takechsem();
+  ret = nxmutex_lock(&g_edma.chlock);
   if (ret < 0)
     {
       return NULL;
@@ -894,7 +876,7 @@ DMACH_HANDLE kinetis_dmach_alloc(uint8_t dmamux, uint8_t dchpri)
         }
     }
 
-  kinetis_givechsem();
+  nxmutex_unlock(&g_edma.chlock);
 
   /* Show the result of the allocation */
 
diff --git a/arch/arm/src/kinetis/kinetis_i2c.c b/arch/arm/src/kinetis/kinetis_i2c.c
index 6cac05ce2e..14da11ac21 100644
--- a/arch/arm/src/kinetis/kinetis_i2c.c
+++ b/arch/arm/src/kinetis/kinetis_i2c.c
@@ -35,6 +35,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -112,7 +113,7 @@ struct kinetis_i2cdev_s
   int      refs;              /* Reference count */
   volatile uint8_t state;     /* State of state machine */
   bool restart;               /* Should next transfer restart or not */
-  sem_t mutex;                /* Only one thread can access at a time */
+  mutex_t lock;               /* Only one thread can access at a time */
   sem_t wait;                 /* Place to wait for state machine completion */
   struct wdog_s timeout;      /* watchdog to timeout when bus hung */
   struct i2c_msg_s *msgs;     /* Remaining transfers - first one is in
@@ -130,20 +131,6 @@ static uint8_t kinetis_i2c_getreg(struct kinetis_i2cdev_s *priv,
 static void kinetis_i2c_putreg(struct kinetis_i2cdev_s *priv,
                                uint8_t value, uint8_t offset);
 
-/* Exclusion Helpers */
-
-static inline void kinetis_i2c_sem_init(struct kinetis_i2cdev_s *priv);
-static inline void
-kinetis_i2c_sem_destroy(struct kinetis_i2cdev_s *priv);
-static inline int kinetis_i2c_sem_wait(struct kinetis_i2cdev_s *priv);
-
-#ifdef CONFIG_I2C_RESET
-static int
-kinetis_i2c_sem_wait_noncancelable(struct kinetis_i2cdev_s *priv);
-#endif
-
-static inline void kinetis_i2c_sem_post(struct kinetis_i2cdev_s *priv);
-
 /* Signal Helper */
 
 static inline void kinetis_i2c_endwait(struct kinetis_i2cdev_s *priv);
@@ -203,6 +190,8 @@ static struct kinetis_i2cdev_s g_i2c0_dev =
   .dev.ops    = &kinetis_i2c_ops,
   .config     = &kinetis_i2c0_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+  .wait       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .state      = STATE_OK,
   .msgs       = NULL,
 };
@@ -224,6 +213,8 @@ static struct kinetis_i2cdev_s g_i2c1_dev =
   .dev.ops    = &kinetis_i2c_ops,
   .config     = &kinetis_i2c1_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+  .wait       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .state      = STATE_OK,
   .msgs       = NULL,
 };
@@ -245,6 +236,8 @@ static struct kinetis_i2cdev_s g_i2c2_dev =
   .dev.ops    = &kinetis_i2c_ops,
   .config     = &kinetis_i2c2_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+  .wait       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .state      = STATE_OK,
   .msgs       = NULL,
 };
@@ -266,6 +259,8 @@ static struct kinetis_i2cdev_s g_i2c3_dev =
   .dev.ops    = &kinetis_i2c_ops,
   .config     = &kinetis_i2c3_config,
   .refs       = 0,
+  .lock       = NXMUTEX_INITIALIZER,
+  .wait       = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .state      = STATE_OK,
   .msgs       = NULL,
 };
@@ -303,83 +298,6 @@ static void kinetis_i2c_putreg(struct kinetis_i2cdev_s *priv, uint8_t value,
   putreg8(value, priv->config->base + offset);
 }
 
-/****************************************************************************
- * Name: kinetis_i2c_sem_init
- *
- * Description:
- *   Initialize semaphores
- *
- ****************************************************************************/
-
-static inline void kinetis_i2c_sem_init(struct kinetis_i2cdev_s *priv)
-{
-  nxsem_init(&priv->mutex, 0, 1);
-
-  /* This semaphore is used for signaling and, hence, should not have
-   * priority inheritance enabled.
-   */
-
-  nxsem_init(&priv->wait, 0, 0);
-  nxsem_set_protocol(&priv->wait, SEM_PRIO_NONE);
-}
-
-/****************************************************************************
- * Name: kinetis_i2c_sem_destroy
- *
- * Description:
- *   Destroy semaphores.
- *
- ****************************************************************************/
-
-static inline void kinetis_i2c_sem_destroy(struct kinetis_i2cdev_s *priv)
-{
-  nxsem_destroy(&priv->mutex);
-  nxsem_destroy(&priv->wait);
-}
-
-/****************************************************************************
- * Name: kinetis_i2c_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.  May be interrupted by
- *   a signal.
- *
- ****************************************************************************/
-
-static inline int kinetis_i2c_sem_wait(struct kinetis_i2cdev_s *priv)
-{
-  return nxsem_wait(&priv->mutex);
-}
-
-#ifdef CONFIG_I2C_RESET
-/****************************************************************************
- * Name: kinetis_i2c_sem_wait_noncancelable
- *
- * Description:
- *   Take the exclusive access, waiting as necessary
- *
- ****************************************************************************/
-
-static int
-kinetis_i2c_sem_wait_noncancelable(struct kinetis_i2cdev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->mutex);
-}
-#endif
-
-/****************************************************************************
- * Name: kinetis_i2c_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void kinetis_i2c_sem_post(struct kinetis_i2cdev_s *priv)
-{
-  nxsem_post(&priv->mutex);
-}
-
 /****************************************************************************
  * Name: kinetis_i2c_wait
  *
@@ -1142,7 +1060,7 @@ static int kinetis_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  ret = kinetis_i2c_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1232,8 +1150,7 @@ timeout:
 
   /* Release access to I2C bus */
 
-  kinetis_i2c_sem_post(priv);
-
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -1270,7 +1187,7 @@ static int kinetis_i2c_reset(struct i2c_master_s *dev)
 
   /* Lock out other clients */
 
-  ret = kinetis_i2c_sem_wait_noncancelable(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1369,7 +1286,7 @@ out:
 
   /* Release the port for re-use by other clients */
 
-  kinetis_i2c_sem_post(priv);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_I2C_RESET */
@@ -1397,25 +1314,25 @@ struct i2c_master_s *kinetis_i2cbus_initialize(int port)
     {
 #ifdef CONFIG_KINETIS_I2C0
     case 0:
-      priv           = &g_i2c0_dev;
+      priv = &g_i2c0_dev;
       break;
 #endif
 
 #ifdef CONFIG_KINETIS_I2C1
     case 1:
-      priv           = &g_i2c1_dev;
+      priv = &g_i2c1_dev;
       break;
 #endif
 
 #ifdef CONFIG_KINETIS_I2C2
     case 2:
-      priv           = &g_i2c2_dev;
+      priv = &g_i2c2_dev;
       break;
 #endif
 
 #ifdef CONFIG_KINETIS_I2C3
     case 3:
-      priv           = &g_i2c3_dev;
+      priv = &g_i2c3_dev;
       break;
 #endif
 
@@ -1427,7 +1344,6 @@ struct i2c_master_s *kinetis_i2cbus_initialize(int port)
   flags = enter_critical_section();
   if ((volatile int)priv->refs++ == 0)
     {
-      kinetis_i2c_sem_init(priv);
       kinetis_i2c_init(priv);
     }
 
@@ -1471,7 +1387,6 @@ int kinetis_i2cbus_uninitialize(struct i2c_master_s *dev)
   /* Disable power and other HW resource (GPIO's) */
 
   kinetis_i2c_deinit(priv);
-  kinetis_i2c_sem_destroy(priv);
   wd_cancel(&priv->timeout);
   return OK;
 }
diff --git a/arch/arm/src/kinetis/kinetis_sdhc.c b/arch/arm/src/kinetis/kinetis_sdhc.c
index 5521332d0b..1b629d0d4e 100644
--- a/arch/arm/src/kinetis/kinetis_sdhc.c
+++ b/arch/arm/src/kinetis/kinetis_sdhc.c
@@ -229,8 +229,6 @@ struct kinetis_sdhcregs_s
 
 /* Low-level helpers ********************************************************/
 
-static int  kinetis_takesem(struct kinetis_dev_s *priv);
-#define     kinetis_givesem(priv) (nxsem_post(&priv->waitsem))
 static void kinetis_configwaitints(struct kinetis_dev_s *priv,
               uint32_t waitints, sdio_eventset_t waitevents,
               sdio_eventset_t wkupevents);
@@ -411,27 +409,6 @@ static struct kinetis_sdhcregs_s g_sampleregs[DEBUG_NSAMPLES];
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: kinetis_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SDIO device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int kinetis_takesem(struct kinetis_dev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: kinetis_configwaitints
  *
@@ -985,7 +962,7 @@ static void kinetis_endwait(struct kinetis_dev_s *priv,
 
   /* Wake up the waiting thread */
 
-  kinetis_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2534,7 +2511,7 @@ static sdio_eventset_t kinetis_eventwait(struct sdio_dev_s *dev)
        * incremented and there will be no wait.
        */
 
-      ret = kinetis_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog (assuming it was started) and
diff --git a/arch/arm/src/kinetis/kinetis_spi.c b/arch/arm/src/kinetis/kinetis_spi.c
index a401dbb02c..4c1c8af295 100644
--- a/arch/arm/src/kinetis/kinetis_spi.c
+++ b/arch/arm/src/kinetis/kinetis_spi.c
@@ -58,7 +58,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include <arch/irq.h>
@@ -96,7 +96,7 @@ struct kinetis_spidev_s
 {
   struct spi_dev_s  spidev;     /* Externally visible part of the SPI interface */
   uint32_t          spibase;    /* Base address of SPI registers */
-  sem_t             exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t           lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t          frequency;  /* Requested clock frequency */
   uint32_t          actual;     /* Actual clock frequency */
   uint8_t           nbits;      /* Width of word in bits (8 to 16) */
@@ -672,11 +672,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -1666,9 +1666,9 @@ struct spi_dev_s *kinetis_spibus_initialize(int port)
   priv->frequency = 0;
   spi_setfrequency(&priv->spidev, KINETIS_SPI_CLK_INIT);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 #ifdef CONFIG_KINETIS_SPI_DMA
   /* Initialize the SPI semaphores that is used to wait for DMA completion.
    * This semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/kinetis/kinetis_usbhshost.c b/arch/arm/src/kinetis/kinetis_usbhshost.c
index d228edd692..a077b4295d 100644
--- a/arch/arm/src/kinetis/kinetis_usbhshost.c
+++ b/arch/arm/src/kinetis/kinetis_usbhshost.c
@@ -36,6 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/wqueue.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/usbhost.h>
@@ -284,7 +285,7 @@ struct kinetis_ehci_s
 {
   volatile bool pscwait;        /* TRUE: Thread is waiting for port status change event */
 
-  sem_t exclsem;                /* Support mutually exclusive access */
+  mutex_t lock;                 /* Support mutually exclusive access */
   sem_t pscsem;                 /* Semaphore to wait for port status change events */
 
   struct kinetis_epinfo_s ep0;    /* Endpoint 0 */
@@ -427,12 +428,6 @@ static inline void kinetis_putreg(uint32_t regval,
 static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
          unsigned int delay);
 
-/* Semaphores ***************************************************************/
-
-static int kinetis_takesem(sem_t *sem);
-static int kinetis_takesem_noncancelable(sem_t *sem);
-#define kinetis_givesem(s) nxsem_post(s);
-
 /* Allocators ***************************************************************/
 
 static struct kinetis_qh_s *kinetis_qh_alloc(void);
@@ -1075,61 +1070,13 @@ static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
   return (regval == donebits) ? OK : -ETIMEDOUT;
 }
 
-/****************************************************************************
- * Name: kinetis_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int kinetis_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: kinetis_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int kinetis_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: kinetis_qh_alloc
  *
  * Description:
  *   Allocate a Queue Head (QH) structure by removing it from the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1156,7 +1103,7 @@ static struct kinetis_qh_s *kinetis_qh_alloc(void)
  *   Let a Queue Head (QH) structure wait for free by adding it to the
  *   aawait list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1179,7 +1126,7 @@ static void kinetis_qh_aawait(struct kinetis_qh_s *qh)
  * Description:
  *   Free a Queue Head (QH) structure by returning it to the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1198,7 +1145,7 @@ static void kinetis_qh_free(struct kinetis_qh_s *qh)
  *   Allocate a Queue Element Transfer Descriptor (qTD) by removing it from
  *   the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1226,7 +1173,7 @@ static struct kinetis_qtd_s *kinetis_qtd_alloc(void)
  *   free list
  *
  * Assumption:
- *   Caller holds the exclsem
+ *   Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1677,7 +1624,7 @@ static inline uint8_t kinetis_ehci_speed(uint8_t usbspeed)
  *   this to minimize race conditions.  This logic would have to be expanded
  *   if we want to have more than one packet in flight at a time!
  *
- * Assumption:  The caller holds the EHCI exclsem
+ * Assumption:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -1723,7 +1670,7 @@ static int kinetis_ioc_setup(struct kinetis_rhport_s *rhport,
  * Description:
  *   Wait for the IOC event.
  *
- * Assumption:  The caller does *NOT* hold the EHCI exclsem.  That would
+ * Assumption:  The caller does *NOT* hold the EHCI lock.  That would
  * cause a deadlock when the bottom-half, worker thread needs to take the
  * semaphore.
  *
@@ -1739,7 +1686,7 @@ static int kinetis_ioc_wait(struct kinetis_epinfo_s *epinfo)
 
   while (epinfo->iocwait)
     {
-      ret = kinetis_takesem(&epinfo->iocsem);
+      ret = nxsem_wait_uninterruptible(&epinfo->iocsem);
       if (ret < 0)
         {
           break;
@@ -1755,7 +1702,7 @@ static int kinetis_ioc_wait(struct kinetis_epinfo_s *epinfo)
  * Description:
  *   Add a new, ready-to-go QH w/attached qTDs to the asynchronous queue.
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -2205,7 +2152,7 @@ static struct kinetis_qtd_s *kinetis_qtd_statusphase(uint32_t tokenbits)
  *   This is a blocking function; it will not return until the control
  *   transfer has completed.
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2488,7 +2435,7 @@ errout_with_qh:
  *     frame list), followed by shorter poll rates, with queue heads with a
  *     poll rate of one, on the very end."
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2592,8 +2539,8 @@ errout_with_qh:
  * Description:
  *   Wait for an IN or OUT transfer to complete.
  *
- * Assumption:  The caller holds the EHCI exclsem.  The caller must be aware
- *   that the EHCI exclsem will released while waiting for the transfer to
+ * Assumption:  The caller holds the EHCI lock.  The caller must be aware
+ *   that the EHCI lock will released while waiting for the transfer to
  *   complete, but will be re-acquired when before returning.  The state of
  *   EHCI resources could be very different upon return.
  *
@@ -2611,29 +2558,29 @@ static ssize_t kinetis_transfer_wait(struct kinetis_epinfo_s *epinfo)
   int ret;
   int ret2;
 
-  /* Release the EHCI semaphore while we wait.  Other threads need the
+  /* Release the EHCI mutex while we wait.  Other threads need the
    * opportunity to access the EHCI resources while we wait.
    *
    * REVISIT:  Is this safe?  NO.  This is a bug and needs rethinking.
    * We need to lock all of the port-resources (not EHCI common) until
-   * the transfer is complete.  But we can't use the common EHCI exclsem
+   * the transfer is complete.  But we can't use the common EHCI lock
    * or we will deadlock while waiting (because the working thread that
-   * wakes this thread up needs the exclsem).
+   * wakes this thread up needs the lock).
    */
 
   /* REVISIT */
 
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Wait for the IOC completion event */
 
   ret = kinetis_ioc_wait(epinfo);
 
-  /* Re-acquire the EHCI semaphore.  The caller expects to be holding
+  /* Re-acquire the EHCI mutex.  The caller expects to be holding
    * this upon return.
    */
 
-  ret2 = kinetis_takesem_noncancelable(&g_ehci.exclsem);
+  ret2 = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0 && ret2 < 0)
     {
       ret = ret2;
@@ -2657,9 +2604,7 @@ static ssize_t kinetis_transfer_wait(struct kinetis_epinfo_s *epinfo)
     }
 #endif
 
-  /* Did kinetis_ioc_wait() or kinetis_takesem_noncancelable() report an
-   * error?
-   */
+  /* Did kinetis_ioc_wait() or nxmutex_lock() report an error? */
 
   if (ret < 0)
     {
@@ -2968,7 +2913,7 @@ static int kinetis_qh_ioccheck(struct kinetis_qh_s *qh,
           /* Yes... wake it up */
 
           epinfo->iocwait = false;
-          kinetis_givesem(&epinfo->iocsem);
+          nxsem_post(&epinfo->iocsem);
         }
 
 #ifdef CONFIG_USBHOST_ASYNCH
@@ -3129,7 +3074,7 @@ static int kinetis_qh_cancel(struct kinetis_qh_s *qh,
  *   detected (actual number of bytes received was less than the expected
  *   number of bytes)."
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -3266,7 +3211,7 @@ static inline void kinetis_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      kinetis_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3318,7 +3263,7 @@ static inline void kinetis_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      kinetis_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3401,7 +3346,7 @@ static void kinetis_ehci_bottomhalf(void *arg)
    * real option (other than to reschedule and delay).
    */
 
-  kinetis_takesem_noncancelable(&g_ehci.exclsem);
+  nxmutex_lock(&g_ehci.lock);
 
   /* Handle all unmasked interrupt sources
    * Interrupt on Async Advance
@@ -3518,7 +3463,7 @@ static void kinetis_ehci_bottomhalf(void *arg)
 
   /* We are done with the EHCI structures */
 
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Re-enable relevant EHCI interrupts.  Interrupts should still be enabled
    * at the level of the interrupt controller.
@@ -3671,7 +3616,7 @@ static int kinetis_wait(struct usbhost_connection_s *conn,
        */
 
       g_ehci.pscwait = true;
-      ret = kinetis_takesem(&g_ehci.pscsem);
+      ret = nxsem_wait_uninterruptible(&g_ehci.pscsem);
       if (ret < 0)
         {
           return ret;
@@ -4004,7 +3949,7 @@ static int kinetis_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the EHCI data structures. */
 
-  ret = kinetis_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0)
     {
       /* Remember the new device address and max packet size */
@@ -4013,7 +3958,7 @@ static int kinetis_ep0configure(struct usbhost_driver_s *drvr,
       epinfo->speed     = speed;
       epinfo->maxpacket = maxpacketsize;
 
-      kinetis_givesem(&g_ehci.exclsem);
+      nxmutex_unlock(&g_ehci.lock);
     }
 
   return ret;
@@ -4378,7 +4323,7 @@ static int kinetis_ctrlin(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = kinetis_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4390,7 +4335,7 @@ static int kinetis_ctrlin(struct usbhost_driver_s *drvr,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Now initiate the transfer */
@@ -4405,13 +4350,13 @@ static int kinetis_ctrlin(struct usbhost_driver_s *drvr,
   /* And wait for the transfer to complete */
 
   nbytes = kinetis_transfer_wait(ep0info);
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes >= 0 ? OK : (int)nbytes;
 
 errout_with_iocwait:
   ep0info->iocwait = false;
-errout_with_sem:
-  kinetis_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4481,7 +4426,7 @@ static ssize_t kinetis_transfer(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = kinetis_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return (ssize_t)ret;
@@ -4493,7 +4438,7 @@ static ssize_t kinetis_transfer(struct usbhost_driver_s *drvr,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4531,14 +4476,14 @@ static ssize_t kinetis_transfer(struct usbhost_driver_s *drvr,
   /* Then wait for the transfer to complete */
 
   nbytes = kinetis_transfer_wait(epinfo);
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes;
 
 errout_with_iocwait:
   epinfo->iocwait = false;
-errout_with_sem:
+errout_with_lock:
   uerr("!!!\n");
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return (ssize_t)ret;
 }
 
@@ -4593,7 +4538,7 @@ static int kinetis_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * structures.
    */
 
-  ret = kinetis_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4605,7 +4550,7 @@ static int kinetis_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4642,14 +4587,14 @@ static int kinetis_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
 
   /* The transfer is in progress */
 
-  kinetis_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return OK;
 
 errout_with_callback:
   epinfo->callback = NULL;
   epinfo->arg      = NULL;
-errout_with_sem:
-  kinetis_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -4697,7 +4642,7 @@ static int kinetis_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * interrupt level.
    */
 
-  ret = kinetis_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4740,7 +4685,7 @@ static int kinetis_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 #endif
     {
       ret = OK;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Handle the cancellation according to the type of the transfer */
@@ -4803,7 +4748,7 @@ static int kinetis_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
       default:
         usbhost_trace1(EHCI_TRACE1_BADXFRTYPE, epinfo->xfrtype);
         ret = -ENOSYS;
-        goto errout_with_sem;
+        goto errout_with_lock;
     }
 
   /* Find and remove the QH.  There are four possibilities:
@@ -4833,7 +4778,7 @@ exit_terminate:
       /* Yes... wake it up */
 
       DEBUGASSERT(callback == NULL);
-      kinetis_givesem(&epinfo->iocsem);
+      nxsem_post(&epinfo->iocsem);
     }
 
   /* No.. Is there a pending asynchronous transfer? */
@@ -4848,11 +4793,11 @@ exit_terminate:
 #else
   /* Wake up the waiting thread */
 
-  kinetis_givesem(&epinfo->iocsem);
+  nxsem_post(&epinfo->iocsem);
 #endif
 
-errout_with_sem:
-  kinetis_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4899,7 +4844,7 @@ static int kinetis_connect(struct usbhost_driver_s *drvr,
   if (g_ehci.pscwait)
     {
       g_ehci.pscwait = false;
-      kinetis_givesem(&g_ehci.pscsem);
+      nxsem_post(&g_ehci.pscsem);
     }
 
   leave_critical_section(flags);
@@ -5125,7 +5070,7 @@ struct usbhost_connection_s *kinetis_ehci_initialize(int controller)
 
   /* Initialize the EHCI state data structure */
 
-  nxsem_init(&g_ehci.exclsem, 0, 1);
+  nxmutex_init(&g_ehci.lock);
   nxsem_init(&g_ehci.pscsem, 0, 0);
 
   /* The pscsem semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/kl/kl_spi.c b/arch/arm/src/kl/kl_spi.c
index 1443964ebf..248614b081 100644
--- a/arch/arm/src/kl/kl_spi.c
+++ b/arch/arm/src/kl/kl_spi.c
@@ -30,7 +30,7 @@
 #include <assert.h>
 #include <debug.h>
 
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include <arch/irq.h>
@@ -54,7 +54,7 @@ struct kl_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
   uint32_t         spibase;    /* Base address of SPI registers */
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (8 to 16) */
@@ -236,11 +236,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -689,9 +689,9 @@ struct spi_dev_s *kl_spibus_initialize(int port)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
   return &priv->spidev;
 }
 
diff --git a/arch/arm/src/lc823450/lc823450_adc.c b/arch/arm/src/lc823450/lc823450_adc.c
index c9b6a4adea..db1dcfd272 100644
--- a/arch/arm/src/lc823450/lc823450_adc.c
+++ b/arch/arm/src/lc823450/lc823450_adc.c
@@ -44,6 +44,7 @@
 #include <nuttx/fs/ioctl.h>
 #include <nuttx/analog/adc.h>
 #include <nuttx/analog/ioctl.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 
 #include "arm_internal.h"
@@ -80,7 +81,7 @@ struct lc823450_adc_inst_s
   const struct adc_callback_s *cb;
   struct adc_dev_s dev;
 
-  sem_t sem_excl;           /* Mutual exclusion semaphore */
+  mutex_t lock;             /* Mutual exclusion mutex */
 #ifndef CONFIG_ADC_POLLED
   sem_t sem_isr;            /* Interrupt wait semaphore */
 #endif
@@ -93,10 +94,6 @@ struct lc823450_adc_inst_s
  ****************************************************************************/
 
 static inline void lc823450_adc_clearirq(void);
-static inline int  lc823450_adc_sem_wait(
-    struct lc823450_adc_inst_s *inst);
-static inline void lc823450_adc_sem_post(
-    struct lc823450_adc_inst_s *inst);
 
 static int  lc823450_adc_bind(struct adc_dev_s *dev,
                               const struct adc_callback_s *callback);
@@ -256,33 +253,6 @@ static void lc823450_adc_start(struct lc823450_adc_inst_s *inst)
 #endif
 }
 
-/****************************************************************************
- * Name: lc823450_adc_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary
- *
- ****************************************************************************/
-
-static inline int lc823450_adc_sem_wait(struct lc823450_adc_inst_s *inst)
-{
-  return nxsem_wait_uninterruptible(&inst->sem_excl);
-}
-
-/****************************************************************************
- * Name: lc823450_adc_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void lc823450_adc_sem_post(
-    struct lc823450_adc_inst_s *inst)
-{
-  nxsem_post(&inst->sem_excl);
-}
-
 /****************************************************************************
  * Name: lc823450_adc_isr
  *
@@ -399,7 +369,7 @@ static void lc823450_adc_rxint(struct adc_dev_s *dev, bool enable)
 
   ainfo("enable: %d\n", enable);
 
-  ret = lc823450_adc_sem_wait(inst);
+  ret = nxmutex_lock(&inst->lock);
   if (ret < 0)
     {
       return;
@@ -416,7 +386,7 @@ static void lc823450_adc_rxint(struct adc_dev_s *dev, bool enable)
     }
 #endif
 
-  lc823450_adc_sem_post(inst);
+  nxmutex_unlock(&inst->lock);
 }
 
 /****************************************************************************
@@ -442,7 +412,7 @@ static int lc823450_adc_ioctl(struct adc_dev_s *dev, int cmd,
 
   ainfo("cmd=%xh\n", cmd);
 
-  ret = lc823450_adc_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -493,8 +463,7 @@ static int lc823450_adc_ioctl(struct adc_dev_s *dev, int cmd,
         break;
     }
 
-  lc823450_adc_sem_post(priv);
-
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -538,12 +507,12 @@ struct adc_dev_s *lc823450_adcinitialize(void)
       inst->nchannels = CONFIG_LC823450_ADC_NCHANNELS;
       inst->chanlist = lc823450_chanlist;
 
-      nxsem_init(&inst->sem_excl, 0, 1);
+      nxmutex_init(&inst->lock);
 #ifndef CONFIG_ADC_POLLED
       nxsem_init(&inst->sem_isr, 0, 0);
 #endif
 
-      ret = lc823450_adc_sem_wait(inst);
+      ret = nxmutex_lock(&inst->lock);
       if (ret < 0)
         {
           aerr("adc_register failed: %d\n", ret);
@@ -578,7 +547,7 @@ struct adc_dev_s *lc823450_adcinitialize(void)
       if (ret < 0)
         {
           aerr("adc_register failed: %d\n", ret);
-          lc823450_adc_sem_post(inst);
+          nxmutex_unlock(&inst->lock);
           kmm_free(g_inst);
           return NULL;
         }
@@ -590,8 +559,7 @@ struct adc_dev_s *lc823450_adcinitialize(void)
       /* Now we are initialized */
 
       g_inst = inst;
-
-      lc823450_adc_sem_post(inst);
+      nxmutex_unlock(&inst->lock);
     }
 
   return &g_inst->dev;
@@ -619,7 +587,7 @@ int lc823450_adc_receive(struct adc_dev_s *dev,
       return -EINVAL;
     }
 
-  ret = lc823450_adc_sem_wait(inst);
+  ret = nxmutex_lock(&inst->lock);
   if (ret < 0)
     {
       return ret;
@@ -635,7 +603,7 @@ int lc823450_adc_receive(struct adc_dev_s *dev,
     }
 
   lc823450_adc_standby(1);
-  lc823450_adc_sem_post(inst);
+  nxmutex_unlock(&inst->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/lc823450/lc823450_dma.c b/arch/arm/src/lc823450/lc823450_dma.c
index f4dac0f316..777eb5b4f5 100644
--- a/arch/arm/src/lc823450/lc823450_dma.c
+++ b/arch/arm/src/lc823450/lc823450_dma.c
@@ -36,6 +36,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/spinlock.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "lc823450_dma.h"
@@ -106,7 +107,7 @@ struct lc823450_dmach_s
 
 struct lc823450_dma_s
 {
-  sem_t exclsem;           /* For exclusive access to the DMA channel list */
+  mutex_t lock;            /* For exclusive access to the DMA channel list */
 
   /* This is the state of each DMA channel */
 
@@ -341,7 +342,7 @@ void arm_dma_initialize(void)
       sq_init(&g_dma.phydmach[i].req_q);
     }
 
-  nxsem_init(&g_dma.exclsem, 0, 1);
+  nxmutex_init(&g_dma.lock);
 
   if (irq_attach(LC823450_IRQ_DMAC, dma_interrupt, NULL) != 0)
     {
diff --git a/arch/arm/src/lc823450/lc823450_i2c.c b/arch/arm/src/lc823450/lc823450_i2c.c
index f86bcab483..36e82cda61 100644
--- a/arch/arm/src/lc823450/lc823450_i2c.c
+++ b/arch/arm/src/lc823450/lc823450_i2c.c
@@ -39,6 +39,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/clock.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -117,7 +118,7 @@ struct lc823450_i2c_priv_s
   const struct lc823450_i2c_config_s *config;
 
   int   refs;                /* Reference count */
-  sem_t sem_excl;            /* Mutual exclusion semaphore */
+  mutex_t lock;              /* Mutual exclusion mutex */
 #ifndef CONFIG_I2C_POLLED
   sem_t sem_isr;             /* Interrupt wait semaphore */
 #endif
@@ -137,10 +138,6 @@ struct lc823450_i2c_priv_s
  * Private Function Prototypes
  ****************************************************************************/
 
-static inline int
-lc823450_i2c_sem_wait(struct lc823450_i2c_priv_s *priv);
-static inline void
-lc823450_i2c_sem_post(struct lc823450_i2c_priv_s *priv);
 static inline int
 lc823450_i2c_sem_waitdone(struct lc823450_i2c_priv_s *priv);
 
@@ -209,6 +206,10 @@ static struct lc823450_i2c_priv_s lc823450_i2c0_priv =
   .ops      = &lc823450_i2c_ops,
   .config   = &lc823450_i2c0_config,
   .refs     = 0,
+  .lock     = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr  = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .irqstate = IRQSTATE_IDLE,
   .msgc     = 0,
   .msgv     = NULL,
@@ -235,6 +236,10 @@ static struct lc823450_i2c_priv_s lc823450_i2c1_priv =
   .ops      = &lc823450_i2c_ops,
   .config   = &lc823450_i2c1_config,
   .refs     = 0,
+  .lock     = NXMUTEX_INITIALIZER,
+#ifndef CONFIG_I2C_POLLED
+  .sem_isr  = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+#endif
   .irqstate = IRQSTATE_IDLE,
   .msgc     = 0,
   .msgv     = NULL,
@@ -250,34 +255,6 @@ static struct lc823450_i2c_priv_s lc823450_i2c1_priv =
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: lc823450_i2c_sem_wait
- *
- * Description:
- *   Take the exclusive access, waiting as necessary.  May be interrupted by
- *   a signal.
- *
- ****************************************************************************/
-
-static inline int lc823450_i2c_sem_wait(struct lc823450_i2c_priv_s *priv)
-{
-  return nxsem_wait(&priv->sem_excl);
-}
-
-/****************************************************************************
- * Name: lc823450_i2c_sem_post
- *
- * Description:
- *   Release the mutual exclusion semaphore
- *
- ****************************************************************************/
-
-static inline void
-lc823450_i2c_sem_post(struct lc823450_i2c_priv_s *priv)
-{
-  nxsem_post(&priv->sem_excl);
-}
-
 /****************************************************************************
  * Name: lc823450_i2c_sem_waitdone
  *
@@ -978,7 +955,7 @@ static int lc823450_i2c_transfer(struct i2c_master_s *dev,
 
   /* Ensure that address or flags don't change meanwhile */
 
-  ret = lc823450_i2c_sem_wait(priv);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -1073,8 +1050,7 @@ static int lc823450_i2c_transfer(struct i2c_master_s *dev,
 #endif
 
 exit:
-  lc823450_i2c_sem_post(priv);
-
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -1120,10 +1096,6 @@ struct i2c_master_s *lc823450_i2cbus_initialize(int port)
 
   if ((volatile int)priv->refs++ == 0)
     {
-      nxsem_init(&priv->sem_excl, 0, 1);
-#ifndef CONFIG_I2C_POLLED
-      nxsem_init(&priv->sem_isr, 0, 0);
-#endif
       lc823450_i2c_init(priv, port);
     }
 
@@ -1188,13 +1160,6 @@ int lc823450_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   lc823450_i2c_deinit(priv, port);
 
-  /* Release unused resources */
-
-  nxsem_destroy(&priv->sem_excl);
-#ifndef CONFIG_I2C_POLLED
-  nxsem_destroy(&priv->sem_isr);
-#endif
-
   return OK;
 }
 
diff --git a/arch/arm/src/lc823450/lc823450_i2s.c b/arch/arm/src/lc823450/lc823450_i2s.c
index 9a745f42b2..7b3f2d770e 100644
--- a/arch/arm/src/lc823450/lc823450_i2s.c
+++ b/arch/arm/src/lc823450/lc823450_i2s.c
@@ -306,15 +306,6 @@ static void _setup_audio_pll(uint32_t freq)
               );
 }
 
-/****************************************************************************
- * Name: _i2s_semtake
- ****************************************************************************/
-
-static int _i2s_semtake(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
 /****************************************************************************
  * Name: lc823450_i2s_rxsamplerate
  ****************************************************************************/
@@ -521,7 +512,7 @@ static int lc823450_i2s_receive(struct i2s_dev_s *dev,
 
   /* Wait for Audio Buffer */
 
-  ret = _i2s_semtake(&_sem_buf_over);
+  ret = nxsem_wait_uninterruptible(&_sem_buf_over);
   if (ret < 0)
     {
       /* Disable J Buffer Over Level IRQ */
@@ -550,10 +541,10 @@ static int lc823450_i2s_receive(struct i2s_dev_s *dev,
                     _i2s_rxdma_callback,
                     &_sem_rxdma);
 
-  ret = _i2s_semtake(&_sem_rxdma);
+  ret = nxsem_wait_uninterruptible(&_sem_rxdma);
   if (ret < 0)
     {
-      /* Stop DMA because semtake failed */
+      /* Stop DMA because semwait failed */
 
       lc823450_dmastop(_hrxdma);
 
@@ -686,7 +677,7 @@ static int lc823450_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
 
       /* Wait for Audio Buffer */
 
-      ret = _i2s_semtake(&_sem_buf_under);
+      ret = nxsem_wait_uninterruptible(&_sem_buf_under);
       if (ret < 0)
         {
           /* Disable C Buffer Under Level IRQ */
@@ -734,10 +725,10 @@ static int lc823450_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
                     _i2s_txdma_callback,
                     &_sem_txdma);
 
-  ret = _i2s_semtake(&_sem_txdma);
+  ret = nxsem_wait_uninterruptible(&_sem_txdma);
   if (ret < 0)
     {
-      /* Stop DMA because semtake failed */
+      /* Stop DMA because semwait failed */
 
       lc823450_dmastop(_htxdma);
 
diff --git a/arch/arm/src/lc823450/lc823450_mtd.c b/arch/arm/src/lc823450/lc823450_mtd.c
index 4a339faa32..c6277333b1 100644
--- a/arch/arm/src/lc823450/lc823450_mtd.c
+++ b/arch/arm/src/lc823450/lc823450_mtd.c
@@ -36,7 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/fs/ioctl.h>
 #include <nuttx/mtd/mtd.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <arch/board/board.h>
 
 #include "lc823450_mtd.h"
@@ -74,7 +74,7 @@ struct lc823450_mtd_dev_s
 
   /* Other implementation specific data may follow here */
 
-  sem_t sem;            /* Assures mutually exclusive access to the slot */
+  mutex_t lock;         /* Assures mutually exclusive access to the slot */
   uint32_t nblocks;     /* Number of blocks */
   uint32_t blocksize;   /* Size of one read/write blocks */
   uint32_t channel;     /* 0: eMMC, 1: SDC */
@@ -90,7 +90,7 @@ struct lc823450_partinfo_s
  * Private Data
  ****************************************************************************/
 
-static sem_t g_sem = SEM_INITIALIZER(1);
+static mutex_t g_lock = NXMUTEX_INITIALIZER;
 static struct mtd_dev_s *g_mtdpart[LC823450_NPARTS];
 static struct mtd_dev_s *g_mtdmaster[CONFIG_MTD_DEV_MAX];   /* 0: eMMC, 1: SDC */
 
@@ -118,24 +118,6 @@ static struct lc823450_partinfo_s partinfo[LC823450_NPARTS] =
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: mtd_semtake
- ****************************************************************************/
-
-static int mtd_semtake(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: mtd_semgive
- ****************************************************************************/
-
-static void mtd_semgive(sem_t *sem)
-{
-  nxsem_post(sem);
-}
-
 /****************************************************************************
  * Name: lc823450_erase
  *
@@ -191,7 +173,7 @@ static ssize_t lc823450_bread(struct mtd_dev_s *dev, off_t startblock,
       return -EINVAL;
     }
 
-  ret = mtd_semtake(&priv->sem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -200,7 +182,7 @@ static ssize_t lc823450_bread(struct mtd_dev_s *dev, off_t startblock,
   if (!g_mtdmaster[priv->channel])
     {
       finfo("device removed\n");
-      mtd_semgive(&priv->sem);
+      nxmutex_unlock(&priv->lock);
       return -ENODEV;
     }
 
@@ -211,8 +193,7 @@ static ssize_t lc823450_bread(struct mtd_dev_s *dev, off_t startblock,
 
   ret = lc823450_sdc_readsector(priv->channel, (unsigned long)(startblock),
                                 (unsigned short)nblocks, buf, type);
-
-  mtd_semgive(&priv->sem);
+  nxmutex_unlock(&priv->lock);
 
   if (ret != OK)
     {
@@ -264,7 +245,7 @@ static ssize_t lc823450_bwrite(struct mtd_dev_s *dev, off_t startblock,
       return -EINVAL;
     }
 
-  ret = mtd_semtake(&priv->sem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -273,7 +254,7 @@ static ssize_t lc823450_bwrite(struct mtd_dev_s *dev, off_t startblock,
   if (!g_mtdmaster[priv->channel])
     {
       finfo("device removed\n");
-      mtd_semgive(&priv->sem);
+      nxmutex_unlock(&priv->lock);
       return -ENODEV;
     }
 
@@ -284,8 +265,7 @@ static ssize_t lc823450_bwrite(struct mtd_dev_s *dev, off_t startblock,
 
   ret = lc823450_sdc_writesector(priv->channel, (unsigned long)(startblock),
                                  (unsigned short)nblocks, (void *)buf, type);
-
-  mtd_semgive(&priv->sem);
+  nxmutex_unlock(&priv->lock);
 
   if (ret != OK)
     {
@@ -312,7 +292,7 @@ static int lc823450_ioctl(struct mtd_dev_s *dev, int cmd,
 
   finfo("cmd=%xh, arg=%lxh\n", cmd, arg);
 
-  ret = mtd_semtake(&priv->sem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -323,7 +303,7 @@ static int lc823450_ioctl(struct mtd_dev_s *dev, int cmd,
   if (!g_mtdmaster[priv->channel])
     {
       finfo("device removed\n");
-      mtd_semgive(&priv->sem);
+      nxmutex_unlock(&priv->lock);
       return -ENODEV;
     }
 
@@ -399,7 +379,7 @@ static int lc823450_ioctl(struct mtd_dev_s *dev, int cmd,
         break;
     }
 
-  mtd_semgive(&priv->sem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -422,7 +402,7 @@ static int mtd_mediainitialize(struct lc823450_mtd_dev_s *dev)
 
   finfo("enter\n");
 
-  ret = mtd_semtake(&dev->sem);
+  ret = nxmutex_lock(&dev->lock);
   if (ret < 0)
     {
       return ret;
@@ -508,7 +488,7 @@ get_card_size:
         dev->channel, (uint64_t)blocksize * (uint64_t)nblocks);
 
 exit_with_error:
-  mtd_semgive(&dev->sem);
+  nxmutex_unlock(&dev->lock);
   return ret;
 }
 
@@ -538,7 +518,7 @@ static struct mtd_dev_s *lc823450_mtd_allocdev(uint32_t channel)
       return NULL;
     }
 
-  nxsem_init(&priv->sem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   priv->mtd.erase  = lc823450_erase;
   priv->mtd.bread  = lc823450_bread;
@@ -558,7 +538,7 @@ static struct mtd_dev_s *lc823450_mtd_allocdev(uint32_t channel)
   if (ret != OK)
     {
       finfo("ERROR: Failed to initialize media\n");
-      nxsem_destroy(&priv->sem);
+      nxmutex_destroy(&priv->lock);
       kmm_free(priv);
       return NULL;
     }
@@ -608,7 +588,7 @@ int lc823450_mtd_initialize(uint32_t devno)
    *  /dev/mtdblock0pN : Nth child partition
    */
 
-  ret = mtd_semtake(&g_sem);
+  ret = nxmutex_lock(&g_lock);
   if (ret < 0)
     {
       return ret;
@@ -617,7 +597,7 @@ int lc823450_mtd_initialize(uint32_t devno)
   if (g_mtdmaster[ch])
     {
       finfo("Device already registered\n");
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return -EBUSY;
     }
 
@@ -627,7 +607,7 @@ int lc823450_mtd_initialize(uint32_t devno)
   if (!g_mtdmaster[ch])
     {
       finfo("Failed to create master partition: ch=%" PRId32 "\n", ch);
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return -ENODEV;
     }
 
@@ -639,7 +619,7 @@ int lc823450_mtd_initialize(uint32_t devno)
             ch);
       kmm_free(g_mtdmaster[ch]);
       g_mtdmaster[ch] = NULL;
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return -ENODEV;
     }
 
@@ -655,7 +635,7 @@ int lc823450_mtd_initialize(uint32_t devno)
   if (devno == CONFIG_MTD_DEVNO_SDC)
     {
       finfo("SDC has no child partitions.\n");
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return OK;
     }
 #endif
@@ -696,7 +676,7 @@ int lc823450_mtd_initialize(uint32_t devno)
           finfo("%s(): mtd_partition failed. startblock=%"
                 PRIuOFF " nblocks=%" PRIuOFF "\n", __func__,
                 partinfo[i].startblock, partinfo[i].nblocks);
-          mtd_semgive(&g_sem);
+          nxmutex_unlock(&g_lock);
           DEBUGPANIC();
           return -EIO;
         }
@@ -706,13 +686,13 @@ int lc823450_mtd_initialize(uint32_t devno)
         {
           finfo("%s(): mmcl_initialize part%d failed: %d\n",
                 __func__, partno, ret);
-          mtd_semgive(&g_sem);
+          nxmutex_unlock(&g_lock);
           DEBUGPANIC();
           return ret;
         }
     }
 
-  mtd_semgive(&g_sem);
+  nxmutex_unlock(&g_lock);
   return OK;
 }
 
@@ -793,7 +773,7 @@ int lc823450_mtd_uninitialize(uint32_t devno)
 
   DEBUGASSERT(devno == CONFIG_MTD_DEVNO_SDC);
 
-  ret = mtd_semtake(&g_sem);
+  ret = nxmutex_lock(&g_lock);
   if (ret < 0)
     {
       return ret;
@@ -803,7 +783,7 @@ int lc823450_mtd_uninitialize(uint32_t devno)
   if (!priv)
     {
       finfo("SD card is not identified yet\n");
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return -ENODEV;
     }
 
@@ -813,17 +793,17 @@ int lc823450_mtd_uninitialize(uint32_t devno)
   mtd_unregister(g_mtdmaster[ch]);
 #endif
 
-  ret = mtd_semtake(&priv->sem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
-      mtd_semgive(&g_sem);
+      nxmutex_unlock(&g_lock);
       return ret;
     }
 
   ret = lc823450_sdc_clearcardinfo(ch);
   DEBUGASSERT(ret == OK);
 
-  mtd_semgive(&priv->sem);
+  nxmutex_unlock(&priv->lock);
 
   ret = mmcl_uninitialize(devname);
   if (ret != OK)
@@ -834,13 +814,13 @@ int lc823450_mtd_uninitialize(uint32_t devno)
   ret = lc823450_sdc_finalize(ch);
   DEBUGASSERT(ret == OK);
 
-  nxsem_destroy(&priv->sem);
+  nxmutex_destroy(&priv->lock);
 
   kmm_free(g_mtdmaster[ch]);
 
   g_mtdmaster[ch] = NULL;
 
-  mtd_semgive(&g_sem);
+  nxmutex_unlock(&g_lock);
 
 #ifdef CONFIG_DEBUG
   finfo("/dev/mtdblock%d deleted\n", devno);
diff --git a/arch/arm/src/lc823450/lc823450_sdc.c b/arch/arm/src/lc823450/lc823450_sdc.c
index 50c5980434..81238c20a8 100644
--- a/arch/arm/src/lc823450/lc823450_sdc.c
+++ b/arch/arm/src/lc823450/lc823450_sdc.c
@@ -47,6 +47,7 @@
 #include <debug.h>
 #include <nuttx/clock.h>
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/kthread.h>
 #include <arch/board/board.h>
 
@@ -78,10 +79,10 @@
  * Private Data
  ****************************************************************************/
 
-static sem_t _sdc_sem[2] =
+static mutex_t _sdc_lock[2] =
 {
-  SEM_INITIALIZER(1),
-  SEM_INITIALIZER(1)
+  NXMUTEX_INITIALIZER,
+  NXMUTEX_INITIALIZER
 };
 
 static struct sddrcfg_s _sdch0;
@@ -133,24 +134,6 @@ extern SINT_T sddep_write(void *src, void *dst, UI_32 size, SINT_T type,
  * Private Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: _sdc_semtake
- ****************************************************************************/
-
-static int _sdc_semtake(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: _sdc_semgive
- ****************************************************************************/
-
-static void _sdc_semgive(sem_t *sem)
-{
-  nxsem_post(sem);
-}
-
 /****************************************************************************
  * Name: _lc823450_sdc_support_trim
  ****************************************************************************/
@@ -202,7 +185,7 @@ int lc823450_sdc_clearcardinfo(uint32_t ch)
 
   mcinfo("++++ start\n");
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -218,7 +201,7 @@ int lc823450_sdc_clearcardinfo(uint32_t ch)
     }
 #endif
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
   mcinfo("---- end ret=%d\n", ret);
   return ret;
 }
@@ -277,11 +260,11 @@ int lc823450_sdc_initialize(uint32_t ch)
 
   mcinfo("++++ start\n");
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_initialize(_cfg[ch]);
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("---- end ret=%d\n", ret);
     }
 
@@ -298,11 +281,11 @@ int lc823450_sdc_finalize(uint32_t ch)
 
   mcinfo("++++ start ch=%ld\n", ch);
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_finalize(_cfg[ch]);
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("---- end ret=%d\n", ret);
     }
 
@@ -319,7 +302,7 @@ int lc823450_sdc_identifycard(uint32_t ch)
 
   mcinfo("++++ start\n");
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -335,7 +318,7 @@ int lc823450_sdc_identifycard(uint32_t ch)
     }
 #endif
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
   mcinfo("---- end ret=%d\n", ret);
   return ret;
 }
@@ -351,11 +334,11 @@ int lc823450_sdc_setclock(uint32_t ch, uint32_t limitclk, uint32_t sysclk)
   mcinfo("++++ start ch=%ld limitClk=%ld sysClk=%ld\n",
          ch, limitclk, sysclk);
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_setclock(limitclk, sysclk, _cfg[ch]);
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("---- end ret=%d\n", ret);
     }
 
@@ -376,11 +359,11 @@ int lc823450_sdc_refmediatype(uint32_t ch)
 
   mcinfo("++++ start\n");
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_refmediatype(_cfg[ch]);
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("---- end ret=%d\n", ret);
     }
 
@@ -398,12 +381,12 @@ int lc823450_sdc_getcardsize(uint32_t ch,
 
   mcinfo("++++ start\n");
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_getcardsize(psecnum, psecsize, _cfg[ch]);
 
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("---- end ret=%d\n", ret);
     }
 
@@ -421,7 +404,7 @@ int lc823450_sdc_readsector(uint32_t ch,
   int ret;
   int i = 0;
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -435,7 +418,7 @@ int lc823450_sdc_readsector(uint32_t ch,
   if (ch && _sec_cache_enabled && 1 == cnt && addr == _sec_cache_add)
     {
       memcpy(pbuf, _sec_cache, sizeof(_sec_cache));
-      goto errout_with_semaphore;
+      goto errout_with_lock;
     }
 #endif
 
@@ -488,9 +471,9 @@ int lc823450_sdc_readsector(uint32_t ch,
         }
     }
 
-errout_with_semaphore:
+errout_with_lock:
 #endif
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
 
   mcinfo("----  end ret=%d\n", ret);
   return ret;
@@ -506,7 +489,7 @@ int lc823450_sdc_writesector(uint32_t ch,
 {
   int ret;
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -536,7 +519,7 @@ int lc823450_sdc_writesector(uint32_t ch,
       mcinfo("ret=%d ch=%" PRId32 " add=%ld cnt=%d\n", ret, ch, addr, cnt);
     }
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
 
   mcinfo("----  end ret=%d\n", ret);
   return ret;
@@ -560,7 +543,7 @@ int lc823450_sdc_trimsector(uint32_t ch, unsigned long addr,
 {
   int ret;
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -582,7 +565,7 @@ int lc823450_sdc_trimsector(uint32_t ch, unsigned long addr,
       mcinfo("ret=%d ch=%" PRId32 " add=%ld cnt=%d\n", ret, ch, addr, cnt);
     }
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
 
   mcinfo("----  end ret=%d\n", ret);
   return ret;
@@ -598,12 +581,12 @@ int lc823450_sdc_cachectl(uint32_t ch, int ctrl)
 
   mcinfo("++++ ch=%" PRId32 ", ctrl=%d\n", ch, ctrl);
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret >= 0)
     {
       ret = sddr_cachectrl(ctrl, _cfg[ch]);
 
-      _sdc_semgive(&_sdc_sem[ch]);
+      nxmutex_unlock(&_sdc_lock[ch]);
       mcinfo("----  end ret=%d\n", ret);
     }
 
@@ -620,7 +603,7 @@ int lc823450_sdc_changespeedmode(uint32_t ch, int mode)
 
   mcinfo("++++ ch=%" PRId32 ", mode=%d\n", ch, mode);
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -646,7 +629,7 @@ int lc823450_sdc_changespeedmode(uint32_t ch, int mode)
         }
     }
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
   mcinfo("----  end ret=%d\n", ret);
   return ret;
 }
@@ -662,7 +645,7 @@ int lc823450_sdc_getcid(uint32_t ch, char *cidstr, int length)
 
   mcinfo("++++ ch=%" PRId32 "\n", ch);
 
-  ret = _sdc_semtake(&_sdc_sem[ch]);
+  ret = nxmutex_lock(&_sdc_lock[ch]);
   if (ret < 0)
     {
       return ret;
@@ -683,7 +666,7 @@ int lc823450_sdc_getcid(uint32_t ch, char *cidstr, int length)
       *cidstr = '\0';
     }
 
-  _sdc_semgive(&_sdc_sem[ch]);
+  nxmutex_unlock(&_sdc_lock[ch]);
   mcinfo("----  end ret=%d\n", ret);
   return ret;
 }
@@ -694,7 +677,6 @@ int lc823450_sdc_getcid(uint32_t ch, char *cidstr, int length)
 
 int lc823450_sdc_locked(void)
 {
-  int val;
   int ret;
   int i;
 
@@ -702,8 +684,7 @@ int lc823450_sdc_locked(void)
 
   for (i = 0; i < 2; i++)
     {
-      nxsem_get_value(&_sdc_sem[i], &val);
-      if (1 != val)
+      if (nxmutex_is_locked(&_sdc_lock[i]))
         {
           ret = 1;
           break;
diff --git a/arch/arm/src/lc823450/lc823450_sddrv_dep.c b/arch/arm/src/lc823450/lc823450_sddrv_dep.c
index 271be2f9f7..17dbfbc390 100644
--- a/arch/arm/src/lc823450/lc823450_sddrv_dep.c
+++ b/arch/arm/src/lc823450/lc823450_sddrv_dep.c
@@ -128,15 +128,6 @@ static void dma_callback(DMA_HANDLE hdma, void *arg, int result)
 }
 #endif /* CONFIG_LC823450_SDC_DMA */
 
-/****************************************************************************
- * Name: _sddep_semtake
- ****************************************************************************/
-
-static int _sddep_semtake(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -427,7 +418,7 @@ SINT_T sddep_read(void *src, void *dst, UI_32 size, SINT_T type,
     }
 
   lc823450_dmastart(_hrdma[ch], dma_callback, &_sem_rwait[ch]);
-  return _sddep_semtake(&_sem_rwait[ch]);
+  return nxsem_wait_uninterruptible(&_sem_rwait[ch]);
 #else
   SINT_T i;
   UI_32 *p = (UI_32 *)src;
@@ -518,7 +509,7 @@ SINT_T sddep_write(void *src, void *dst, UI_32 size, SINT_T type,
     }
 
   lc823450_dmastart(_hwdma[ch], dma_callback, &_sem_wwait[ch]);
-  return _sddep_semtake(&_sem_wwait[ch]);
+  return nxsem_wait_uninterruptible(&_sem_wwait[ch]);
 
 #else
   SINT_T i;
diff --git a/arch/arm/src/lc823450/lc823450_spi.c b/arch/arm/src/lc823450/lc823450_spi.c
index 3c8eb2791d..660a4b4106 100644
--- a/arch/arm/src/lc823450/lc823450_spi.c
+++ b/arch/arm/src/lc823450/lc823450_spi.c
@@ -34,7 +34,7 @@
 
 #include <arch/board/board.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -65,7 +65,7 @@ struct lc823450_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
 #ifndef CONFIG_SPI_OWNBUS
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (8 to 16) */
@@ -144,11 +144,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -524,7 +524,7 @@ struct spi_dev_s *lc823450_spibus_initialize(int port)
       modifyreg32(MRSTCNTAPB, 0, MRSTCNTAPB_PORT5_RSTB);
 
 #ifndef CONFIG_SPI_OWNBUS
-      nxsem_init(&priv->exclsem, 0, 1);
+      nxmutex_init(&priv->lock);
 #endif
 
       /* Initialize SPI mode. It must be done before starting SPI transfer */
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c
index 28b29943fc..850064cacb 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_gpdma.c
@@ -33,7 +33,7 @@
 
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "chip.h"
@@ -67,7 +67,7 @@ struct lpc17_40_dmach_s
 
 struct lpc17_40_gpdma_s
 {
-  sem_t exclsem;           /* For exclusive access to the DMA channel list */
+  mutex_t lock;            /* For exclusive access to the DMA channel list */
 
   /* This is the state of each DMA channel */
 
@@ -291,7 +291,7 @@ void weak_function arm_dma_initialize(void)
 
   /* Initialize the DMA state structure */
 
-  nxsem_init(&g_gpdma.exclsem, 0, 1);
+  nxmutex_init(&g_gpdma.lock);
 
   for (i = 0; i < LPC17_40_NDMACH; i++)
     {
@@ -379,7 +379,7 @@ DMA_HANDLE lpc17_40_dmachannel(void)
 
   /* Get exclusive access to the GPDMA state structure */
 
-  ret = nxsem_wait_uninterruptible(&g_gpdma.exclsem);
+  ret = nxmutex_lock(&g_gpdma.lock);
   if (ret < 0)
     {
       return NULL;
@@ -401,7 +401,7 @@ DMA_HANDLE lpc17_40_dmachannel(void)
 
   /* Return what we found (or not) */
 
-  nxsem_post(&g_gpdma.exclsem);
+  nxmutex_unlock(&g_gpdma.lock);
   return (DMA_HANDLE)dmach;
 }
 
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c
index f2706a7d7c..398ac7f927 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c
@@ -60,6 +60,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -108,7 +109,7 @@ struct lpc17_40_i2cdev_s
   unsigned int     base;       /* Base address of registers */
   uint16_t         irqid;      /* IRQ for this device */
 
-  sem_t            mutex;      /* Only one thread can access at a time */
+  mutex_t          lock;       /* Only one thread can access at a time */
   sem_t            wait;       /* Place to wait for state machine completion */
   volatile uint8_t state;      /* State of state machine */
   struct wdog_s    timeout;    /* Watchdog to timeout when bus hung */
@@ -302,7 +303,7 @@ static int lpc17_40_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  nxsem_wait(&priv->mutex);
+  nxmutex_lock(&priv->lock);
 
   /* Set up for the transfer */
 
@@ -323,7 +324,7 @@ static int lpc17_40_i2c_transfer(struct i2c_master_s *dev,
 
   ret = lpc17_40_i2c_start(priv);
 
-  nxsem_post(&priv->mutex);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -616,9 +617,9 @@ struct i2c_master_s *lpc17_40_i2cbus_initialize(int port)
 
   putreg32(I2C_CONSET_I2EN, priv->base + LPC17_40_I2C_CONSET_OFFSET);
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&priv->mutex, 0, 1);
+  nxmutex_init(&priv->lock);
   nxsem_init(&priv->wait, 0, 0);
 
   /* The wait semaphore is used for signaling and, hence, should not have
@@ -659,7 +660,7 @@ int lpc17_40_i2cbus_uninitialize(struct i2c_master_s * dev)
 
   /* Reset data structures */
 
-  nxsem_destroy(&priv->mutex);
+  nxmutex_destroy(&priv->lock);
   nxsem_destroy(&priv->wait);
 
   /* Cancel the watchdog timer */
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c
index c4a64f1e10..e4f639390e 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_sdcard.c
@@ -292,8 +292,6 @@ struct lpc17_40_sampleregs_s
 
 /* Low-level helpers ********************************************************/
 
-static int lpc17_40_takesem(struct lpc17_40_dev_s *priv);
-#define     lpc17_40_givesem(priv) (nxsem_post(&priv->waitsem))
 static inline void lpc17_40_setclock(uint32_t clkcr);
 static void lpc17_40_configwaitints(struct lpc17_40_dev_s *priv,
               uint32_t waitmask, sdio_eventset_t waitevents,
@@ -463,27 +461,6 @@ static struct lpc17_40_sampleregs_s g_sampleregs[DEBUG_NSAMPLES];
  * Low-level Helpers
  ****************************************************************************/
 
-/****************************************************************************
- * Name: lpc17_40_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SD card device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int lpc17_40_takesem(struct lpc17_40_dev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: lpc17_40_setclock
  *
@@ -1122,7 +1099,7 @@ static void lpc17_40_endwait(struct lpc17_40_dev_s *priv,
 
   /* Wake up the waiting thread */
 
-  lpc17_40_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2350,7 +2327,7 @@ static sdio_eventset_t lpc17_40_eventwait(struct sdio_dev_s *dev)
        * incremented and there will be no wait.
        */
 
-      ret = lpc17_40_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog (assuming it was started) and
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c
index c0342cfafd..09c1fe05b6 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_spi.c
@@ -35,7 +35,7 @@
 #include <arch/board/board.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -84,7 +84,7 @@
 struct lpc17_40_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (8 to 16) */
@@ -180,11 +180,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -564,9 +564,9 @@ struct spi_dev_s *lpc17_40_spibus_initialize(int port)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
   return &priv->spidev;
 }
 
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c
index 2047883a36..39dbb6a4b3 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_ssp.c
@@ -35,7 +35,7 @@
 #include <arch/board/board.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -102,7 +102,7 @@ struct lpc17_40_sspdev_s
 #ifdef CONFIG_LPC17_40_SSP_INTERRUPTS
   uint8_t          sspirq;     /* SPI IRQ number */
 #endif
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (4 to 16) */
@@ -336,11 +336,11 @@ static int ssp_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -993,9 +993,9 @@ struct spi_dev_s *lpc17_40_sspbus_initialize(int port)
 
   ssp_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Enable the SPI */
 
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c
index fce8573018..8066c4008c 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_usbhost.c
@@ -37,6 +37,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/ohci.h>
@@ -163,7 +164,7 @@ struct lpc17_40_usbhost_s
   uint8_t          outinterval; /* Minimum periodic IN EP polling interval: 2, 4, 6, 16, or 32 */
 #endif
 
-  sem_t            exclsem;     /* Support mutually exclusive access */
+  mutex_t          lock;        /* Support mutually exclusive access */
   sem_t            pscsem;      /* Semaphore to wait Writeback Done Head event */
 
 #ifdef CONFIG_USBHOST_HUB
@@ -272,10 +273,6 @@ static void lpc17_40_putreg(uint32_t val, uint32_t addr);
 
 /* Semaphores ***************************************************************/
 
-static int lpc17_40_takesem(sem_t *sem);
-static int lpc17_40_takesem_noncancelable(sem_t *sem);
-#define lpc17_40_givesem(s) nxsem_post(s);
-
 /* Byte stream access helper functions **************************************/
 
 static inline uint16_t lpc17_40_getle16(const uint8_t *val);
@@ -565,54 +562,6 @@ static void lpc17_40_putreg(uint32_t val, uint32_t addr)
 }
 #endif
 
-/****************************************************************************
- * Name: lpc17_40_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int lpc17_40_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: lpc17_40_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int lpc17_40_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: lpc17_40_getle16
  *
@@ -1645,7 +1594,7 @@ static int lpc17_40_ctrltd(struct lpc17_40_usbhost_s *priv,
 
       /* Wait for the Writeback Done Head interrupt */
 
-      ret = lpc17_40_takesem(&ed->wdhsem);
+      ret = nxsem_wait_uninterruptible(&ed->wdhsem);
       if (ret < 0)
         {
           /* Task has been canceled */
@@ -1744,7 +1693,7 @@ static int lpc17_40_usbinterrupt(int irq, void *context, void *arg)
 
                           if (priv->pscwait)
                             {
-                              lpc17_40_givesem(&priv->pscsem);
+                              nxsem_post(&priv->pscsem);
                               priv->pscwait = false;
                             }
                         }
@@ -1803,7 +1752,7 @@ static int lpc17_40_usbinterrupt(int irq, void *context, void *arg)
 
                       if (priv->pscwait)
                         {
-                          lpc17_40_givesem(&priv->pscsem);
+                          nxsem_post(&priv->pscsem);
                           priv->pscwait = false;
                         }
                     }
@@ -1942,7 +1891,7 @@ static int lpc17_40_usbinterrupt(int irq, void *context, void *arg)
                     {
                       /* Wake up the thread waiting for the WDH event */
 
-                      lpc17_40_givesem(&ed->wdhsem);
+                      nxsem_post(&ed->wdhsem);
                       xfrinfo->wdhwait = false;
                     }
 
@@ -2063,7 +2012,7 @@ static int lpc17_40_wait(struct usbhost_connection_s *conn,
       /* Wait for the next connection event */
 
       priv->pscwait = true;
-      ret = lpc17_40_takesem(&priv->pscsem);
+      ret = nxsem_wait_uninterruptible(&priv->pscsem);
       if (ret < 0)
         {
           return ret;
@@ -2219,7 +2168,7 @@ static int lpc17_40_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to EP0 and the control list */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2237,8 +2186,7 @@ static int lpc17_40_ep0configure(struct usbhost_driver_s *drvr,
     }
 
   ed->hw.ctrl = hwctrl;
-
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
 
   uinfo("EP0 CTRL:%08" PRIx32 "\n", ed->hw.ctrl);
   return OK;
@@ -2285,7 +2233,7 @@ static int lpc17_40_epalloc(struct usbhost_driver_s *drvr,
    * periodic list and the interrupt table.
    */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2407,7 +2355,7 @@ static int lpc17_40_epalloc(struct usbhost_driver_s *drvr,
         }
     }
 
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2446,7 +2394,7 @@ static int lpc17_40_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * periodic list and the interrupt table.
    */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2484,7 +2432,7 @@ static int lpc17_40_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
   /* Put the ED back into the free list */
 
   lpc17_40_edfree(ed);
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2531,7 +2479,7 @@ static int lpc17_40_alloc(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the transfer buffer pool */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2546,7 +2494,7 @@ static int lpc17_40_alloc(struct usbhost_driver_s *drvr,
       ret = OK;
     }
 
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2583,9 +2531,9 @@ static int lpc17_40_free(struct usbhost_driver_s *drvr, uint8_t *buffer)
 
   /* We must have exclusive access to the transfer buffer pool */
 
-  ret = lpc17_40_takesem_noncancelable(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   lpc17_40_tbfree(buffer);
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2730,7 +2678,7 @@ static int lpc17_40_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
 
   /* We must have exclusive access to EP0 and the control list */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2752,7 +2700,7 @@ static int lpc17_40_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
         }
     }
 
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2773,7 +2721,7 @@ static int lpc17_40_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
 
   /* We must have exclusive access to EP0 and the control list */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2796,7 +2744,7 @@ static int lpc17_40_ctrlout(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
         }
     }
 
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -3072,7 +3020,7 @@ static ssize_t lpc17_40_transfer(struct usbhost_driver_s *drvr,
    * table.
    */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -3089,7 +3037,7 @@ static ssize_t lpc17_40_transfer(struct usbhost_driver_s *drvr,
     {
       uerr("ERROR: lpc17_40_alloc_xfrinfo failed\n");
       nbytes = -ENOMEM;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initialize the transfer structure */
@@ -3144,7 +3092,7 @@ static ssize_t lpc17_40_transfer(struct usbhost_driver_s *drvr,
 
   /* Wait for the Writeback Done Head interrupt */
 
-  ret = lpc17_40_takesem(&ed->wdhsem);
+  ret = nxsem_wait_uninterruptible(&ed->wdhsem);
   if (ret < 0)
     {
       return ret;
@@ -3203,8 +3151,8 @@ errout_with_xfrinfo:
   lpc17_40_free_xfrinfo(xfrinfo);
   ed->xfrinfo = NULL;
 
-errout_with_sem:
-  lpc17_40_givesem(&priv->exclsem);
+errout_with_lock:
+  nxmutex_unlock(&priv->lock);
   return nbytes;
 }
 
@@ -3351,7 +3299,7 @@ static int lpc17_40_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * buffer pool, the bulk and interrupt lists, and the HCCA interrupt table.
    */
 
-  ret = lpc17_40_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -3368,7 +3316,7 @@ static int lpc17_40_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
     {
       uerr("ERROR: lpc17_40_alloc_xfrinfo failed\n");
       ret = -ENOMEM;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initialize the transfer structure */
@@ -3388,7 +3336,7 @@ static int lpc17_40_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
   if (ret < 0)
     {
       uerr("ERROR: lpc17_40_dma_alloc failed: %d\n", ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* If a buffer was allocated, then use it instead of the callers buffer */
@@ -3412,7 +3360,7 @@ static int lpc17_40_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * completes.
    */
 
-  lpc17_40_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return OK;
 
 errout_with_asynch:
@@ -3427,8 +3375,8 @@ errout_with_asynch:
   lpc17_40_free_xfrinfo(xfrinfo);
   ed->xfrinfo = NULL;
 
-errout_with_sem:
-  lpc17_40_givesem(&priv->exclsem);
+errout_with_lock:
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -3551,7 +3499,7 @@ static int lpc17_40_cancel(struct usbhost_driver_s *drvr,
 
               /* Wake up the waiting thread */
 
-              lpc17_40_givesem(&ed->wdhsem);
+              nxsem_post(&ed->wdhsem);
               xfrinfo->wdhwait = false;
 
               /* And free the transfer structure */
@@ -3628,7 +3576,7 @@ static int lpc17_40_connect(struct usbhost_driver_s *drvr,
   if (priv->pscwait)
     {
       priv->pscwait = false;
-      lpc17_40_givesem(&priv->pscsem);
+      nxsem_post(&priv->pscsem);
     }
 
   leave_critical_section(flags);
@@ -3795,10 +3743,10 @@ struct usbhost_connection_s *lpc17_40_usbhost_initialize(int controller)
 
   usbhost_devaddr_initialize(&priv->rhport);
 
-  /* Initialize semaphores */
+  /* Initialize semaphores & mutex */
 
   nxsem_init(&priv->pscsem,  0, 0);
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* The pscsem semaphore is used for signaling and, hence, should not
    * have priority inheritance enabled.
diff --git a/arch/arm/src/lpc2378/lpc23xx_i2c.c b/arch/arm/src/lpc2378/lpc23xx_i2c.c
index 025135b79c..87a0a1f686 100644
--- a/arch/arm/src/lpc2378/lpc23xx_i2c.c
+++ b/arch/arm/src/lpc2378/lpc23xx_i2c.c
@@ -65,6 +65,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -114,7 +115,7 @@ struct lpc2378_i2cdev_s
   unsigned int     base;       /* Base address of registers */
   uint16_t         irqid;      /* IRQ for this device */
 
-  sem_t            mutex;      /* Only one thread can access at a time */
+  mutex_t          lock;       /* Only one thread can access at a time */
   sem_t            wait;       /* Place to wait for state machine completion */
   volatile uint8_t state;      /* State of state machine */
   struct wdog_s    timeout;    /* Watchdog to timeout when bus hung */
@@ -404,7 +405,7 @@ static int lpc2378_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  nxsem_wait(&priv->mutex);
+  nxmutex_lock(&priv->lock);
 
   /* Set up for the transfer */
 
@@ -425,7 +426,7 @@ static int lpc2378_i2c_transfer(struct i2c_master_s *dev,
 
   ret = lpc2378_i2c_start(priv);
 
-  nxsem_post(&priv->mutex);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -579,9 +580,9 @@ struct i2c_master_s *lpc2378_i2cbus_initialize(int port)
 
   putreg32(I2C_CONSET_I2EN, priv->base + I2C_CONSET_OFFSET);
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&priv->mutex, 0, 1);
+  nxmutex_init(&priv->lock);
   nxsem_init(&priv->wait, 0, 0);
 
   /* The wait semaphore is used for signaling and, hence, should not have
@@ -622,7 +623,7 @@ int lpc2378_i2cbus_uninitialize(struct i2c_master_s * dev)
 
   /* Reset data structures */
 
-  nxsem_destroy(&priv->mutex);
+  nxmutex_destroy(&priv->lock);
   nxsem_destroy(&priv->wait);
 
   /* Cancel the watchdog timer */
diff --git a/arch/arm/src/lpc2378/lpc23xx_spi.c b/arch/arm/src/lpc2378/lpc23xx_spi.c
index 63abd01f3f..d31abe09cd 100644
--- a/arch/arm/src/lpc2378/lpc23xx_spi.c
+++ b/arch/arm/src/lpc2378/lpc23xx_spi.c
@@ -54,7 +54,7 @@
 #include <arch/board/board.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -103,7 +103,7 @@
 struct lpc23xx_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (8 to 16) */
@@ -199,11 +199,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -589,9 +589,9 @@ struct spi_dev_s *lpc23_spibus_initialize(int port)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
   return &priv->spidev;
 }
 
diff --git a/arch/arm/src/lpc31xx/lpc31_ehci.c b/arch/arm/src/lpc31xx/lpc31_ehci.c
index 14dacb7d38..b937b2381c 100644
--- a/arch/arm/src/lpc31xx/lpc31_ehci.c
+++ b/arch/arm/src/lpc31xx/lpc31_ehci.c
@@ -277,7 +277,7 @@ struct lpc31_ehci_s
 {
   volatile bool pscwait;        /* TRUE: Thread is waiting for port status change event */
 
-  sem_t exclsem;                /* Support mutually exclusive access */
+  mutex_t lock;                 /* Support mutually exclusive access */
   sem_t pscsem;                 /* Semaphore to wait for port status change events */
 
   struct lpc31_epinfo_s ep0;    /* Endpoint 0 */
@@ -418,12 +418,6 @@ static inline void lpc31_putreg(uint32_t regval, volatile uint32_t *regaddr);
 static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
          unsigned int delay);
 
-/* Semaphores ***************************************************************/
-
-static int lpc31_takesem(sem_t *sem);
-static int lpc31_takesem_noncancelable(sem_t *sem);
-#define lpc31_givesem(s) nxsem_post(s);
-
 /* Allocators ***************************************************************/
 
 static struct lpc31_qh_s *lpc31_qh_alloc(void);
@@ -1052,61 +1046,13 @@ static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
   return (regval == donebits) ? OK : -ETIMEDOUT;
 }
 
-/****************************************************************************
- * Name: lpc31_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int lpc31_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: lpc31_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int lpc31_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: lpc31_qh_alloc
  *
  * Description:
  *   Allocate a Queue Head (QH) structure by removing it from the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1132,7 +1078,7 @@ static struct lpc31_qh_s *lpc31_qh_alloc(void)
  * Description:
  *   Free a Queue Head (QH) structure by returning it to the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1153,7 +1099,7 @@ static void lpc31_qh_free(struct lpc31_qh_s *qh)
  *   Allocate a Queue Element Transfer Descriptor (qTD) by removing it from
  *   the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1180,7 +1126,7 @@ static struct lpc31_qtd_s *lpc31_qtd_alloc(void)
  *   Free a Queue Element Transfer Descriptor (qTD) by returning it to the
  *   free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1629,7 +1575,7 @@ static inline uint8_t lpc31_ehci_speed(uint8_t usbspeed)
  *   this to minimize race conditions.  This logic would have to be expanded
  *   if we want to have more than one packet in flight at a time!
  *
- * Assumption:  The caller holds tex EHCI exclsem
+ * Assumption:  The caller holds tex EHCI lock
  *
  ****************************************************************************/
 
@@ -1675,7 +1621,7 @@ static int lpc31_ioc_setup(struct lpc31_rhport_s *rhport,
  * Description:
  *   Wait for the IOC event.
  *
- * Assumption:  The caller does *NOT* hold the EHCI exclsem.  That would
+ * Assumption:  The caller does *NOT* hold the EHCI lock.  That would
  * cause a deadlock when the bottom-half, worker thread needs to take the
  * semaphore.
  *
@@ -1691,7 +1637,7 @@ static int lpc31_ioc_wait(struct lpc31_epinfo_s *epinfo)
 
   while (epinfo->iocwait)
     {
-      ret = lpc31_takesem(&epinfo->iocsem);
+      ret = nxsem_wait_uninterruptible(&epinfo->iocsem);
       if (ret < 0)
         {
           break;
@@ -1707,7 +1653,7 @@ static int lpc31_ioc_wait(struct lpc31_epinfo_s *epinfo)
  * Description:
  *   Add a new, ready-to-go QH w/attached qTDs to the asynchronous queue.
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -2153,7 +2099,7 @@ static struct lpc31_qtd_s *lpc31_qtd_statusphase(uint32_t tokenbits)
  *   This is a blocking function; it will not return until the control
  *   transfer has completed.
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2437,7 +2383,7 @@ errout_with_qh:
  *     frame list), followed by shorter poll rates, with queue heads with a
  *     poll rate of one, on the very end."
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2541,8 +2487,8 @@ errout_with_qh:
  * Description:
  *   Wait for an IN or OUT transfer to complete.
  *
- * Assumption:  The caller holds the EHCI exclsem.  The caller must be aware
- *   that the EHCI exclsem will released while waiting for the transfer to
+ * Assumption:  The caller holds the EHCI lock.  The caller must be aware
+ *   that the EHCI lock will released while waiting for the transfer to
  *   complete, but will be re-acquired when before returning.  The state of
  *   EHCI resources could be very different upon return.
  *
@@ -2560,27 +2506,27 @@ static ssize_t lpc31_transfer_wait(struct lpc31_epinfo_s *epinfo)
   int ret;
   int ret2;
 
-  /* Release the EHCI semaphore while we wait.  Other threads need the
+  /* Release the EHCI mutex while we wait.  Other threads need the
    * opportunity to access the EHCI resources while we wait.
    *
    * REVISIT:  Is this safe?  NO.  This is a bug and needs rethinking.
    * We need to lock all of the port-resources (not EHCI common) until
-   * the transfer is complete.  But we can't use the common EHCI exclsem
+   * the transfer is complete.  But we can't use the common EHCI lock
    * or we will deadlock while waiting (because the working thread that
-   * wakes this thread up needs the exclsem).
+   * wakes this thread up needs the lock).
    */
 #warning REVISIT
-  lpc31_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Wait for the IOC completion event */
 
   ret = lpc31_ioc_wait(epinfo);
 
-  /* Re-acquire the EHCI semaphore.  The caller expects to be holding
+  /* Re-acquire the EHCI mutex.  The caller expects to be holding
    * this upon return.
    */
 
-  ret2 = lpc31_takesem_noncancelable(&g_ehci.exclsem);
+  ret2 = nxmutex_lock(&g_ehci.lock);
   if (ret2 < 0)
     {
       ret = ret2;
@@ -2604,9 +2550,7 @@ static ssize_t lpc31_transfer_wait(struct lpc31_epinfo_s *epinfo)
     }
 #endif
 
-  /* Did lpc31_ioc_wait() or lpc31_takesem_noncancelable() report an
-   * error?
-   */
+  /* Did lpc31_ioc_wait() or nxmutex_lock() report an error? */
 
   if (ret < 0)
     {
@@ -2913,7 +2857,7 @@ static int lpc31_qh_ioccheck(struct lpc31_qh_s *qh, uint32_t **bp, void *arg)
         {
           /* Yes... wake it up */
 
-          lpc31_givesem(&epinfo->iocsem);
+          nxsem_post(&epinfo->iocsem);
           epinfo->iocwait = 0;
         }
 
@@ -3073,7 +3017,7 @@ static int lpc31_qh_cancel(struct lpc31_qh_s *qh, uint32_t **bp, void *arg)
  *   detected (actual number of bytes received was less than the expected
  *   number of bytes)."
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -3209,7 +3153,7 @@ static inline void lpc31_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      lpc31_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3249,7 +3193,7 @@ static inline void lpc31_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      lpc31_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3327,7 +3271,7 @@ static void lpc31_ehci_bottomhalf(void *arg)
    * real option (other than to reschedule and delay).
    */
 
-  lpc31_takesem_noncancelable(&g_ehci.exclsem);
+  nxmutex_lock(&g_ehci.lock);
 
   /* Handle all unmasked interrupt sources */
 
@@ -3437,7 +3381,7 @@ static void lpc31_ehci_bottomhalf(void *arg)
 
   /* We are done with the EHCI structures */
 
-  lpc31_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Re-enable relevant EHCI interrupts.  Interrupts should still be enabled
    * at the level of the interrupt controller.
@@ -3596,7 +3540,7 @@ static int lpc31_wait(struct usbhost_connection_s *conn,
        */
 
       g_ehci.pscwait = true;
-      ret = lpc31_takesem(&g_ehci.pscsem);
+      ret = nxsem_wait_uninterruptible(&g_ehci.pscsem);
       if (ret < 0)
         {
           return ret;
@@ -3955,7 +3899,7 @@ static int lpc31_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the EHCI data structures. */
 
-  ret = lpc31_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0)
     {
       /* Remember the new device address and max packet size */
@@ -3964,7 +3908,7 @@ static int lpc31_ep0configure(struct usbhost_driver_s *drvr,
       epinfo->speed     = speed;
       epinfo->maxpacket = maxpacketsize;
 
-      lpc31_givesem(&g_ehci.exclsem);
+      nxmutex_unlock(&g_ehci.lock);
     }
 
   return ret;
@@ -4328,7 +4272,7 @@ static int lpc31_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
    * structures.
    */
 
-  ret = lpc31_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4342,7 +4286,7 @@ static int lpc31_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Now initiate the transfer */
@@ -4357,13 +4301,13 @@ static int lpc31_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   /* And wait for the transfer to complete */
 
   nbytes = lpc31_transfer_wait(ep0info);
-  lpc31_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes >= 0 ? OK : (int)nbytes;
 
 errout_with_iocwait:
   ep0info->iocwait = false;
-errout_with_sem:
-  lpc31_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4432,7 +4376,7 @@ static ssize_t lpc31_transfer(struct usbhost_driver_s *drvr,
    * structures.
    */
 
-  ret = lpc31_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return (ssize_t)ret;
@@ -4446,7 +4390,7 @@ static ssize_t lpc31_transfer(struct usbhost_driver_s *drvr,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4484,13 +4428,13 @@ static ssize_t lpc31_transfer(struct usbhost_driver_s *drvr,
   /* Then wait for the transfer to complete */
 
   nbytes = lpc31_transfer_wait(epinfo);
-  lpc31_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes;
 
 errout_with_iocwait:
   epinfo->iocwait = false;
-errout_with_sem:
-  lpc31_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return (ssize_t)ret;
 }
 
@@ -4545,7 +4489,7 @@ static int lpc31_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * structures.
    */
 
-  ret = lpc31_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4559,7 +4503,7 @@ static int lpc31_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4596,14 +4540,14 @@ static int lpc31_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
 
   /* The transfer is in progress */
 
-  lpc31_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return OK;
 
 errout_with_callback:
   epinfo->callback = NULL;
   epinfo->arg      = NULL;
-errout_with_sem:
-  lpc31_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -4651,7 +4595,7 @@ static int lpc31_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * interrupt level.
    */
 
-  ret = lpc31_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4694,7 +4638,7 @@ static int lpc31_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 #endif
     {
       ret = OK;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Handle the cancellation according to the type of the transfer */
@@ -4757,7 +4701,7 @@ static int lpc31_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
       default:
         usbhost_trace1(EHCI_TRACE1_BADXFRTYPE, epinfo->xfrtype);
         ret = -ENOSYS;
-        goto errout_with_sem;
+        goto errout_with_lock;
     }
 
   /* Find and remove the QH.  There are four possibilities:
@@ -4787,7 +4731,7 @@ exit_terminate:
       /* Yes... wake it up */
 
       DEBUGASSERT(callback == NULL);
-      lpc31_givesem(&epinfo->iocsem);
+      nxsem_post(&epinfo->iocsem);
     }
 
   /* No.. Is there a pending asynchronous transfer? */
@@ -4802,11 +4746,11 @@ exit_terminate:
 #else
   /* Wake up the waiting thread */
 
-  sam_givesem(&epinfo->iocsem);
+  nxsem_post(&epinfo->iocsem);
 #endif
 
-errout_with_sem:
-  lpc31_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4853,7 +4797,7 @@ static int lpc31_connect(struct usbhost_driver_s *drvr,
   if (g_ehci.pscwait)
     {
       g_ehci.pscwait = false;
-      lpc31_givesem(&g_ehci.pscsem);
+      nxsem_post(&g_ehci.pscsem);
     }
 
   leave_critical_section(flags);
@@ -5079,7 +5023,7 @@ struct usbhost_connection_s *lpc31_ehci_initialize(int controller)
 
   /* Initialize the EHCI state data structure */
 
-  nxsem_init(&g_ehci.exclsem, 0, 1);
+  nxmutex_init(&g_ehci.lock);
   nxsem_init(&g_ehci.pscsem,  0, 0);
 
   /* The pscsem semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/lpc31xx/lpc31_i2c.c b/arch/arm/src/lpc31xx/lpc31_i2c.c
index 9fb22b1f36..44462b1b7d 100644
--- a/arch/arm/src/lpc31xx/lpc31_i2c.c
+++ b/arch/arm/src/lpc31xx/lpc31_i2c.c
@@ -35,6 +35,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -69,7 +70,7 @@ struct lpc31_i2cdev_s
     uint16_t          rstid;      /* Reset for this device */
     uint16_t          irqid;      /* IRQ for this device */
 
-    sem_t             mutex;      /* Only one thread can access at a time */
+    mutex_t           lock;       /* Only one thread can access at a time */
     sem_t             wait;       /* Place to wait for state machine completion */
     volatile uint8_t  state;      /* State of state machine */
     struct wdog_s     timeout;    /* Watchdog to timeout when bus hung */
@@ -473,7 +474,7 @@ static int i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  nxsem_wait(&priv->mutex);
+  nxmutex_lock(&priv->lock);
   flags = enter_critical_section();
 
   /* Set up for the transfer */
@@ -509,7 +510,7 @@ static int i2c_transfer(struct i2c_master_s *dev,
   ret = count - priv->nmsg;
 
   leave_critical_section(flags);
-  nxsem_post(&priv->mutex);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -555,9 +556,9 @@ struct i2c_master_s *lpc31_i2cbus_initialize(int port)
   priv->rstid = (port == 0) ? RESETID_I2C0RST  : RESETID_I2C1RST;
   priv->irqid = (port == 0) ? LPC31_IRQ_I2C0   : LPC31_IRQ_I2C1;
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&priv->mutex, 0, 1);
+  nxmutex_init(&priv->lock);
   nxsem_init(&priv->wait, 0, 0);
 
   /* The wait semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/lpc31xx/lpc31_spi.c b/arch/arm/src/lpc31xx/lpc31_spi.c
index 2aa2dcfa19..74df6b7655 100644
--- a/arch/arm/src/lpc31xx/lpc31_spi.c
+++ b/arch/arm/src/lpc31xx/lpc31_spi.c
@@ -32,7 +32,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include <arch/board/board.h>
@@ -72,7 +72,7 @@
 struct lpc31_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of work in bits (8 or 16) */
@@ -457,11 +457,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -964,9 +964,9 @@ struct spi_dev_s *lpc31_spibus_initialize(int port)
   lpc31_softreset(RESETID_SPIRSTAPB);
   lpc31_softreset(RESETID_SPIRSTIP);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Reset the SPI block */
 
diff --git a/arch/arm/src/lpc43xx/lpc43_ehci.c b/arch/arm/src/lpc43xx/lpc43_ehci.c
index ab8a8375aa..7c7b4b7328 100644
--- a/arch/arm/src/lpc43xx/lpc43_ehci.c
+++ b/arch/arm/src/lpc43xx/lpc43_ehci.c
@@ -36,6 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/wqueue.h>
 #include <nuttx/signal.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/usbhost.h>
@@ -278,7 +279,7 @@ struct lpc43_ehci_s
 {
   volatile bool pscwait;        /* TRUE: Thread is waiting for port status change event */
 
-  sem_t exclsem;                /* Support mutually exclusive access */
+  mutex_t lock;                 /* Support mutually exclusive access */
   sem_t pscsem;                 /* Semaphore to wait for port status change events */
 
   struct lpc43_epinfo_s ep0;    /* Endpoint 0 */
@@ -419,12 +420,6 @@ static inline void lpc43_putreg(uint32_t regval, volatile uint32_t *regaddr);
 static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
          unsigned int delay);
 
-/* Semaphores ***************************************************************/
-
-static int lpc43_takesem(sem_t *sem);
-static int lpc43_takesem_noncancelable(sem_t *sem);
-#define lpc43_givesem(s) nxsem_post(s);
-
 /* Allocators ***************************************************************/
 
 static struct lpc43_qh_s *lpc43_qh_alloc(void);
@@ -1041,61 +1036,13 @@ static int ehci_wait_usbsts(uint32_t maskbits, uint32_t donebits,
   return (regval == donebits) ? OK : -ETIMEDOUT;
 }
 
-/****************************************************************************
- * Name: lpc43_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int lpc43_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: lpc43_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int lpc43_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: lpc43_qh_alloc
  *
  * Description:
  *   Allocate a Queue Head (QH) structure by removing it from the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1121,7 +1068,7 @@ static struct lpc43_qh_s *lpc43_qh_alloc(void)
  * Description:
  *   Free a Queue Head (QH) structure by returning it to the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1142,7 +1089,7 @@ static void lpc43_qh_free(struct lpc43_qh_s *qh)
  *   Allocate a Queue Element Transfer Descriptor (qTD) by removing it from
  *   the free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1169,7 +1116,7 @@ static struct lpc43_qtd_s *lpc43_qtd_alloc(void)
  *   Free a Queue Element Transfer Descriptor (qTD) by returning it to the
  *   free list
  *
- * Assumption:  Caller holds the exclsem
+ * Assumption:  Caller holds the lock
  *
  ****************************************************************************/
 
@@ -1527,7 +1474,7 @@ static inline uint8_t lpc43_ehci_speed(uint8_t usbspeed)
  *   this to minimize race conditions.  This logic would have to be expanded
  *   if we want to have more than one packet in flight at a time!
  *
- * Assumption:  The caller holds tex EHCI exclsem
+ * Assumption:  The caller holds tex EHCI lock
  *
  ****************************************************************************/
 
@@ -1573,7 +1520,7 @@ static int lpc43_ioc_setup(struct lpc43_rhport_s *rhport,
  * Description:
  *   Wait for the IOC event.
  *
- * Assumption:  The caller does *NOT* hold the EHCI exclsem.  That would
+ * Assumption:  The caller does *NOT* hold the EHCI lock.  That would
  * cause a deadlock when the bottom-half, worker thread needs to take the
  * semaphore.
  *
@@ -1589,7 +1536,7 @@ static int lpc43_ioc_wait(struct lpc43_epinfo_s *epinfo)
 
   while (epinfo->iocwait)
     {
-      ret = lpc43_takesem(&epinfo->iocsem);
+      ret = nxsem_wait_uninterruptible(&epinfo->iocsem);
       if (ret < 0)
         {
           break;
@@ -1605,7 +1552,7 @@ static int lpc43_ioc_wait(struct lpc43_epinfo_s *epinfo)
  * Description:
  *   Add a new, ready-to-go QH w/attached qTDs to the asynchronous queue.
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -2040,7 +1987,7 @@ static struct lpc43_qtd_s *lpc43_qtd_statusphase(uint32_t tokenbits)
  *   This is a blocking function; it will not return until the control
  *   transfer has completed.
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2323,7 +2270,7 @@ errout_with_qh:
  *     frame list), followed by shorter poll rates, with queue heads with a
  *     poll rate of one, on the very end."
  *
- * Assumption:  The caller holds the EHCI exclsem.
+ * Assumption:  The caller holds the EHCI lock.
  *
  * Returned Value:
  *   Zero (OK) is returned on success; a negated errno value is return on
@@ -2427,8 +2374,8 @@ errout_with_qh:
  * Description:
  *   Wait for an IN or OUT transfer to complete.
  *
- * Assumption:  The caller holds the EHCI exclsem.  The caller must be aware
- *   that the EHCI exclsem will released while waiting for the transfer to
+ * Assumption:  The caller holds the EHCI lock.  The caller must be aware
+ *   that the EHCI lock will released while waiting for the transfer to
  *   complete, but will be re-acquired when before returning.  The state of
  *   EHCI resources could be very different upon return.
  *
@@ -2446,35 +2393,33 @@ static ssize_t lpc43_transfer_wait(struct lpc43_epinfo_s *epinfo)
   int ret;
   int ret2;
 
-  /* Release the EHCI semaphore while we wait.  Other threads need the
+  /* Release the EHCI mutex while we wait.  Other threads need the
    * opportunity to access the EHCI resources while we wait.
    *
    * REVISIT:  Is this safe?  NO.  This is a bug and needs rethinking.
    * We need to lock all of the port-resources (not EHCI common) until
-   * the transfer is complete.  But we can't use the common EHCI exclsem
+   * the transfer is complete.  But we can't use the common EHCI lock
    * or we will deadlock while waiting (because the working thread that
-   * wakes this thread up needs the exclsem).
+   * wakes this thread up needs the lock).
    */
 #warning REVISIT
-  lpc43_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Wait for the IOC completion event */
 
   ret = lpc43_ioc_wait(epinfo);
 
-  /* Re-acquire the EHCI semaphore.  The caller expects to be holding
+  /* Re-acquire the EHCI mutex.  The caller expects to be holding
    * this upon return.
    */
 
-  ret2 = lpc43_takesem_noncancelable(&g_ehci.exclsem);
+  ret2 = nxmutex_lock(&g_ehci.lock);
   if (ret2 < 0)
     {
       ret = ret2;
     }
 
-  /* Did lpc43_ioc_wait() or lpc43_takesem_noncancelable()report an
-   * error?
-   */
+  /* Did lpc43_ioc_wait() or nxmutex_lock()report an error? */
 
   if (ret < 0)
     {
@@ -2772,7 +2717,7 @@ static int lpc43_qh_ioccheck(struct lpc43_qh_s *qh, uint32_t **bp, void *arg)
         {
           /* Yes... wake it up */
 
-          lpc43_givesem(&epinfo->iocsem);
+          nxsem_post(&epinfo->iocsem);
           epinfo->iocwait = 0;
         }
 
@@ -2923,7 +2868,7 @@ static int lpc43_qh_cancel(struct lpc43_qh_s *qh, uint32_t **bp, void *arg)
  *   detected (actual number of bytes received was less than the expected
  *   number of bytes)."
  *
- * Assumptions:  The caller holds the EHCI exclsem
+ * Assumptions:  The caller holds the EHCI lock
  *
  ****************************************************************************/
 
@@ -3046,7 +2991,7 @@ static inline void lpc43_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      lpc43_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3086,7 +3031,7 @@ static inline void lpc43_portsc_bottomhalf(void)
 
                   if (g_ehci.pscwait)
                     {
-                      lpc43_givesem(&g_ehci.pscsem);
+                      nxsem_post(&g_ehci.pscsem);
                       g_ehci.pscwait = false;
                     }
                 }
@@ -3164,7 +3109,7 @@ static void lpc43_ehci_bottomhalf(void *arg)
    * real option (other than to reschedule and delay).
    */
 
-  lpc43_takesem_noncancelable(&g_ehci.exclsem);
+  nxmutex_lock(&g_ehci.lock);
 
   /* Handle all unmasked interrupt sources */
 
@@ -3274,7 +3219,7 @@ static void lpc43_ehci_bottomhalf(void *arg)
 
   /* We are done with the EHCI structures */
 
-  lpc43_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
 
   /* Re-enable relevant EHCI interrupts.  Interrupts should still be enabled
    * at the level of the interrupt controller.
@@ -3433,7 +3378,7 @@ static int lpc43_wait(struct usbhost_connection_s *conn,
        */
 
       g_ehci.pscwait = true;
-      ret = lpc43_takesem(&g_ehci.pscsem);
+      ret = nxsem_wait_uninterruptible(&g_ehci.pscsem);
       if (ret < 0)
         {
           return ret;
@@ -3792,7 +3737,7 @@ static int lpc43_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the EHCI data structures. */
 
-  ret = lpc43_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret >= 0)
     {
       /* Remember the new device address and max packet size */
@@ -3801,7 +3746,7 @@ static int lpc43_ep0configure(struct usbhost_driver_s *drvr,
       epinfo->speed     = speed;
       epinfo->maxpacket = maxpacketsize;
 
-      lpc43_givesem(&g_ehci.exclsem);
+      nxmutex_unlock(&g_ehci.lock);
     }
 
   return ret;
@@ -4158,7 +4103,7 @@ static int lpc43_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
    * structures.
    */
 
-  ret = lpc43_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4170,7 +4115,7 @@ static int lpc43_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Now initiate the transfer */
@@ -4185,13 +4130,13 @@ static int lpc43_ctrlin(struct usbhost_driver_s *drvr, usbhost_ep_t ep0,
   /* And wait for the transfer to complete */
 
   nbytes = lpc43_transfer_wait(ep0info);
-  lpc43_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes >= 0 ? OK : (int)nbytes;
 
 errout_with_iocwait:
   ep0info->iocwait = false;
-errout_with_sem:
-  lpc43_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4260,7 +4205,7 @@ static ssize_t lpc43_transfer(struct usbhost_driver_s *drvr,
    * data structures.
    */
 
-  ret = lpc43_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return (ssize_t)ret;
@@ -4272,7 +4217,7 @@ static ssize_t lpc43_transfer(struct usbhost_driver_s *drvr,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4310,13 +4255,13 @@ static ssize_t lpc43_transfer(struct usbhost_driver_s *drvr,
   /* Then wait for the transfer to complete */
 
   nbytes = lpc43_transfer_wait(epinfo);
-  lpc43_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return nbytes;
 
 errout_with_iocwait:
   epinfo->iocwait = false;
-errout_with_sem:
-  lpc43_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return (ssize_t)ret;
 }
 
@@ -4371,7 +4316,7 @@ static int lpc43_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
    * data structures.
    */
 
-  ret = lpc43_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4383,7 +4328,7 @@ static int lpc43_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
   if (ret != OK)
     {
       usbhost_trace1(EHCI_TRACE1_DEVDISCONNECTED, -ret);
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Initiate the transfer */
@@ -4420,14 +4365,14 @@ static int lpc43_asynch(struct usbhost_driver_s *drvr, usbhost_ep_t ep,
 
   /* The transfer is in progress */
 
-  lpc43_givesem(&g_ehci.exclsem);
+  nxmutex_unlock(&g_ehci.lock);
   return OK;
 
 errout_with_callback:
   epinfo->callback = NULL;
   epinfo->arg      = NULL;
-errout_with_sem:
-  lpc43_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 #endif /* CONFIG_USBHOST_ASYNCH */
@@ -4475,7 +4420,7 @@ static int lpc43_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * interrupt level.
    */
 
-  ret = lpc43_takesem(&g_ehci.exclsem);
+  ret = nxmutex_lock(&g_ehci.lock);
   if (ret < 0)
     {
       return ret;
@@ -4518,7 +4463,7 @@ static int lpc43_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
 #endif
     {
       ret = OK;
-      goto errout_with_sem;
+      goto errout_with_lock;
     }
 
   /* Handle the cancellation according to the type of the transfer */
@@ -4581,7 +4526,7 @@ static int lpc43_cancel(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
       default:
         usbhost_trace1(EHCI_TRACE1_BADXFRTYPE, epinfo->xfrtype);
         ret = -ENOSYS;
-        goto errout_with_sem;
+        goto errout_with_lock;
     }
 
   /* Find and remove the QH.  There are four possibilities:
@@ -4611,7 +4556,7 @@ exit_terminate:
       /* Yes... wake it up */
 
       DEBUGASSERT(callback == NULL);
-      lpc43_givesem(&epinfo->iocsem);
+      nxsem_post(&epinfo->iocsem);
     }
 
   /* No.. Is there a pending asynchronous transfer? */
@@ -4626,11 +4571,11 @@ exit_terminate:
 #else
   /* Wake up the waiting thread */
 
-  lpc43_givesem(&epinfo->iocsem);
+  nxsem_post(&epinfo->iocsem);
 #endif
 
-errout_with_sem:
-  lpc43_givesem(&g_ehci.exclsem);
+errout_with_lock:
+  nxmutex_unlock(&g_ehci.lock);
   return ret;
 }
 
@@ -4677,7 +4622,7 @@ static int lpc43_connect(struct usbhost_driver_s *drvr,
   if (g_ehci.pscwait)
     {
       g_ehci.pscwait = false;
-      lpc43_givesem(&g_ehci.pscsem);
+      nxsem_post(&g_ehci.pscsem);
     }
 
   leave_critical_section(flags);
@@ -4903,7 +4848,7 @@ struct usbhost_connection_s *lpc43_ehci_initialize(int controller)
 
   /* Initialize the EHCI state data structure */
 
-  nxsem_init(&g_ehci.exclsem, 0, 1);
+  nxmutex_init(&g_ehci.lock);
   nxsem_init(&g_ehci.pscsem,  0, 0);
 
   /* The pscsem semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/lpc43xx/lpc43_gpdma.c b/arch/arm/src/lpc43xx/lpc43_gpdma.c
index cb6cd3df40..201e68c4b2 100644
--- a/arch/arm/src/lpc43xx/lpc43_gpdma.c
+++ b/arch/arm/src/lpc43xx/lpc43_gpdma.c
@@ -32,6 +32,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "chip.h"
@@ -66,7 +67,7 @@ struct lpc43_dmach_s
 
 struct lpc43_gpdma_s
 {
-  sem_t exclsem;           /* For exclusive access to the DMA channel list */
+  mutex_t lock;            /* For exclusive access to the DMA channel list */
 
   /* This is the state of each DMA channel */
 
@@ -290,7 +291,7 @@ void weak_function arm_dma_initialize(void)
 
   /* Initialize the DMA state structure */
 
-  nxsem_init(&g_gpdma.exclsem, 0, 1);
+  nxmutex_init(&g_gpdma.lock);
 
   for (i = 0; i < LPC43_NDMACH; i++)
     {
@@ -379,7 +380,7 @@ DMA_HANDLE lpc43_dmachannel(void)
 
   /* Get exclusive access to the GPDMA state structure */
 
-  ret = nxsem_wait_uninterruptible(&g_gpdma.exclsem);
+  ret = nxmutex_lock(&g_gpdma.lock);
   if (ret < 0)
     {
       return NULL;
@@ -401,7 +402,7 @@ DMA_HANDLE lpc43_dmachannel(void)
 
   /* Return what we found (or not) */
 
-  nxsem_post(&g_gpdma.exclsem);
+  nxmutex_unlock(&g_gpdma.lock);
   return (DMA_HANDLE)dmach;
 }
 
diff --git a/arch/arm/src/lpc43xx/lpc43_i2c.c b/arch/arm/src/lpc43xx/lpc43_i2c.c
index c77b0cdddf..953bca8705 100644
--- a/arch/arm/src/lpc43xx/lpc43_i2c.c
+++ b/arch/arm/src/lpc43xx/lpc43_i2c.c
@@ -63,6 +63,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -103,7 +104,7 @@ struct lpc43_i2cdev_s
   uint16_t         irqid;      /* IRQ for this device */
   uint32_t         base_freq;  /* branch frequency */
 
-  sem_t            mutex;      /* Only one thread can access at a time */
+  mutex_t          lock;       /* Only one thread can access at a time */
   sem_t            wait;       /* Place to wait for state machine completion */
   volatile uint8_t state;      /* State of state machine */
   struct wdog_s    timeout;    /* watchdog to timeout when bus hung */
@@ -387,7 +388,7 @@ static int lpc43_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  nxsem_wait(&priv->mutex);
+  nxmutex_lock(&priv->lock);
 
   /* Set up for the transfer */
 
@@ -408,7 +409,7 @@ static int lpc43_i2c_transfer(struct i2c_master_s *dev,
 
   ret = lpc43_i2c_start(priv);
 
-  nxsem_post(&priv->mutex);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -527,9 +528,9 @@ struct i2c_master_s *lpc43_i2cbus_initialize(int port)
 
   putreg32(I2C_CONSET_I2EN, priv->base + LPC43_I2C_CONSET_OFFSET);
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&priv->mutex, 0, 1);
+  nxmutex_init(&priv->lock);
   nxsem_init(&priv->wait, 0, 0);
 
   /* The wait semaphore is used for signaling and, hence, should not have
diff --git a/arch/arm/src/lpc43xx/lpc43_sdmmc.c b/arch/arm/src/lpc43xx/lpc43_sdmmc.c
index aba9a5f08d..e387026f12 100644
--- a/arch/arm/src/lpc43xx/lpc43_sdmmc.c
+++ b/arch/arm/src/lpc43xx/lpc43_sdmmc.c
@@ -251,8 +251,6 @@ static void lpc43_putreg(uint32_t val, uint32_t addr);
 
 /* Low-level helpers ********************************************************/
 
-static int  lpc43_takesem(struct lpc43_dev_s *priv);
-#define     lpc43_givesem(priv) (nxsem_post(&priv->waitsem))
 static inline void lpc43_setclock(uint32_t clkdiv);
 static inline void lpc43_sdcard_clock(bool enable);
 static int  lpc43_ciu_sendcmd(uint32_t cmd, uint32_t arg);
@@ -493,27 +491,6 @@ static void lpc43_putreg(uint32_t val, uint32_t addr)
 }
 #endif
 
-/****************************************************************************
- * Name: lpc43_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SD card device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int lpc43_takesem(struct lpc43_dev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: lpc43_setclock
  *
@@ -869,7 +846,7 @@ static void lpc43_endwait(struct lpc43_dev_s *priv,
 
   /* Wake up the waiting thread */
 
-  lpc43_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2308,7 +2285,7 @@ static sdio_eventset_t lpc43_eventwait(struct sdio_dev_s *dev)
        * incremented and there will be no wait.
        */
 
-      ret = lpc43_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog -- assuming it was started and
diff --git a/arch/arm/src/lpc43xx/lpc43_spi.c b/arch/arm/src/lpc43xx/lpc43_spi.c
index da099eabab..35095c290d 100644
--- a/arch/arm/src/lpc43xx/lpc43_spi.c
+++ b/arch/arm/src/lpc43xx/lpc43_spi.c
@@ -33,7 +33,7 @@
 
 #include <arch/board/board.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -73,7 +73,7 @@
 struct lpc43_spidev_s
 {
   struct spi_dev_s spidev;     /* Externally visible part of the SPI interface */
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (8 to 16) */
@@ -171,11 +171,11 @@ static int spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -533,9 +533,9 @@ static struct spi_dev_s *lpc43_spiport_initialize(int port)
 
   spi_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
   return &priv->spidev;
 }
 #endif /* CONFIG_LPC43_SPI */
diff --git a/arch/arm/src/lpc43xx/lpc43_ssp.c b/arch/arm/src/lpc43xx/lpc43_ssp.c
index 3d630b3355..90e0c88f1f 100644
--- a/arch/arm/src/lpc43xx/lpc43_ssp.c
+++ b/arch/arm/src/lpc43xx/lpc43_ssp.c
@@ -35,7 +35,7 @@
 #include <arch/board/board.h>
 #include <nuttx/irq.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -63,7 +63,7 @@ struct lpc43_sspdev_s
 #ifdef CONFIG_LPC43_SSP_INTERRUPTS
   uint8_t          sspirq;     /* SPI IRQ number */
 #endif
-  sem_t            exclsem;    /* Held while chip is selected for mutual exclusion */
+  mutex_t          lock;       /* Held while chip is selected for mutual exclusion */
   uint32_t         frequency;  /* Requested clock frequency */
   uint32_t         actual;     /* Actual clock frequency */
   uint8_t          nbits;      /* Width of word in bits (4 to 16) */
@@ -274,11 +274,11 @@ static int ssp_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -827,9 +827,9 @@ struct spi_dev_s *lpc43_sspbus_initialize(int port)
 
   ssp_setfrequency((struct spi_dev_s *)priv, 400000);
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Enable the SPI */
 
diff --git a/arch/arm/src/lpc54xx/lpc54_dma.c b/arch/arm/src/lpc54xx/lpc54_dma.c
index 50b1e4fbc0..79658d39c4 100644
--- a/arch/arm/src/lpc54xx/lpc54_dma.c
+++ b/arch/arm/src/lpc54xx/lpc54_dma.c
@@ -32,6 +32,7 @@
 #include <debug.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 
 #include "arm_internal.h"
 #include "hardware/lpc54_inputmux.h"
@@ -59,7 +60,7 @@ struct lpc54_dmach_s
 
 struct lpc54_dma_s
 {
-  sem_t exclsem;           /* For exclusive access to the DMA channel list */
+  mutex_t lock;           /* For exclusive access to the DMA channel list */
 
   /* This is the state of each DMA channel */
 
@@ -233,7 +234,7 @@ void weak_function arm_dma_initialize(void)
 
   /* Initialize the DMA state structure */
 
-  nxsem_init(&g_dma.exclsem, 0, 1);
+  nxmutex_init(&g_dma.lock);
 
   /* Set the SRAMBASE to the beginning a array of DMA descriptors, one for
    * each DMA channel.
@@ -295,7 +296,7 @@ int lpc54_dma_setup(int ch, uint32_t cfg, uint32_t xfrcfg, uint8_t trigsrc,
 
   /* Get exclusive access to the DMA data structures and interface */
 
-  ret = nxsem_wait(&g_dma.exclsem);
+  ret = nxmutex_lock(&g_dma.lock);
   if (ret < 0)
     {
       return ret;
@@ -307,7 +308,7 @@ int lpc54_dma_setup(int ch, uint32_t cfg, uint32_t xfrcfg, uint8_t trigsrc,
   if (dmach->inuse)
     {
       ret = -EBUSY;
-      goto errout_with_exclsem;
+      goto errout_with_excllock;
     }
 
   dmach->inuse = true;
@@ -437,8 +438,8 @@ int lpc54_dma_setup(int ch, uint32_t cfg, uint32_t xfrcfg, uint8_t trigsrc,
   putreg32(xfrcfg, base + LPC54_DMA_XFERCFG_OFFSET);
   ret = OK;
 
-errout_with_exclsem:
-  nxsem_post(&g_dma.exclsem);
+errout_with_excllock:
+  nxmutex_unlock(&g_dma.lock);
   return ret;
 }
 
diff --git a/arch/arm/src/lpc54xx/lpc54_i2c_master.c b/arch/arm/src/lpc54xx/lpc54_i2c_master.c
index b33366af37..ecb435ebc9 100644
--- a/arch/arm/src/lpc54xx/lpc54_i2c_master.c
+++ b/arch/arm/src/lpc54xx/lpc54_i2c_master.c
@@ -58,6 +58,7 @@
 #include <nuttx/arch.h>
 #include <nuttx/wdog.h>
 #include <nuttx/clock.h>
+#include <nuttx/mutex.h>
 #include <nuttx/semaphore.h>
 #include <nuttx/i2c/i2c_master.h>
 
@@ -136,7 +137,7 @@ struct lpc54_i2cdev_s
   int16_t nmsgs;            /* Number of transfer remaining */
   int16_t result;           /* The result of the transfer */
 
-  sem_t exclsem;            /* Only one thread can access at a time */
+  mutex_t lock;             /* Only one thread can access at a time */
 #ifndef CONFIG_I2C_POLLED
   sem_t waitsem;            /* Supports wait for state machine completion */
   uint16_t irq;             /* Flexcomm IRQ number */
@@ -756,7 +757,7 @@ static int lpc54_i2c_transfer(struct i2c_master_s *dev,
 
   /* Get exclusive access to the I2C bus */
 
-  nxsem_wait(&priv->exclsem);
+  nxmutex_lock(&priv->lock);
 
   /* Set up for the transfer */
 
@@ -789,7 +790,7 @@ static int lpc54_i2c_transfer(struct i2c_master_s *dev,
   ret = priv->result;
   i2cinfo("Done, result=%d\n", ret);
 
-  nxsem_post(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -1206,9 +1207,9 @@ struct i2c_master_s *lpc54_i2cbus_initialize(int port)
 
   lpc54_i2c_setfrequency(priv, I2C_DEFAULT_FREQUENCY);
 
-  /* Initialize semaphores */
+  /* Initialize mutex & semaphores */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 #ifndef CONFIG_I2C_POLLED
   nxsem_init(&priv->waitsem, 0, 0);
 
diff --git a/arch/arm/src/lpc54xx/lpc54_rng.c b/arch/arm/src/lpc54xx/lpc54_rng.c
index d83a634773..65ff4fa2fc 100644
--- a/arch/arm/src/lpc54xx/lpc54_rng.c
+++ b/arch/arm/src/lpc54xx/lpc54_rng.c
@@ -27,7 +27,7 @@
 #include <stdint.h>
 
 #include <nuttx/irq.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/fs/fs.h>
 #include <nuttx/drivers/drivers.h>
 
@@ -48,7 +48,7 @@ static ssize_t lpc54_read(struct file *filep, char *buffer, size_t);
 
 struct rng_dev_s
 {
-  sem_t rd_devsem;      /* Threads can only exclusively access the RNG */
+  mutex_t rd_devlock;   /* Threads can only exclusively access the RNG */
 };
 
 /****************************************************************************
@@ -93,7 +93,7 @@ static ssize_t lpc54_read(struct file *filep, char *buffer, size_t buflen)
 
   /* Get exclusive access to ROM random number generator API */
 
-  ret = nxsem_wait(&g_rngdev.rd_devsem);
+  ret = nxmutex_lock(&g_rngdev.rd_devlock);
   if (ret < 0)
     {
       return ret;
@@ -119,7 +119,7 @@ static ssize_t lpc54_read(struct file *filep, char *buffer, size_t buflen)
         }
     }
 
-  nxsem_post(&g_rngdev.rd_devsem);
+  nxmutex_unlock(&g_rngdev.rd_devlock);
   return buflen;
 }
 
@@ -145,7 +145,7 @@ static ssize_t lpc54_read(struct file *filep, char *buffer, size_t buflen)
 #ifdef CONFIG_DEV_RANDOM
 void devrandom_register(void)
 {
-  nxsem_init(&g_rngdev.rd_devsem, 0, 1);
+  nxmutex_init(&g_rngdev.rd_devlock);
   register_driver("/dev/random", &g_rngops, 0444, NULL);
 }
 #endif
@@ -168,7 +168,7 @@ void devrandom_register(void)
 void devurandom_register(void)
 {
 #ifndef CONFIG_DEV_RANDOM
-  nxsem_init(&g_rngdev.rd_devsem, 0, 1);
+  nxmutex_init(&g_rngdev.rd_devlock);
 #endif
   register_driver("/dev/urandom", &g_rngops, 0444, NULL);
 }
diff --git a/arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c b/arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c
index fa0c78896b..b8c4bfc9a0 100644
--- a/arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c
+++ b/arch/arm/src/lpc54xx/lpc54_rtc_lowerhalf.c
@@ -31,6 +31,7 @@
 #include <errno.h>
 
 #include <nuttx/arch.h>
+#include <nuttx/mutex.h>
 #include <nuttx/timers/rtc.h>
 
 #include "arm_internal.h"
@@ -67,7 +68,7 @@ struct lpc54_lowerhalf_s
    * this file.
    */
 
-  sem_t devsem;         /* Threads can only exclusively access the RTC */
+  mutex_t devlock;      /* Threads can only exclusively access the RTC */
 
 #ifdef CONFIG_RTC_ALARM
   /* Alarm callback information */
@@ -307,7 +308,7 @@ static int lpc54_setalarm(struct rtc_lowerhalf_s *lower,
   DEBUGASSERT(lower != NULL && alarminfo != NULL && alarminfo->id == 0);
   priv = (struct lpc54_lowerhalf_s *)lower;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -339,7 +340,7 @@ static int lpc54_setalarm(struct rtc_lowerhalf_s *lower,
         }
     }
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
   return ret;
 }
 #endif
@@ -556,17 +557,16 @@ static int lpc54_setperiodic(struct rtc_lowerhalf_s *lower,
   DEBUGASSERT(lower != NULL && alarminfo != NULL);
   priv = (struct lpc54_lowerhalf_s *)lower;
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
     }
 
   memcpy(&priv->periodic, alarminfo, sizeof(struct lower_setperiodic_s));
-
   ret = lpc54_rtc_setperiodic(&alarminfo->period, lpc54_periodic_callback);
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
   return ret;
 }
 #endif
@@ -598,7 +598,7 @@ static int lpc54_cancelperiodic(struct rtc_lowerhalf_s *lower, int id)
 
   DEBUGASSERT(id == 0);
 
-  ret = nxsem_wait(&priv->devsem);
+  ret = nxmutex_lock(&priv->devlock);
   if (ret < 0)
     {
       return ret;
@@ -606,7 +606,7 @@ static int lpc54_cancelperiodic(struct rtc_lowerhalf_s *lower, int id)
 
   ret = lpc54_rtc_cancelperiodic();
 
-  nxsem_post(&priv->devsem);
+  nxmutex_unlock(&priv->devlock);
   return ret;
 }
 #endif
@@ -639,8 +639,7 @@ static int lpc54_cancelperiodic(struct rtc_lowerhalf_s *lower, int id)
 
 struct rtc_lowerhalf_s *lpc54_rtc_lowerhalf(void)
 {
-  nxsem_init(&g_rtc_lowerhalf.devsem, 0, 1);
-
+  nxmutex_init(&g_rtc_lowerhalf.devlock);
   return (struct rtc_lowerhalf_s *)&g_rtc_lowerhalf;
 }
 
diff --git a/arch/arm/src/lpc54xx/lpc54_sdmmc.c b/arch/arm/src/lpc54xx/lpc54_sdmmc.c
index 429e906c89..30d5784d27 100644
--- a/arch/arm/src/lpc54xx/lpc54_sdmmc.c
+++ b/arch/arm/src/lpc54xx/lpc54_sdmmc.c
@@ -251,8 +251,6 @@ static void lpc54_putreg(uint32_t val, uint32_t addr);
 
 /* Low-level helpers ********************************************************/
 
-static int  lpc54_takesem(struct lpc54_dev_s *priv);
-#define     lpc54_givesem(priv) (nxsem_post(&priv->waitsem))
 static inline void lpc54_setclock(uint32_t clkdiv);
 static inline void lpc54_sdcard_clock(bool enable);
 static int  lpc54_ciu_sendcmd(uint32_t cmd, uint32_t arg);
@@ -493,27 +491,6 @@ static void lpc54_putreg(uint32_t val, uint32_t addr)
 }
 #endif
 
-/****************************************************************************
- * Name: lpc54_takesem
- *
- * Description:
- *   Take the wait semaphore (handling false alarm wakeups due to the receipt
- *   of signals).
- *
- * Input Parameters:
- *   dev - Instance of the SD card device driver state structure.
- *
- * Returned Value:
- *   Normally OK, but may return -ECANCELED in the rare event that the task
- *   has been canceled.
- *
- ****************************************************************************/
-
-static int lpc54_takesem(struct lpc54_dev_s *priv)
-{
-  return nxsem_wait_uninterruptible(&priv->waitsem);
-}
-
 /****************************************************************************
  * Name: lpc54_setclock
  *
@@ -865,7 +842,7 @@ static void lpc54_endwait(struct lpc54_dev_s *priv,
 
   /* Wake up the waiting thread */
 
-  lpc54_givesem(priv);
+  nxsem_post(&priv->waitsem);
 }
 
 /****************************************************************************
@@ -2304,7 +2281,7 @@ static sdio_eventset_t lpc54_eventwait(struct sdio_dev_s *dev)
        * incremented and there will be no wait.
        */
 
-      ret = lpc54_takesem(priv);
+      ret = nxsem_wait_uninterruptible(&priv->waitsem);
       if (ret < 0)
         {
           /* Task canceled.  Cancel the wdog (assuming it was started) and
diff --git a/arch/arm/src/lpc54xx/lpc54_spi_master.c b/arch/arm/src/lpc54xx/lpc54_spi_master.c
index 139011b4fc..e2d7f0dc56 100644
--- a/arch/arm/src/lpc54xx/lpc54_spi_master.c
+++ b/arch/arm/src/lpc54xx/lpc54_spi_master.c
@@ -43,7 +43,7 @@
 
 #include <arch/board/board.h>
 #include <nuttx/arch.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/spi/spi.h>
 
 #include "arm_internal.h"
@@ -82,7 +82,7 @@ struct lpc54_spidev_s
 {
   struct spi_dev_s dev;       /* Externally visible part of the SPI interface */
   uintptr_t base;             /* Base address of Flexcomm registers */
-  sem_t exclsem;              /* Held while chip is selected for mutual exclusion */
+  mutex_t lock;               /* Held while chip is selected for mutual exclusion */
   uint32_t fclock;            /* Flexcomm function clock frequency */
   uint32_t frequency;         /* Requested clock frequency */
   uint32_t actual;            /* Actual clock frequency */
@@ -1254,11 +1254,11 @@ static int lpc54_spi_lock(struct spi_dev_s *dev, bool lock)
 
   if (lock)
     {
-      ret = nxsem_wait_uninterruptible(&priv->exclsem);
+      ret = nxmutex_lock(&priv->lock);
     }
   else
     {
-      ret = nxsem_post(&priv->exclsem);
+      ret = nxmutex_unlock(&priv->lock);
     }
 
   return ret;
@@ -2016,9 +2016,9 @@ struct spi_dev_s *lpc54_spibus_initialize(int port)
   priv->nbits     = 8;
   priv->mode      = SPIDEV_MODE0;
 
-  /* Initialize the SPI semaphore that enforces mutually exclusive access */
+  /* Initialize the SPI mutex that enforces mutually exclusive access */
 
-  nxsem_init(&priv->exclsem, 0, 1);
+  nxmutex_init(&priv->lock);
 
   /* Configure master mode in mode 0:
    *
diff --git a/arch/arm/src/lpc54xx/lpc54_usb0_ohci.c b/arch/arm/src/lpc54xx/lpc54_usb0_ohci.c
index 5e9a04c720..7327ad076a 100644
--- a/arch/arm/src/lpc54xx/lpc54_usb0_ohci.c
+++ b/arch/arm/src/lpc54xx/lpc54_usb0_ohci.c
@@ -36,7 +36,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/signal.h>
-#include <nuttx/semaphore.h>
+#include <nuttx/mutex.h>
 #include <nuttx/usb/usb.h>
 #include <nuttx/usb/ohci.h>
 #include <nuttx/usb/usbhost.h>
@@ -260,7 +260,7 @@ struct lpc54_usbhost_s
   uint8_t          outinterval; /* Minimum periodic IN EP polling interval: 2, 4, 6, 16, or 32 */
 #endif
 
-  sem_t            exclsem;     /* Support mutually exclusive access */
+  mutex_t          lock;        /* Support mutually exclusive access */
   sem_t            pscsem;      /* Semaphore to wait Writeback Done Head event */
 
 #ifdef CONFIG_OHCI_HUB
@@ -366,12 +366,6 @@ static void lpc54_putreg(uint32_t val, uint32_t addr);
 # define lpc54_putreg(val,addr) putreg32(val,addr)
 #endif
 
-/* Semaphores ***************************************************************/
-
-static int  lpc54_takesem(sem_t *sem);
-static int  lpc54_takesem_noncancelable(sem_t *sem);
-#define lpc54_givesem(s) nxsem_post(s);
-
 /* Byte stream access helper functions **************************************/
 
 static inline uint16_t lpc54_getle16(const uint8_t *val);
@@ -676,54 +670,6 @@ static void lpc54_putreg(uint32_t val, uint32_t addr)
 }
 #endif
 
-/****************************************************************************
- * Name: lpc54_takesem
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.
- *
- ****************************************************************************/
-
-static int lpc54_takesem(sem_t *sem)
-{
-  return nxsem_wait_uninterruptible(sem);
-}
-
-/****************************************************************************
- * Name: lpc54_takesem_noncancelable
- *
- * Description:
- *   This is just a wrapper to handle the annoying behavior of semaphore
- *   waits that return due to the receipt of a signal.  This version also
- *   ignores attempts to cancel the thread.
- *
- ****************************************************************************/
-
-static int lpc54_takesem_noncancelable(sem_t *sem)
-{
-  int result;
-  int ret = OK;
-
-  do
-    {
-      result = nxsem_wait_uninterruptible(sem);
-
-      /* The only expected error is ECANCELED which would occur if the
-       * calling thread were canceled.
-       */
-
-      DEBUGASSERT(result == OK || result == -ECANCELED);
-      if (ret == OK && result < 0)
-        {
-          ret = result;
-        }
-    }
-  while (result < 0);
-
-  return ret;
-}
-
 /****************************************************************************
  * Name: lpc54_getle16
  *
@@ -1746,7 +1692,7 @@ static int lpc54_ctrltd(struct lpc54_usbhost_s *priv, struct lpc54_ed_s *ed,
 
       /* Wait for the Writeback Done Head interrupt */
 
-      ret = lpc54_takesem(&ed->wdhsem);
+      ret = nxsem_wait_uninterruptible(&ed->wdhsem);
       if (ret < 0)
         {
           /* Task has been canceled */
@@ -1843,7 +1789,7 @@ static int lpc54_usbinterrupt(int irq, void *context, void *arg)
 
                           if (priv->pscwait)
                             {
-                              lpc54_givesem(&priv->pscsem);
+                              nxsem_post(&priv->pscsem);
                               priv->pscwait = false;
                             }
                         }
@@ -1902,7 +1848,7 @@ static int lpc54_usbinterrupt(int irq, void *context, void *arg)
 
                       if (priv->pscwait)
                         {
-                          lpc54_givesem(&priv->pscsem);
+                          nxsem_post(&priv->pscsem);
                           priv->pscwait = false;
                         }
                     }
@@ -2037,7 +1983,7 @@ static int lpc54_usbinterrupt(int irq, void *context, void *arg)
                     {
                       /* Wake up the thread waiting for the WDH event */
 
-                      lpc54_givesem(&ed->wdhsem);
+                      nxsem_post(&ed->wdhsem);
                       xfrinfo->wdhwait = false;
                     }
 
@@ -2162,7 +2108,7 @@ static int lpc54_wait(struct usbhost_connection_s *conn,
       /* Wait for the next connection event */
 
       priv->pscwait = true;
-      ret = lpc54_takesem(&priv->pscsem);
+      ret = nxsem_wait_uninterruptible(&priv->pscsem);
       if (ret < 0)
         {
           return ret;
@@ -2315,7 +2261,7 @@ static int lpc54_ep0configure(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to EP0 and the control list */
 
-  ret = lpc54_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2333,8 +2279,7 @@ static int lpc54_ep0configure(struct usbhost_driver_s *drvr,
     }
 
   ed->hw.ctrl = hwctrl;
-
-  lpc54_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
 
   uinfo("EP0 CTRL:%08x\n", ed->hw.ctrl);
   return OK;
@@ -2381,7 +2326,7 @@ static int lpc54_epalloc(struct usbhost_driver_s *drvr,
    * periodic list, and the interrupt table.
    */
 
-  ret = lpc54_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2504,7 +2449,7 @@ static int lpc54_epalloc(struct usbhost_driver_s *drvr,
         }
     }
 
-  lpc54_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2543,7 +2488,7 @@ static int lpc54_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
    * periodic list and the interrupt table.
    */
 
-  ret = lpc54_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2581,7 +2526,7 @@ static int lpc54_epfree(struct usbhost_driver_s *drvr, usbhost_ep_t ep)
   /* Put the ED back into the free list */
 
   lpc54_edfree(ed);
-  lpc54_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
 }
 
@@ -2627,7 +2572,7 @@ static int lpc54_alloc(struct usbhost_driver_s *drvr,
 
   /* We must have exclusive access to the transfer buffer pool */
 
-  ret = lpc54_takesem(&priv->exclsem);
+  ret = nxmutex_lock(&priv->lock);
   if (ret < 0)
     {
       return ret;
@@ -2642,7 +2587,7 @@ static int lpc54_alloc(struct usbhost_driver_s *drvr,
       ret = OK;
     }
 
-  lpc54_givesem(&priv->exclsem);
+  nxmutex_unlock(&priv->lock);
   return ret;
... 62289 lines suppressed ...


[incubator-nuttx] 02/03: arch: Replace critical section with nxmutex in i2c/spi/1wire initialization

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit dee38ce3e8b0711e2e8096a7d95160b23d9b299f
Author: anjiahao <an...@xiaomi.com>
AuthorDate: Tue Sep 6 14:18:45 2022 +0800

    arch: Replace critical section with nxmutex in i2c/spi/1wire initialization
    
    Signed-off-by: anjiahao <an...@xiaomi.com>
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 arch/arm/src/am335x/am335x_i2c.c           | 22 ++++++--------
 arch/arm/src/cxd56xx/cxd56_i2c.c           | 17 +++++------
 arch/arm/src/efm32/efm32_i2c.c             | 17 ++++-------
 arch/arm/src/imxrt/imxrt_lpi2c.c           | 20 +++++--------
 arch/arm/src/kinetis/kinetis_i2c.c         | 18 +++++-------
 arch/arm/src/lc823450/lc823450_i2c.c       | 18 +++++-------
 arch/arm/src/lpc54xx/lpc54_dma.c           |  4 +--
 arch/arm/src/nrf52/nrf52_i2c.c             | 15 ++++------
 arch/arm/src/rp2040/rp2040_i2c.c           | 17 +++++------
 arch/arm/src/s32k1xx/s32k1xx_lpi2c.c       | 20 +++++--------
 arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c |  2 +-
 arch/arm/src/s32k3xx/s32k3xx_lpi2c.c       | 20 +++++--------
 arch/arm/src/sama5/sam_ssc.c               |  8 +++---
 arch/arm/src/samv7/sam_ssc.c               |  8 +++---
 arch/arm/src/samv7/sam_twihs.c             | 15 ++++------
 arch/arm/src/stm32/stm32_1wire.c           | 14 +++------
 arch/arm/src/stm32/stm32_dma2d.c           |  2 +-
 arch/arm/src/stm32/stm32_i2c.c             | 19 +++++-------
 arch/arm/src/stm32/stm32_i2c_alt.c         | 17 ++++-------
 arch/arm/src/stm32/stm32_i2c_v2.c          | 46 ++++++++++++------------------
 arch/arm/src/stm32/stm32_i2s.c             |  8 +++---
 arch/arm/src/stm32/stm32f40xxx_i2c.c       | 19 +++++-------
 arch/arm/src/stm32f0l0g0/stm32_i2c.c       | 43 ++++++++++++----------------
 arch/arm/src/stm32f7/stm32_i2c.c           | 43 ++++++++++++----------------
 arch/arm/src/stm32f7/stm32_sai.c           |  8 +++---
 arch/arm/src/stm32h7/stm32_i2c.c           | 44 ++++++++++++----------------
 arch/arm/src/stm32l4/stm32l4_1wire.c       | 26 ++++++-----------
 arch/arm/src/stm32l4/stm32l4_i2c.c         | 44 ++++++++++++----------------
 arch/arm/src/stm32l4/stm32l4_sai.c         |  8 +++---
 arch/arm/src/tiva/common/tiva_i2c.c        | 14 ++++-----
 arch/mips/src/pic32mz/pic32mz_i2c.c        | 19 +++++-------
 arch/renesas/src/rx65n/rx65n_riic.c        | 19 ++++++------
 arch/risc-v/src/bl602/bl602_i2c.c          | 21 +++++---------
 arch/risc-v/src/bl602/bl602_spi.c          | 28 +++++++-----------
 arch/risc-v/src/esp32c3/esp32c3_i2c.c      | 25 +++++++---------
 arch/risc-v/src/esp32c3/esp32c3_spi.c      | 27 ++++++------------
 arch/risc-v/src/mpfs/mpfs_i2c.c            | 28 ++++++++----------
 arch/risc-v/src/mpfs/mpfs_spi.c            | 22 ++++++--------
 arch/xtensa/src/esp32s2/esp32s2_i2c.c      | 26 +++++++----------
 arch/xtensa/src/esp32s2/esp32s2_spi.c      | 17 ++++-------
 arch/xtensa/src/esp32s3/esp32s3_spi.c      | 26 ++++++-----------
 drivers/input/nunchuck.c                   |  8 +++---
 drivers/leds/userled_upper.c               |  4 +--
 fs/mount/fs_automount.c                    |  8 +++---
 fs/nxffs/nxffs_ioctl.c                     |  4 +--
 fs/nxffs/nxffs_open.c                      | 20 ++++++-------
 fs/nxffs/nxffs_read.c                      |  6 ++--
 47 files changed, 347 insertions(+), 537 deletions(-)

diff --git a/arch/arm/src/am335x/am335x_i2c.c b/arch/arm/src/am335x/am335x_i2c.c
index 5df0429d18..815cf289a0 100644
--- a/arch/arm/src/am335x/am335x_i2c.c
+++ b/arch/arm/src/am335x/am335x_i2c.c
@@ -247,7 +247,7 @@ static inline void am335x_i2c_sendstop(struct am335x_i2c_priv_s *priv);
 static inline uint32_t
 am335x_i2c_getstatus(struct am335x_i2c_priv_s *priv);
 
-static int am335x_i2c_isr_process(struct am335x_i2c_priv_s * priv);
+static int am335x_i2c_isr_process(struct am335x_i2c_priv_s *priv);
 
 #ifndef CONFIG_I2C_POLLED
 static int am335x_i2c_isr(int irq, void *context, void *arg);
@@ -1576,8 +1576,7 @@ out:
 
 struct i2c_master_s *am335x_i2cbus_initialize(int port)
 {
-  struct am335x_i2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct am335x_i2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -1606,15 +1605,13 @@ struct i2c_master_s *am335x_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       am335x_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1629,7 +1626,6 @@ struct i2c_master_s *am335x_i2cbus_initialize(int port)
 int am335x_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct am335x_i2c_priv_s *priv = (struct am335x_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1640,19 +1636,17 @@ int am335x_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs > 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   am335x_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/cxd56xx/cxd56_i2c.c b/arch/arm/src/cxd56xx/cxd56_i2c.c
index 931a6e57f4..1a9bd668c7 100644
--- a/arch/arm/src/cxd56xx/cxd56_i2c.c
+++ b/arch/arm/src/cxd56xx/cxd56_i2c.c
@@ -933,10 +933,6 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 {
   struct cxd56_i2cdev_s *priv;
 
-  irqstate_t flags;
-
-  flags = enter_critical_section();
-
 #ifdef CONFIG_CXD56_I2C0
   if (port == 0)
     {
@@ -970,18 +966,17 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
   else
 #endif
     {
-      leave_critical_section(flags);
       i2cerr("I2C Only support 0,1,2\n");
       return NULL;
     }
 
-  priv->refs++;
+  nxmutex_lock(&priv->lock);
 
   /* Test if already initialized or not */
 
-  if (1 < priv->refs)
+  if (1 < ++priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return &priv->dev;
     }
 
@@ -1011,8 +1006,6 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 
   cxd56_i2c_setfrequency(priv, I2C_DEFAULT_FREQUENCY);
 
-  leave_critical_section(flags);
-
   /* Configure pin */
 
   cxd56_i2c_pincontrol(port, true);
@@ -1037,6 +1030,7 @@ struct i2c_master_s *cxd56_i2cbus_initialize(int port)
 
   cxd56_i2c_clock_gate_enable(port);
 
+  nxmutex_unlock(&priv->lock);
   return &priv->dev;
 }
 
@@ -1059,8 +1053,10 @@ int cxd56_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
@@ -1079,6 +1075,7 @@ int cxd56_i2cbus_uninitialize(struct i2c_master_s *dev)
   irq_detach(priv->irqid);
 
   wd_cancel(&priv->timeout);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/efm32/efm32_i2c.c b/arch/arm/src/efm32/efm32_i2c.c
index 8538771e2d..eaa1b89766 100644
--- a/arch/arm/src/efm32/efm32_i2c.c
+++ b/arch/arm/src/efm32/efm32_i2c.c
@@ -1615,7 +1615,6 @@ out:
 struct i2c_master_s *efm32_i2cbus_initialize(int port)
 {
   struct efm32_i2c_priv_s *priv = NULL;
-  irqstate_t flags;
 
   /* Get I2C private structure */
 
@@ -1641,14 +1640,13 @@ struct i2c_master_s *efm32_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       efm32_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1663,7 +1661,6 @@ struct i2c_master_s *efm32_i2cbus_initialize(int port)
 int efm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct efm32_i2c_priv_s *priv = (struct efm32_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1674,19 +1671,17 @@ int efm32_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   efm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/imxrt/imxrt_lpi2c.c b/arch/arm/src/imxrt/imxrt_lpi2c.c
index 6cc97bbac7..0de70bd9e4 100644
--- a/arch/arm/src/imxrt/imxrt_lpi2c.c
+++ b/arch/arm/src/imxrt/imxrt_lpi2c.c
@@ -2257,8 +2257,7 @@ out:
 
 struct i2c_master_s *imxrt_i2cbus_initialize(int port)
 {
-  struct imxrt_lpi2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct imxrt_lpi2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -2292,9 +2291,8 @@ struct i2c_master_s *imxrt_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       imxrt_lpi2c_init(priv);
 
@@ -2308,8 +2306,7 @@ struct i2c_master_s *imxrt_i2cbus_initialize(int port)
 #endif
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -2324,7 +2321,6 @@ struct i2c_master_s *imxrt_i2cbus_initialize(int port)
 int imxrt_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct imxrt_lpi2c_priv_s *priv = (struct imxrt_lpi2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -2335,16 +2331,13 @@ int imxrt_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs > 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
 #ifdef CONFIG_IMXRT_LPI2C_DMA
@@ -2357,6 +2350,7 @@ int imxrt_i2cbus_uninitialize(struct i2c_master_s *dev)
 #endif
 
   imxrt_lpi2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/kinetis/kinetis_i2c.c b/arch/arm/src/kinetis/kinetis_i2c.c
index 14da11ac21..696c4fe5c8 100644
--- a/arch/arm/src/kinetis/kinetis_i2c.c
+++ b/arch/arm/src/kinetis/kinetis_i2c.c
@@ -1306,7 +1306,6 @@ out:
 struct i2c_master_s *kinetis_i2cbus_initialize(int port)
 {
   struct kinetis_i2cdev_s *priv;
-  irqstate_t flags;
 
   i2cinfo("port=%d\n", port);
 
@@ -1341,14 +1340,13 @@ struct i2c_master_s *kinetis_i2cbus_initialize(int port)
       return NULL;
     }
 
-  flags = enter_critical_section();
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       kinetis_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return &priv->dev;
 }
 
@@ -1363,7 +1361,6 @@ struct i2c_master_s *kinetis_i2cbus_initialize(int port)
 int kinetis_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct kinetis_i2cdev_s *priv = (struct kinetis_i2cdev_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(priv != NULL);
 
@@ -1374,20 +1371,19 @@ int kinetis_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   kinetis_i2c_deinit(priv);
   wd_cancel(&priv->timeout);
+
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
diff --git a/arch/arm/src/lc823450/lc823450_i2c.c b/arch/arm/src/lc823450/lc823450_i2c.c
index 36e82cda61..a7591522ef 100644
--- a/arch/arm/src/lc823450/lc823450_i2c.c
+++ b/arch/arm/src/lc823450/lc823450_i2c.c
@@ -1069,7 +1069,6 @@ exit:
 struct i2c_master_s *lc823450_i2cbus_initialize(int port)
 {
   struct lc823450_i2c_priv_s *priv = NULL;
-  irqstate_t flags;
 
   switch (port)
     {
@@ -1092,14 +1091,13 @@ struct i2c_master_s *lc823450_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       lc823450_i2c_init(priv, port);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1114,7 +1112,6 @@ struct i2c_master_s *lc823450_i2cbus_initialize(int port)
 int lc823450_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct lc823450_i2c_priv_s *priv = (struct lc823450_i2c_priv_s *)dev;
-  irqstate_t flags;
   int port = -1;
 
   DEBUGASSERT(dev);
@@ -1126,16 +1123,13 @@ int lc823450_i2cbus_uninitialize(struct i2c_master_s *dev)
       return OK;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
 #ifdef CONFIG_LC823450_I2C0
   if (priv == &lc823450_i2c0_priv)
     {
@@ -1153,12 +1147,14 @@ int lc823450_i2cbus_uninitialize(struct i2c_master_s *dev)
   if (-1 == port)
     {
       DEBUGPANIC();
+      nxmutex_unlock(&priv->lock);
       return -EFAULT;
     }
 
   /* Disable power and other HW resource */
 
   lc823450_i2c_deinit(priv, port);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/lpc54xx/lpc54_dma.c b/arch/arm/src/lpc54xx/lpc54_dma.c
index 79658d39c4..39ad7a8269 100644
--- a/arch/arm/src/lpc54xx/lpc54_dma.c
+++ b/arch/arm/src/lpc54xx/lpc54_dma.c
@@ -308,7 +308,7 @@ int lpc54_dma_setup(int ch, uint32_t cfg, uint32_t xfrcfg, uint8_t trigsrc,
   if (dmach->inuse)
     {
       ret = -EBUSY;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   dmach->inuse = true;
@@ -438,7 +438,7 @@ int lpc54_dma_setup(int ch, uint32_t cfg, uint32_t xfrcfg, uint8_t trigsrc,
   putreg32(xfrcfg, base + LPC54_DMA_XFERCFG_OFFSET);
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&g_dma.lock);
   return ret;
 }
diff --git a/arch/arm/src/nrf52/nrf52_i2c.c b/arch/arm/src/nrf52/nrf52_i2c.c
index a7a5fcfa2c..2d6f5c57ac 100644
--- a/arch/arm/src/nrf52/nrf52_i2c.c
+++ b/arch/arm/src/nrf52/nrf52_i2c.c
@@ -780,8 +780,7 @@ struct i2c_master_s *nrf52_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs++ == 0)
     {
       /* Initialize I2C */
@@ -789,8 +788,7 @@ struct i2c_master_s *nrf52_i2cbus_initialize(int port)
       nrf52_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -805,7 +803,6 @@ struct i2c_master_s *nrf52_i2cbus_initialize(int port)
 int nrf52_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct nrf52_i2c_priv_s *priv = (struct nrf52_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -816,19 +813,17 @@ int nrf52_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   nrf52_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/rp2040/rp2040_i2c.c b/arch/arm/src/rp2040/rp2040_i2c.c
index fc82650926..f53fc24d11 100644
--- a/arch/arm/src/rp2040/rp2040_i2c.c
+++ b/arch/arm/src/rp2040/rp2040_i2c.c
@@ -854,10 +854,6 @@ struct i2c_master_s *rp2040_i2cbus_initialize(int port)
 {
   struct rp2040_i2cdev_s *priv;
 
-  irqstate_t flags;
-
-  flags = enter_critical_section();
-
 #ifdef CONFIG_RP2040_I2C0
   if (port == 0)
     {
@@ -875,18 +871,17 @@ struct i2c_master_s *rp2040_i2cbus_initialize(int port)
   else
 #endif
     {
-      leave_critical_section(flags);
       i2cerr("I2C Only support 0,1\n");
       return NULL;
     }
 
-  priv->refs++;
+  nxmutex_lock(&priv->lock);
 
   /* Test if already initialized or not */
 
-  if (1 < priv->refs)
+  if (1 < ++priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return &priv->dev;
     }
 
@@ -899,8 +894,6 @@ struct i2c_master_s *rp2040_i2cbus_initialize(int port)
   rp2040_i2c_init(priv);
   rp2040_i2c_setfrequency(priv, I2C_DEFAULT_FREQUENCY);
 
-  leave_critical_section(flags);
-
   /* Attach Interrupt Handler */
 
   irq_attach(priv->irqid, rp2040_i2c_interrupt, priv);
@@ -909,6 +902,7 @@ struct i2c_master_s *rp2040_i2cbus_initialize(int port)
 
   up_enable_irq(priv->irqid);
 
+  nxmutex_unlock(&priv->lock);
   return &priv->dev;
 }
 
@@ -931,8 +925,10 @@ int rp2040_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
@@ -942,6 +938,7 @@ int rp2040_i2cbus_uninitialize(struct i2c_master_s *dev)
   irq_detach(priv->irqid);
 
   wd_cancel(&priv->timeout);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/s32k1xx/s32k1xx_lpi2c.c b/arch/arm/src/s32k1xx/s32k1xx_lpi2c.c
index 548a87248d..2cb85b777c 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_lpi2c.c
+++ b/arch/arm/src/s32k1xx/s32k1xx_lpi2c.c
@@ -2156,8 +2156,7 @@ out:
 
 struct i2c_master_s *s32k1xx_i2cbus_initialize(int port)
 {
-  struct s32k1xx_lpi2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct s32k1xx_lpi2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -2183,9 +2182,8 @@ struct i2c_master_s *s32k1xx_i2cbus_initialize(int port)
    * power-up hardware and configure pins.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       s32k1xx_lpi2c_init(priv);
 
@@ -2206,8 +2204,7 @@ struct i2c_master_s *s32k1xx_i2cbus_initialize(int port)
 #endif
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -2222,7 +2219,6 @@ struct i2c_master_s *s32k1xx_i2cbus_initialize(int port)
 int s32k1xx_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct s32k1xx_lpi2c_priv_s *priv = (struct s32k1xx_lpi2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -2233,16 +2229,13 @@ int s32k1xx_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs > 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
 #ifdef CONFIG_S32K1XX_LPI2C_DMA
@@ -2262,6 +2255,7 @@ int s32k1xx_i2cbus_uninitialize(struct i2c_master_s *dev)
 #endif
 
   s32k1xx_lpi2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c b/arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c
index 4d253a7c35..c88e334725 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c
+++ b/arch/arm/src/s32k1xx/s32k1xx_lpi2c_slave.c
@@ -862,7 +862,7 @@ struct i2c_slave_s *s32k1xx_i2cbus_slave_initialize(int port)
 
   flags = enter_critical_section();
 
-  if ((volatile int) priv->refs == 0)
+  if (priv->refs == 0)
     {
       /* Initialize private data for the first time, increment reference
        * count, power-up hardware and configure pins.
diff --git a/arch/arm/src/s32k3xx/s32k3xx_lpi2c.c b/arch/arm/src/s32k3xx/s32k3xx_lpi2c.c
index d56bbfad8f..5bb1673cbf 100644
--- a/arch/arm/src/s32k3xx/s32k3xx_lpi2c.c
+++ b/arch/arm/src/s32k3xx/s32k3xx_lpi2c.c
@@ -1673,8 +1673,7 @@ out:
 
 struct i2c_master_s *s32k3xx_i2cbus_initialize(int port)
 {
-  struct s32k3xx_lpi2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct s32k3xx_lpi2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -1700,15 +1699,13 @@ struct i2c_master_s *s32k3xx_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       s32k3xx_lpi2c_init(priv);
     }
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1723,7 +1720,6 @@ struct i2c_master_s *s32k3xx_i2cbus_initialize(int port)
 int s32k3xx_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct s32k3xx_lpi2c_priv_s *priv = (struct s32k3xx_lpi2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1734,19 +1730,17 @@ int s32k3xx_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs > 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   s32k3xx_lpi2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/sama5/sam_ssc.c b/arch/arm/src/sama5/sam_ssc.c
index 52581364c6..67729c568c 100644
--- a/arch/arm/src/sama5/sam_ssc.c
+++ b/arch/arm/src/sama5/sam_ssc.c
@@ -2164,7 +2164,7 @@ static int ssc_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SSC%d has no receiver\n", priv->sscno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -2195,7 +2195,7 @@ static int ssc_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
@@ -2387,7 +2387,7 @@ static int ssc_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SSC%d has no transmitter\n", priv->sscno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -2418,7 +2418,7 @@ static int ssc_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
diff --git a/arch/arm/src/samv7/sam_ssc.c b/arch/arm/src/samv7/sam_ssc.c
index 55bb38ff6c..43e6ced60c 100644
--- a/arch/arm/src/samv7/sam_ssc.c
+++ b/arch/arm/src/samv7/sam_ssc.c
@@ -2147,7 +2147,7 @@ static int ssc_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SSC%d has no receiver\n", priv->sscno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -2178,7 +2178,7 @@ static int ssc_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
@@ -2373,7 +2373,7 @@ static int ssc_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SSC%d has no transmitter\n", priv->sscno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -2404,7 +2404,7 @@ static int ssc_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
diff --git a/arch/arm/src/samv7/sam_twihs.c b/arch/arm/src/samv7/sam_twihs.c
index 9165ae1d2f..8ee6f67475 100644
--- a/arch/arm/src/samv7/sam_twihs.c
+++ b/arch/arm/src/samv7/sam_twihs.c
@@ -1363,7 +1363,6 @@ struct i2c_master_s *sam_i2cbus_initialize(int bus)
   struct twi_dev_s *priv;
   uint32_t frequency;
   const struct twi_attr_s *attr = 0;
-  irqstate_t flags;
   int ret;
 
   i2cinfo("Initializing TWIHS%d\n", bus);
@@ -1415,11 +1414,11 @@ struct i2c_master_s *sam_i2cbus_initialize(int bus)
       return NULL;
     }
 
-  flags = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
   /* Has the device already been initialized? */
 
-  if ((volatile int)priv->refs++ == 0)
+  if (priv->refs++ == 0)
     {
       /* Perform one-time TWIHS initialization */
 
@@ -1443,12 +1442,12 @@ struct i2c_master_s *sam_i2cbus_initialize(int bus)
       twi_hw_initialize(priv, frequency);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return &priv->dev;
 
 errout_with_lock:
   priv->refs--;
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return NULL;
 }
 
@@ -1463,7 +1462,6 @@ errout_with_lock:
 int sam_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct twi_dev_s *priv = (struct twi_dev_s *) dev;
-  irqstate_t flags;
 
   DEBUGASSERT(priv);
 
@@ -1478,8 +1476,7 @@ int sam_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   /* Disable TWIHS interrupts */
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs == 0)
     {
       up_disable_irq(priv->attr->irq);
@@ -1493,7 +1490,7 @@ int sam_i2cbus_uninitialize(struct i2c_master_s *dev)
       irq_detach(priv->attr->irq);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
diff --git a/arch/arm/src/stm32/stm32_1wire.c b/arch/arm/src/stm32/stm32_1wire.c
index 4351a9ae2c..8075d27f3b 100644
--- a/arch/arm/src/stm32/stm32_1wire.c
+++ b/arch/arm/src/stm32/stm32_1wire.c
@@ -1165,7 +1165,6 @@ struct onewire_dev_s *stm32_1wireinitialize(int port)
 {
   struct stm32_1wire_priv_s *priv = NULL;  /* Private data of device with multiple instances */
   struct stm32_1wire_inst_s *inst = NULL;  /* Device, single instance */
-  int irqs;
 
   /* Get 1-Wire private structure */
 
@@ -1232,14 +1231,13 @@ struct onewire_dev_s *stm32_1wireinitialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs++ == 0)
     {
       stm32_1wire_init(priv);
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct onewire_dev_s *)inst;
 }
 
@@ -1261,7 +1259,6 @@ struct onewire_dev_s *stm32_1wireinitialize(int port)
 int stm32_1wireuninitialize(struct onewire_dev_s *dev)
 {
   struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
-  int irqs;
 
   DEBUGASSERT(priv);
 
@@ -1272,17 +1269,14 @@ int stm32_1wireuninitialize(struct onewire_dev_s *dev)
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(priv);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
   /* Disable power and other HW resource (GPIO's) */
 
   stm32_1wire_deinit(priv);
diff --git a/arch/arm/src/stm32/stm32_dma2d.c b/arch/arm/src/stm32/stm32_dma2d.c
index dbb257c4c7..d773b60ba6 100644
--- a/arch/arm/src/stm32/stm32_dma2d.c
+++ b/arch/arm/src/stm32/stm32_dma2d.c
@@ -111,7 +111,7 @@ struct stm32_dma2d_s
   uint32_t *clut;              /* Color lookup table */
 #endif
 
-  mutex_t   *lock;             /* Ensure mutually exclusive access */
+  mutex_t  *lock;              /* Ensure mutually exclusive access */
 };
 
 /* Interrupt handling */
diff --git a/arch/arm/src/stm32/stm32_i2c.c b/arch/arm/src/stm32/stm32_i2c.c
index 83da24ba58..d5778a3718 100644
--- a/arch/arm/src/stm32/stm32_i2c.c
+++ b/arch/arm/src/stm32/stm32_i2c.c
@@ -1855,8 +1855,7 @@ out:
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct stm32_i2c_priv_s *priv = NULL;
 
 #if STM32_PCLK1_FREQUENCY < 4000000
 #   warning STM32_I2C_INIT: Peripheral clock must be at least 4 MHz to support 400 kHz operation.
@@ -1894,14 +1893,13 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1916,7 +1914,6 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct stm32_i2c_priv_s *priv = (struct stm32_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1927,19 +1924,17 @@ int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/stm32/stm32_i2c_alt.c b/arch/arm/src/stm32/stm32_i2c_alt.c
index 114a17cfe7..5ac233b847 100644
--- a/arch/arm/src/stm32/stm32_i2c_alt.c
+++ b/arch/arm/src/stm32/stm32_i2c_alt.c
@@ -2368,7 +2368,6 @@ out:
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
   struct stm32_i2c_priv_s *priv = NULL;
-  irqstate_t flags;
 
 #if STM32_PCLK1_FREQUENCY < 4000000
 #   warning STM32_I2C_INIT: Peripheral clock must be at least 4 MHz to support 400 kHz operation.
@@ -2406,14 +2405,13 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -2428,7 +2426,6 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct stm32_i2c_priv_s *priv = (struct stm32_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -2439,19 +2436,17 @@ int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/arm/src/stm32/stm32_i2c_v2.c b/arch/arm/src/stm32/stm32_i2c_v2.c
index 33cdf7a623..4ebc98b31b 100644
--- a/arch/arm/src/stm32/stm32_i2c_v2.c
+++ b/arch/arm/src/stm32/stm32_i2c_v2.c
@@ -2703,12 +2703,8 @@ static int stm32_i2c_pm_prepare(struct pm_callback_s *cb, int domain,
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;  /* private data of device with multiple instances */
-  struct stm32_i2c_inst_s * inst = NULL;  /* device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
+  struct stm32_i2c_priv_s *priv = NULL;  /* private data of device with multiple instances */
+  struct stm32_i2c_inst_s *inst = NULL;  /* device, single instance */
 
 #if STM32_HSI_FREQUENCY != 8000000 || defined(INVALID_CLOCK_SOURCE)
 #  warning STM32_I2C_INIT: Peripheral clock is HSI and it must be 16mHz or the speed/timing calculations need to be redone.
@@ -2752,29 +2748,26 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32_i2c_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32_i2c_ops;
+  inst->priv = priv;
 
   /* Init private data for the first time, increment refs count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
 
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)inst;
 }
 
@@ -2786,41 +2779,38 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
  *
  ****************************************************************************/
 
-int stm32_i2cbus_uninitialize(struct i2c_master_s * dev)
+int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t irqs;
+  struct stm32_i2c_priv_s *priv;
 
   DEBUGASSERT(dev);
+  priv = ((struct stm32_i2c_inst_s *)dev)->priv;
 
   /* Decrement refs and check for underflow */
 
-  if (((struct stm32_i2c_inst_s *)dev)->priv->refs == 0)
+  if (priv->refs == 0)
     {
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
-  if (--((struct stm32_i2c_inst_s *)dev)->priv->refs)
+  nxmutex_lock(&priv->lock);
+  if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(dev);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
-  pm_unregister(&((struct stm32_i2c_inst_s *)dev)->priv->pm_cb);
+  pm_unregister(&priv->pm_cb);
 #endif
 
   /* Disable power and other HW resource (GPIO's) */
 
-  stm32_i2c_deinit(((struct stm32_i2c_inst_s *)dev)->priv);
-
-  /* Release unused resources */
+  stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   kmm_free(dev);
   return OK;
diff --git a/arch/arm/src/stm32/stm32_i2s.c b/arch/arm/src/stm32/stm32_i2s.c
index 90a6ff1703..d078669741 100644
--- a/arch/arm/src/stm32/stm32_i2s.c
+++ b/arch/arm/src/stm32/stm32_i2s.c
@@ -1853,7 +1853,7 @@ static int stm32_i2s_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: I2S%d has no receiver\n", priv->i2sno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -1883,7 +1883,7 @@ static int stm32_i2s_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
@@ -2065,7 +2065,7 @@ static int stm32_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: I2S%d has no transmitter\n", priv->i2sno);
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Add a reference to the audio buffer */
@@ -2095,7 +2095,7 @@ static int stm32_i2s_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
 
 errout_with_buf:
diff --git a/arch/arm/src/stm32/stm32f40xxx_i2c.c b/arch/arm/src/stm32/stm32f40xxx_i2c.c
index b979860834..c6cff03f6b 100644
--- a/arch/arm/src/stm32/stm32f40xxx_i2c.c
+++ b/arch/arm/src/stm32/stm32f40xxx_i2c.c
@@ -2583,8 +2583,7 @@ out:
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct stm32_i2c_priv_s *priv = NULL;
 
 #if STM32_PCLK1_FREQUENCY < 4000000
 #   warning STM32_I2C_INIT: Peripheral clock must be at least 4 MHz to support 400 kHz operation.
@@ -2622,9 +2621,8 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
 
@@ -2645,7 +2643,7 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 #endif /* CONFIG_STM32_I2C_DMA */
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -2660,7 +2658,6 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct stm32_i2c_priv_s *priv = (struct stm32_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -2671,16 +2668,13 @@ int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   stm32_i2c_deinit(priv);
@@ -2690,6 +2684,7 @@ int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
   stm32_dmafree(priv->txdma);
 #endif
 
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
diff --git a/arch/arm/src/stm32f0l0g0/stm32_i2c.c b/arch/arm/src/stm32f0l0g0/stm32_i2c.c
index cc826af67a..16ac57daee 100644
--- a/arch/arm/src/stm32f0l0g0/stm32_i2c.c
+++ b/arch/arm/src/stm32f0l0g0/stm32_i2c.c
@@ -2699,12 +2699,8 @@ static int stm32_i2c_pm_prepare(struct pm_callback_s *cb, int domain,
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;  /* private data of device with multiple instances */
-  struct stm32_i2c_inst_s * inst = NULL;  /* device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
+  struct stm32_i2c_priv_s *priv = NULL;  /* private data of device with multiple instances */
+  struct stm32_i2c_inst_s *inst = NULL;  /* device, single instance */
 
 #if 0                           /* REVISIT: this is not true for all STM32 M0 */
 #if STM32_HSI_FREQUENCY != 8000000 || defined(INVALID_CLOCK_SOURCE)
@@ -2750,29 +2746,27 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32_i2c_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32_i2c_ops;
+  inst->priv = priv;
 
   /* Init private data for the first time, increment refs count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
-  if ((volatile int)priv->refs++ == 0)
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
 
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)inst;
 }
 
@@ -2784,39 +2778,38 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
  *
  ****************************************************************************/
 
-int stm32_i2cbus_uninitialize(struct i2c_master_s * dev)
+int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t irqs;
+  struct stm32_i2c_priv_s *priv;
 
   DEBUGASSERT(dev);
+  priv = ((struct stm32_i2c_inst_s *)dev)->priv;
 
   /* Decrement refs and check for underflow */
 
-  if (((struct stm32_i2c_inst_s *)dev)->priv->refs == 0)
+  if (priv->refs == 0)
     {
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
-  if (--((struct stm32_i2c_inst_s *)dev)->priv->refs)
+  nxmutex_lock(&priv->lock);
+  if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(dev);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
-  pm_unregister(&((struct stm32_i2c_inst_s *)dev)->priv->pm_cb);
+  pm_unregister(&priv->pm_cb);
 #endif
 
   /* Disable power and other HW resource (GPIO's) */
 
-  stm32_i2c_deinit(((struct stm32_i2c_inst_s *)dev)->priv);
+  stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   kmm_free(dev);
   return OK;
diff --git a/arch/arm/src/stm32f7/stm32_i2c.c b/arch/arm/src/stm32f7/stm32_i2c.c
index bca79cad83..7545a48cd6 100644
--- a/arch/arm/src/stm32f7/stm32_i2c.c
+++ b/arch/arm/src/stm32f7/stm32_i2c.c
@@ -2740,12 +2740,8 @@ static int stm32_i2c_pm_prepare(struct pm_callback_s *cb, int domain,
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;  /* private data of device with multiple instances */
-  struct stm32_i2c_inst_s * inst = NULL;  /* device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
+  struct stm32_i2c_priv_s *priv = NULL;  /* private data of device with multiple instances */
+  struct stm32_i2c_inst_s *inst = NULL;  /* device, single instance */
 
 #if STM32_HSI_FREQUENCY != 16000000 || defined(INVALID_CLOCK_SOURCE)
 # warning STM32_I2C_INIT: Peripheral clock is HSI and it must be 16mHz or the speed/timing calculations need to be redone.
@@ -2789,29 +2785,27 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32_i2c_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32_i2c_ops;
+  inst->priv = priv;
 
   /* Init private data for the first time, increment refs count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
-  if ((volatile int)priv->refs++ == 0)
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
 
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)inst;
 }
 
@@ -2823,39 +2817,38 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
  *
  ****************************************************************************/
 
-int stm32_i2cbus_uninitialize(struct i2c_master_s * dev)
+int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t irqs;
+  struct stm32_i2c_priv_s *priv;
 
   DEBUGASSERT(dev);
+  priv = ((struct stm32_i2c_inst_s *)dev)->priv;
 
   /* Decrement refs and check for underflow */
 
-  if (((struct stm32_i2c_inst_s *)dev)->priv->refs == 0)
+  if (priv->refs == 0)
     {
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
-  if (--((struct stm32_i2c_inst_s *)dev)->priv->refs)
+  nxmutex_lock(&priv->lock);
+  if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(dev);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
-  pm_unregister(&((struct stm32_i2c_inst_s *)dev)->priv->pm_cb);
+  pm_unregister(&priv->pm_cb);
 #endif
 
   /* Disable power and other HW resource (GPIO's) */
 
-  stm32_i2c_deinit(((struct stm32_i2c_inst_s *)dev)->priv);
+  stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   kmm_free(dev);
   return OK;
diff --git a/arch/arm/src/stm32f7/stm32_sai.c b/arch/arm/src/stm32f7/stm32_sai.c
index 37adb33f9c..1b9cf96a3b 100644
--- a/arch/arm/src/stm32f7/stm32_sai.c
+++ b/arch/arm/src/stm32f7/stm32_sai.c
@@ -1228,7 +1228,7 @@ static int sai_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SAI has no receiver\n");
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   mode = priv->syncen ? SAI_CR1_MODE_SLAVE_RX : SAI_CR1_MODE_MASTER_RX;
@@ -1264,7 +1264,7 @@ static int sai_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   sai_buf_free(priv, bfcontainer);
   return ret;
@@ -1328,7 +1328,7 @@ static int sai_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SAI has no transmitter\n");
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   mode = priv->syncen ? SAI_CR1_MODE_SLAVE_TX : SAI_CR1_MODE_MASTER_TX;
@@ -1364,7 +1364,7 @@ static int sai_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   sai_buf_free(priv, bfcontainer);
   return ret;
diff --git a/arch/arm/src/stm32h7/stm32_i2c.c b/arch/arm/src/stm32h7/stm32_i2c.c
index 5086a80807..3043526492 100644
--- a/arch/arm/src/stm32h7/stm32_i2c.c
+++ b/arch/arm/src/stm32h7/stm32_i2c.c
@@ -2704,12 +2704,8 @@ static int stm32_i2c_pm_prepare(struct pm_callback_s *cb, int domain,
 
 struct i2c_master_s *stm32_i2cbus_initialize(int port)
 {
-  struct stm32_i2c_priv_s * priv = NULL;  /* private data of device with multiple instances */
-  struct stm32_i2c_inst_s * inst = NULL;  /* device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
+  struct stm32_i2c_priv_s *priv = NULL;  /* private data of device with multiple instances */
+  struct stm32_i2c_inst_s *inst = NULL;  /* device, single instance */
 
 #if STM32_HSI_FREQUENCY != 16000000 || defined(INVALID_CLOCK_SOURCE)
 #   warning STM32_I2C_INIT: Peripheral clock is HSI and it must be 16mHz or the speed/timing calculations need to be redone.
@@ -2753,29 +2749,26 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32_i2c_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32_i2c_ops;
+  inst->priv = priv;
 
   /* Init private data for the first time, increment refs count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32_i2c_init(priv);
 
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)inst;
 }
 
@@ -2787,39 +2780,38 @@ struct i2c_master_s *stm32_i2cbus_initialize(int port)
  *
  ****************************************************************************/
 
-int stm32_i2cbus_uninitialize(struct i2c_master_s * dev)
+int stm32_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t irqs;
+  struct stm32_i2c_priv_s *priv;
 
   DEBUGASSERT(dev);
+  priv = ((struct stm32_i2c_inst_s *)dev)->priv;
 
   /* Decrement refs and check for underflow */
 
-  if (((struct stm32_i2c_inst_s *)dev)->priv->refs == 0)
+  if (priv->refs == 0)
     {
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
-  if (--((struct stm32_i2c_inst_s *)dev)->priv->refs)
+  nxmutex_lock(&priv->lock);
+  if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(dev);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
-  pm_unregister(&((struct stm32_i2c_inst_s *)dev)->priv->pm_cb);
+  pm_unregister(&priv->pm_cb);
 #endif
 
   /* Disable power and other HW resource (GPIO's) */
 
-  stm32_i2c_deinit(((struct stm32_i2c_inst_s *)dev)->priv);
+  stm32_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   kmm_free(dev);
   return OK;
diff --git a/arch/arm/src/stm32l4/stm32l4_1wire.c b/arch/arm/src/stm32l4/stm32l4_1wire.c
index 0818cfae55..dcb0bbf861 100644
--- a/arch/arm/src/stm32l4/stm32l4_1wire.c
+++ b/arch/arm/src/stm32l4/stm32l4_1wire.c
@@ -1143,10 +1143,6 @@ struct onewire_dev_s *stm32l4_1wireinitialize(int port)
 {
   struct stm32_1wire_priv_s *priv = NULL;  /* Private data of device with multiple instances */
   struct stm32_1wire_inst_s *inst = NULL;  /* Device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
 
   /* Get 1-Wire private structure */
 
@@ -1196,15 +1192,14 @@ struct onewire_dev_s *stm32l4_1wireinitialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32_1wire_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32_1wire_ops;
+  inst->priv = priv;
 
   /* Initialize private data for the first time, increment reference count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs++ == 0)
     {
       stm32_1wire_init(priv);
@@ -1212,13 +1207,11 @@ struct onewire_dev_s *stm32l4_1wireinitialize(int port)
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct onewire_dev_s *)inst;
 }
 
@@ -1240,7 +1233,6 @@ struct onewire_dev_s *stm32l4_1wireinitialize(int port)
 int stm32l4_1wireuninitialize(struct onewire_dev_s *dev)
 {
   struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
-  irqstate_t irqs;
 
   DEBUGASSERT(priv != NULL);
 
@@ -1251,17 +1243,14 @@ int stm32l4_1wireuninitialize(struct onewire_dev_s *dev)
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(priv);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
@@ -1271,6 +1260,7 @@ int stm32l4_1wireuninitialize(struct onewire_dev_s *dev)
   /* Disable power and other HW resource (GPIO's) */
 
   stm32_1wire_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   /* Free instance */
 
diff --git a/arch/arm/src/stm32l4/stm32l4_i2c.c b/arch/arm/src/stm32l4/stm32l4_i2c.c
index 2a35e80a29..98fc9f905a 100644
--- a/arch/arm/src/stm32l4/stm32l4_i2c.c
+++ b/arch/arm/src/stm32l4/stm32l4_i2c.c
@@ -2914,12 +2914,8 @@ static int stm32l4_i2c_pm_prepare(struct pm_callback_s *cb, int domain,
 
 struct i2c_master_s *stm32l4_i2cbus_initialize(int port)
 {
-  struct stm32l4_i2c_priv_s * priv = NULL;  /* private data of device with multiple instances */
-  struct stm32l4_i2c_inst_s * inst = NULL;  /* device, single instance */
-  irqstate_t irqs;
-#ifdef CONFIG_PM
-  int ret;
-#endif
+  struct stm32l4_i2c_priv_s *priv = NULL;  /* private data of device with multiple instances */
+  struct stm32l4_i2c_inst_s *inst = NULL;  /* device, single instance */
 
   /* Get I2C private structure */
 
@@ -2958,29 +2954,26 @@ struct i2c_master_s *stm32l4_i2cbus_initialize(int port)
 
   /* Initialize instance */
 
-  inst->ops       = &stm32l4_i2c_ops;
-  inst->priv      = priv;
+  inst->ops  = &stm32l4_i2c_ops;
+  inst->priv = priv;
 
   /* Init private data for the first time, increment refs count,
    * power-up hardware and configure GPIOs.
    */
 
-  irqs = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       stm32l4_i2c_init(priv);
 
 #ifdef CONFIG_PM
       /* Register to receive power management callbacks */
 
-      ret = pm_register(&priv->pm_cb);
-      DEBUGASSERT(ret == OK);
-      UNUSED(ret);
+      DEBUGVERIFY(pm_register(&priv->pm_cb));
 #endif
     }
 
-  leave_critical_section(irqs);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)inst;
 }
 
@@ -2992,39 +2985,38 @@ struct i2c_master_s *stm32l4_i2cbus_initialize(int port)
  *
  ****************************************************************************/
 
-int stm32l4_i2cbus_uninitialize(struct i2c_master_s * dev)
+int stm32l4_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t irqs;
+  struct stm32l4_i2c_priv_s *priv;
 
   DEBUGASSERT(dev);
+  priv = ((struct stm32l4_i2c_inst_s *)dev)->priv;
 
   /* Decrement refs and check for underflow */
 
-  if (((struct stm32l4_i2c_inst_s *)dev)->priv->refs == 0)
+  if (priv->refs == 0)
     {
       return ERROR;
     }
 
-  irqs = enter_critical_section();
-
-  if (--((struct stm32l4_i2c_inst_s *)dev)->priv->refs)
+  nxmutex_lock(&priv->lock);
+  if (--priv->refs)
     {
-      leave_critical_section(irqs);
+      nxmutex_unlock(&priv->lock);
       kmm_free(dev);
       return OK;
     }
 
-  leave_critical_section(irqs);
-
 #ifdef CONFIG_PM
   /* Unregister power management callbacks */
 
-  pm_unregister(&((struct stm32l4_i2c_inst_s *)dev)->priv->pm_cb);
+  pm_unregister(&priv->pm_cb);
 #endif
 
   /* Disable power and other HW resource (GPIO's) */
 
-  stm32l4_i2c_deinit(((struct stm32l4_i2c_inst_s *)dev)->priv);
+  stm32l4_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   kmm_free(dev);
   return OK;
diff --git a/arch/arm/src/stm32l4/stm32l4_sai.c b/arch/arm/src/stm32l4/stm32l4_sai.c
index cdb4cf6ef4..406ef0caca 100644
--- a/arch/arm/src/stm32l4/stm32l4_sai.c
+++ b/arch/arm/src/stm32l4/stm32l4_sai.c
@@ -967,7 +967,7 @@ static int sai_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SAI has no receiver\n");
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   mode = priv->syncen ? SAI_CR1_MODE_SLAVE_RX : SAI_CR1_MODE_MASTER_RX;
@@ -1003,7 +1003,7 @@ static int sai_receive(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   sai_buf_free(priv, bfcontainer);
   return ret;
@@ -1072,7 +1072,7 @@ static int sai_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
     {
       i2serr("ERROR: SAI has no transmitter\n");
       ret = -EAGAIN;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   mode = priv->syncen ? SAI_CR1_MODE_SLAVE_TX : SAI_CR1_MODE_MASTER_TX;
@@ -1108,7 +1108,7 @@ static int sai_send(struct i2s_dev_s *dev, struct ap_buffer_s *apb,
   nxmutex_unlock(&priv->lock);
   return OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   sai_buf_free(priv, bfcontainer);
   return ret;
diff --git a/arch/arm/src/tiva/common/tiva_i2c.c b/arch/arm/src/tiva/common/tiva_i2c.c
index 2e719739a6..a19f4cb438 100644
--- a/arch/arm/src/tiva/common/tiva_i2c.c
+++ b/arch/arm/src/tiva/common/tiva_i2c.c
@@ -1872,7 +1872,6 @@ struct i2c_master_s *tiva_i2cbus_initialize(int port)
 {
   struct tiva_i2c_priv_s *priv = NULL;
   const struct tiva_i2c_config_s *config;
-  int flags;
 
   i2cinfo("I2C%d: Initialize\n", port);
 
@@ -1963,10 +1962,8 @@ struct i2c_master_s *tiva_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  priv->refs++;
-  if (priv->refs == 1)
+  nxmutex_lock(&priv->lock);
+  if (++priv->refs == 1)
     {
       /* Initialize the device structure */
 
@@ -1977,7 +1974,7 @@ struct i2c_master_s *tiva_i2cbus_initialize(int port)
       tiva_i2c_initialize(priv, 100000);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1992,7 +1989,6 @@ struct i2c_master_s *tiva_i2cbus_initialize(int port)
 int tiva_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct tiva_i2c_priv_s *priv = (struct tiva_i2c_priv_s *)dev;
-  int flags;
 
   DEBUGASSERT(priv && priv->config && priv->refs > 0);
 
@@ -2000,7 +1996,7 @@ int tiva_i2cbus_uninitialize(struct i2c_master_s *dev)
 
   /* Decrement reference count and check for underflow */
 
-  flags = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
   /* Check if the reference count will decrement to zero */
 
@@ -2018,7 +2014,7 @@ int tiva_i2cbus_uninitialize(struct i2c_master_s *dev)
       priv->refs--;
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
diff --git a/arch/mips/src/pic32mz/pic32mz_i2c.c b/arch/mips/src/pic32mz/pic32mz_i2c.c
index 9f94d62de7..1a115bdc10 100644
--- a/arch/mips/src/pic32mz/pic32mz_i2c.c
+++ b/arch/mips/src/pic32mz/pic32mz_i2c.c
@@ -1774,8 +1774,7 @@ out:
 
 struct i2c_master_s *pic32mz_i2cbus_initialize(int port)
 {
-  struct pic32mz_i2c_priv_s * priv = NULL;
-  irqstate_t flags;
+  struct pic32mz_i2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -1818,14 +1817,13 @@ struct i2c_master_s *pic32mz_i2cbus_initialize(int port)
    * power-up hardware and configure GPIOs.
    */
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ == 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ == 0)
     {
       pic32mz_i2c_init(priv);
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
   return (struct i2c_master_s *)priv;
 }
 
@@ -1840,7 +1838,6 @@ struct i2c_master_s *pic32mz_i2cbus_initialize(int port)
 int pic32mz_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct pic32mz_i2c_priv_s *priv = (struct pic32mz_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1851,19 +1848,17 @@ int pic32mz_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable I2C hardware */
 
   pic32mz_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/renesas/src/rx65n/rx65n_riic.c b/arch/renesas/src/rx65n/rx65n_riic.c
index aade22ef21..47fd7a5509 100644
--- a/arch/renesas/src/rx65n/rx65n_riic.c
+++ b/arch/renesas/src/rx65n/rx65n_riic.c
@@ -3034,8 +3034,7 @@ static int rx65n_i2c_reset(FAR struct i2c_master_s *dev)
 
 FAR struct i2c_master_s *rx65n_i2cbus_initialize(int channel)
 {
-  struct rx65n_i2c_priv_s * priv = NULL;
-  irqstate_t irqs;
+  struct rx65n_i2c_priv_s *priv = NULL;
 
   /* Get I2C private structure */
 
@@ -3074,17 +3073,18 @@ FAR struct i2c_master_s *rx65n_i2cbus_initialize(int channel)
    * initialize RIIC registers and attach IRQs
    */
 
-  irqs = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
-  if ((volatile int)priv->refs++ == 0)
+  if (priv->refs++ == 0)
     {
       /* Initialize the RIIC registers */
 
       rx65n_riic_init(priv);
     }
 
-  leave_critical_section(irqs);
   riic_mpc_disable();
+  nxmutex_unlock(&priv->lock);
+
   return (struct i2c_master_s *)priv;
 }
 
@@ -3099,7 +3099,6 @@ FAR struct i2c_master_s *rx65n_i2cbus_initialize(int channel)
 int rx65n_i2cbus_uninitialize(FAR struct i2c_master_s *dev)
 {
   FAR struct rx65n_i2c_priv_s *priv = (struct rx65n_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -3110,16 +3109,13 @@ int rx65n_i2cbus_uninitialize(FAR struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   /* Disable power and other HW resource (GPIO's) */
 
   rx65n_riic_int_disable(priv);
@@ -3129,6 +3125,7 @@ int rx65n_i2cbus_uninitialize(FAR struct i2c_master_s *dev)
   irq_detach(priv->dev->tei_irq);
   irq_detach(priv->dev->eei_irq);
 
+  nxmutex_unlock(&priv->lock);
   return OK;
 }
 
diff --git a/arch/risc-v/src/bl602/bl602_i2c.c b/arch/risc-v/src/bl602/bl602_i2c.c
index 01c197a33a..005480dff6 100644
--- a/arch/risc-v/src/bl602/bl602_i2c.c
+++ b/arch/risc-v/src/bl602/bl602_i2c.c
@@ -943,7 +943,6 @@ static int bl602_i2c_irq(int cpuint, void *context, void *arg)
 
 struct i2c_master_s *bl602_i2cbus_initialize(int port)
 {
-  irqstate_t                       flags;
   struct bl602_i2c_priv_s *        priv;
   const struct bl602_i2c_config_s *config;
 
@@ -960,13 +959,10 @@ struct i2c_master_s *bl602_i2cbus_initialize(int port)
 
   config = priv->config;
 
-  flags = enter_critical_section();
-
-  priv->refs++;
-
-  if (priv->refs > 1)
+  nxmutex_lock(&priv->lock);
+  if (++priv->refs > 1)
   {
-    leave_critical_section(flags);
+    nxmutex_unlock(&priv->lock);
     return (struct i2c_master_s *)priv;
   }
 
@@ -979,7 +975,7 @@ struct i2c_master_s *bl602_i2cbus_initialize(int port)
   bl602_i2c_intmask(I2C_INT_ALL, 1);
   irq_attach(BL602_IRQ_I2C, bl602_i2c_irq, priv);
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
 
   return (struct i2c_master_s *)priv;
 }
@@ -994,7 +990,6 @@ struct i2c_master_s *bl602_i2cbus_initialize(int port)
 
 int bl602_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t flags;
   struct bl602_i2c_priv_s *priv = (struct bl602_i2c_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1004,17 +999,15 @@ int bl602_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   bl602_swrst_ahb_slave1(AHB_SLAVE1_I2C);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/risc-v/src/bl602/bl602_spi.c b/arch/risc-v/src/bl602/bl602_spi.c
index 9d78f17c2d..1c9f0fdbca 100644
--- a/arch/risc-v/src/bl602/bl602_spi.c
+++ b/arch/risc-v/src/bl602/bl602_spi.c
@@ -235,11 +235,12 @@ static struct bl602_spi_priv_s bl602_spi_priv =
 {
   .spi_dev =
   {
-    .ops   = &bl602_spi_ops
+    .ops      = &bl602_spi_ops
   },
-  .config  = &bl602_spi_config,
-  .lock    = NXMUTEX_INITIALIZER,
-  .sem_isr = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+  .config     = &bl602_spi_config,
+  .lock       = NXMUTEX_INITIALIZER,
+  .sem_isr_tx = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
+  .sem_isr_rx = NXSEM_INITIALIZER(0, PRIOINHERIT_FLAGS_DISABLE),
   .dma_rxchan = -1,
   .dma_txchan = -1,
 };
@@ -1652,7 +1653,6 @@ struct spi_dev_s *bl602_spibus_initialize(int port)
 {
   struct spi_dev_s *spi_dev;
   struct bl602_spi_priv_s *priv;
-  irqstate_t flags;
 
   switch (port)
     {
@@ -1667,21 +1667,19 @@ struct spi_dev_s *bl602_spibus_initialize(int port)
 
   spi_dev = (struct spi_dev_s *)priv;
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs != 0)
     {
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
 
       return spi_dev;
     }
 
   bl602_spi_init(spi_dev);
-
   priv->refs++;
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return spi_dev;
 }
 
@@ -1695,7 +1693,6 @@ struct spi_dev_s *bl602_spibus_initialize(int port)
 
 int bl602_spibus_uninitialize(struct spi_dev_s *dev)
 {
-  irqstate_t flags;
   struct bl602_spi_priv_s *priv = (struct bl602_spi_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1705,16 +1702,13 @@ int bl602_spibus_uninitialize(struct spi_dev_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   bl602_spi_deinit(dev);
   return OK;
 }
diff --git a/arch/risc-v/src/esp32c3/esp32c3_i2c.c b/arch/risc-v/src/esp32c3/esp32c3_i2c.c
index 7e73db1513..43b937108e 100644
--- a/arch/risc-v/src/esp32c3/esp32c3_i2c.c
+++ b/arch/risc-v/src/esp32c3/esp32c3_i2c.c
@@ -1452,7 +1452,6 @@ static inline void esp32c3_i2c_process(struct esp32c3_i2c_priv_s *priv,
 
 struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
 {
-  irqstate_t flags;
   struct esp32c3_i2c_priv_s *priv;
 #ifndef CONFIG_I2C_POLLED
   const struct esp32c3_i2c_config_s *config;
@@ -1470,11 +1469,11 @@ struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
       return NULL;
     }
 
-  flags = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
-  if ((volatile int)priv->refs++ != 0)
+  if (priv->refs++ != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
 
       i2cinfo("Returning previously initialized I2C bus. "
               "Handler: %" PRIxPTR "\n", (uintptr_t)priv);
@@ -1498,7 +1497,8 @@ struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
     {
       /* Failed to allocate a CPU interrupt of this type. */
 
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
 
       return NULL;
     }
@@ -1510,7 +1510,8 @@ struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
 
       esp32c3_free_cpuint(config->periph);
       priv->cpuint = -ENOMEM;
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
 
       return NULL;
     }
@@ -1521,8 +1522,7 @@ struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
 #endif
 
   esp32c3_i2c_init(priv);
-
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
 
   i2cinfo("I2C bus initialized! Handler: %" PRIxPTR "\n", (uintptr_t)priv);
 
@@ -1547,7 +1547,6 @@ struct i2c_master_s *esp32c3_i2cbus_initialize(int port)
 
 int esp32c3_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t flags;
   struct esp32c3_i2c_priv_s *priv = (struct esp32c3_i2c_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1557,16 +1556,13 @@ int esp32c3_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
 #ifndef CONFIG_I2C_POLLED
   up_disable_irq(priv->cpuint);
   esp32c3_free_cpuint(priv->config->periph);
@@ -1574,6 +1570,7 @@ int esp32c3_i2cbus_uninitialize(struct i2c_master_s *dev)
 #endif
 
   esp32c3_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/risc-v/src/esp32c3/esp32c3_spi.c b/arch/risc-v/src/esp32c3/esp32c3_spi.c
index 6056f5ff0a..9438e230ea 100644
--- a/arch/risc-v/src/esp32c3/esp32c3_spi.c
+++ b/arch/risc-v/src/esp32c3/esp32c3_spi.c
@@ -1358,7 +1358,6 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
 {
   struct spi_dev_s *spi_dev;
   struct esp32c3_spi_priv_s *priv;
-  irqstate_t flags;
 
   switch (port)
     {
@@ -1373,12 +1372,11 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
 
   spi_dev = (struct spi_dev_s *)priv;
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs != 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs != 0)
     {
-      leave_critical_section(flags);
-
+      priv->refs++;
+      nxmutex_unlock(&priv->lock);
       return spi_dev;
     }
 
@@ -1397,8 +1395,7 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
     {
       /* Failed to allocate a CPU interrupt of this type. */
 
-      leave_critical_section(flags);
-
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
@@ -1408,7 +1405,7 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
 
       esp32c3_free_cpuint(priv->config->periph);
       priv->cpuint = -ENOMEM;
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
 
       return NULL;
     }
@@ -1419,11 +1416,9 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
 #endif
 
   esp32c3_spi_init(spi_dev);
-
   priv->refs++;
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return spi_dev;
 }
 
@@ -1443,7 +1438,6 @@ struct spi_dev_s *esp32c3_spibus_initialize(int port)
 
 int esp32c3_spibus_uninitialize(struct spi_dev_s *dev)
 {
-  irqstate_t flags;
   struct esp32c3_spi_priv_s *priv = (struct esp32c3_spi_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1453,16 +1447,13 @@ int esp32c3_spibus_uninitialize(struct spi_dev_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
 #ifdef CONFIG_ESP32C3_SPI2_DMA
   up_disable_irq(priv->cpuint);
   esp32c3_free_cpuint(priv->config->periph);
diff --git a/arch/risc-v/src/mpfs/mpfs_i2c.c b/arch/risc-v/src/mpfs/mpfs_i2c.c
index 937fa6b878..774bb8e6a4 100644
--- a/arch/risc-v/src/mpfs/mpfs_i2c.c
+++ b/arch/risc-v/src/mpfs/mpfs_i2c.c
@@ -780,7 +780,6 @@ static int mpfs_i2c_setfrequency(struct mpfs_i2c_priv_s *priv,
 struct i2c_master_s *mpfs_i2cbus_initialize(int port)
 {
   struct mpfs_i2c_priv_s *priv;
-  irqstate_t flags;
   int ret;
 
   switch (port)
@@ -799,15 +798,13 @@ struct i2c_master_s *mpfs_i2cbus_initialize(int port)
         return NULL;
   }
 
-  flags = enter_critical_section();
-
-  if ((volatile int)priv->refs++ != 0)
+  nxmutex_lock(&priv->lock);
+  if (priv->refs++ != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
 
       i2cinfo("Returning previously initialized I2C bus. "
-              "Handler: %" PRIxPTR "\n",
-              (uintptr_t)priv);
+              "Handler: %" PRIxPTR "\n", (uintptr_t)priv);
 
       return (struct i2c_master_s *)priv;
     }
@@ -815,18 +812,20 @@ struct i2c_master_s *mpfs_i2cbus_initialize(int port)
   ret = irq_attach(priv->plic_irq, mpfs_i2c_irq, priv);
   if (ret != OK)
     {
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
   ret = mpfs_i2c_init(priv);
   if (ret != OK)
     {
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
 
   i2cinfo("I2C bus initialized! Handler: %" PRIxPTR "\n", (uintptr_t)priv);
 
@@ -852,7 +851,6 @@ struct i2c_master_s *mpfs_i2cbus_initialize(int port)
 int mpfs_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
   struct mpfs_i2c_priv_s *priv = (struct mpfs_i2c_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -861,17 +859,15 @@ int mpfs_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   mpfs_i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/risc-v/src/mpfs/mpfs_spi.c b/arch/risc-v/src/mpfs/mpfs_spi.c
index b364cd5887..60fc98756b 100644
--- a/arch/risc-v/src/mpfs/mpfs_spi.c
+++ b/arch/risc-v/src/mpfs/mpfs_spi.c
@@ -1488,7 +1488,6 @@ struct spi_dev_s *mpfs_spibus_initialize(int port)
 {
   struct spi_dev_s *spi_dev;
   struct mpfs_spi_priv_s *priv;
-  irqstate_t flags;
   int ret;
 
   switch (port)
@@ -1509,11 +1508,11 @@ struct spi_dev_s *mpfs_spibus_initialize(int port)
 
   spi_dev = (struct spi_dev_s *)priv;
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs != 0)
     {
-      leave_critical_section(flags);
+      priv->refs++;
+      nxmutex_unlock(&priv->lock);
 
       return spi_dev;
     }
@@ -1521,16 +1520,14 @@ struct spi_dev_s *mpfs_spibus_initialize(int port)
   ret = irq_attach(priv->plic_irq, mpfs_spi_irq, priv);
   if (ret != OK)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
   mpfs_spi_init(spi_dev);
-
   priv->refs++;
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return spi_dev;
 }
 
@@ -1545,7 +1542,6 @@ struct spi_dev_s *mpfs_spibus_initialize(int port)
 int mpfs_spibus_uninitialize(struct spi_dev_s *dev)
 {
   struct mpfs_spi_priv_s *priv = (struct mpfs_spi_priv_s *)dev;
-  irqstate_t flags;
 
   DEBUGASSERT(dev);
 
@@ -1554,17 +1550,15 @@ int mpfs_spibus_uninitialize(struct spi_dev_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   mpfs_spi_deinit(dev);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/xtensa/src/esp32s2/esp32s2_i2c.c b/arch/xtensa/src/esp32s2/esp32s2_i2c.c
index 4b2b89fe71..575d8fd1d2 100644
--- a/arch/xtensa/src/esp32s2/esp32s2_i2c.c
+++ b/arch/xtensa/src/esp32s2/esp32s2_i2c.c
@@ -1504,7 +1504,6 @@ static void i2c_process(struct esp32s2_i2c_priv_s *priv, uint32_t status)
 
 struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
 {
-  irqstate_t flags;
   struct esp32s2_i2c_priv_s *priv;
 #ifndef CONFIG_I2C_POLLED
   const struct esp32s2_i2c_config_s *config;
@@ -1527,12 +1526,10 @@ struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
         return NULL;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs++ != 0)
     {
-      leave_critical_section(flags);
-
+      nxmutex_unlock(&priv->lock);
       return (struct i2c_master_s *)priv;
     }
 
@@ -1546,7 +1543,8 @@ struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
     {
       /* Failed to allocate a CPU interrupt of this type */
 
-      leave_critical_section(flags);
+      priv->refs--;
+      nxmutex_unlock(&priv->lock);
 
       return NULL;
     }
@@ -1555,9 +1553,9 @@ struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
   if (ret != OK)
     {
       esp32s2_teardown_irq(config->periph, priv->cpuint);
+      priv->refs--;
 
-      leave_critical_section(flags);
-
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
@@ -1565,8 +1563,7 @@ struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
 #endif
 
   i2c_init(priv);
-
-  leave_critical_section(flags);
+  nxmutex_unlock(&priv->lock);
 
   return (struct i2c_master_s *)priv;
 }
@@ -1589,7 +1586,6 @@ struct i2c_master_s *esp32s2_i2cbus_initialize(int port)
 
 int esp32s2_i2cbus_uninitialize(struct i2c_master_s *dev)
 {
-  irqstate_t flags;
   struct esp32s2_i2c_priv_s *priv = (struct esp32s2_i2c_priv_s *)dev;
 
   DEBUGASSERT(dev != NULL);
@@ -1599,22 +1595,20 @@ int esp32s2_i2cbus_uninitialize(struct i2c_master_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
 #ifndef CONFIG_I2C_POLLED
   up_disable_irq(priv->config->irq);
   esp32s2_teardown_irq(priv->config->periph, priv->cpuint);
 #endif
 
   i2c_deinit(priv);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/xtensa/src/esp32s2/esp32s2_spi.c b/arch/xtensa/src/esp32s2/esp32s2_spi.c
index 1cbc6a0fd6..bb51e74af2 100644
--- a/arch/xtensa/src/esp32s2/esp32s2_spi.c
+++ b/arch/xtensa/src/esp32s2/esp32s2_spi.c
@@ -1133,7 +1133,6 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
 {
   struct spi_dev_s *spi_dev;
   struct esp32s2_spi_priv_s *priv;
-  irqstate_t flags;
 
   switch (port)
     {
@@ -1152,15 +1151,12 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
     }
 
   spi_dev = (struct spi_dev_s *)priv;
-
-  flags = enter_critical_section();
+  nxmutex_lock(&priv->lock);
 
   esp32s2_spi_init(spi_dev);
-
   priv->refs++;
 
-  leave_critical_section(flags);
-
+  nxmutex_unlock(&priv->lock);
   return spi_dev;
 }
 
@@ -1180,7 +1176,6 @@ struct spi_dev_s *esp32s2_spibus_initialize(int port)
 
 int esp32s2_spibus_uninitialize(struct spi_dev_s *dev)
 {
-  irqstate_t flags;
   struct esp32s2_spi_priv_s *priv = (struct esp32s2_spi_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1190,17 +1185,15 @@ int esp32s2_spibus_uninitialize(struct spi_dev_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
   esp32s2_spi_deinit(dev);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/arch/xtensa/src/esp32s3/esp32s3_spi.c b/arch/xtensa/src/esp32s3/esp32s3_spi.c
index d9e2d4d260..0a8fcd77d7 100644
--- a/arch/xtensa/src/esp32s3/esp32s3_spi.c
+++ b/arch/xtensa/src/esp32s3/esp32s3_spi.c
@@ -1482,7 +1482,6 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
 {
   struct spi_dev_s *spi_dev;
   struct esp32s3_spi_priv_s *priv;
-  irqstate_t flags;
 
   switch (port)
     {
@@ -1502,12 +1501,11 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
 
   spi_dev = (struct spi_dev_s *)priv;
 
-  flags = spin_lock_irqsave(&priv->lock);
-
+  nxmutex_lock(&priv->lock);
   if (priv->refs != 0)
     {
-      spin_unlock_irqrestore(&priv->lock, flags);
-
+      priv->refs++;
+      nxmutex_unlock(&priv->lock);
       return spi_dev;
     }
 
@@ -1536,8 +1534,7 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
     {
       /* Failed to allocate a CPU interrupt of this type. */
 
-      spin_unlock_irqrestore(&priv->lock, flags);
-
+      nxmutex_unlock(&priv->lock);
       return NULL;
     }
 
@@ -1549,7 +1546,7 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
 
       esp32s3_teardown_irq(priv->cpu, priv->config->periph, priv->cpuint);
       priv->cpuint = -ENOMEM;
-      spin_unlock_irqrestore(&priv->lock, flags);
+      nxmutex_unlock(&priv->lock);
 
       return NULL;
     }
@@ -1560,11 +1557,9 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
 #endif
 
   esp32s3_spi_init(spi_dev);
-
   priv->refs++;
 
-  spin_unlock_irqrestore(&priv->lock, flags);
-
+  nxmutex_unlock(&priv->lock);
   return spi_dev;
 }
 
@@ -1584,7 +1579,6 @@ struct spi_dev_s *esp32s3_spibus_initialize(int port)
 
 int esp32s3_spibus_uninitialize(struct spi_dev_s *dev)
 {
-  irqstate_t flags;
   struct esp32s3_spi_priv_s *priv = (struct esp32s3_spi_priv_s *)dev;
 
   DEBUGASSERT(dev);
@@ -1594,16 +1588,13 @@ int esp32s3_spibus_uninitialize(struct spi_dev_s *dev)
       return ERROR;
     }
 
-  flags = enter_critical_section();
-
+  nxmutex_lock(&priv->lock);
   if (--priv->refs != 0)
     {
-      leave_critical_section(flags);
+      nxmutex_unlock(&priv->lock);
       return OK;
     }
 
-  leave_critical_section(flags);
-
 #ifdef CONFIG_ESP32S3_SPI2_DMA
   up_disable_irq(priv->config->irq);
   esp32s3_teardown_irq(priv->cpu, priv->config->periph, priv->cpuint);
@@ -1614,6 +1605,7 @@ int esp32s3_spibus_uninitialize(struct spi_dev_s *dev)
 #endif
 
   esp32s3_spi_deinit(dev);
+  nxmutex_unlock(&priv->lock);
 
   return OK;
 }
diff --git a/drivers/input/nunchuck.c b/drivers/input/nunchuck.c
index 08e9ef4380..f9d901c509 100644
--- a/drivers/input/nunchuck.c
+++ b/drivers/input/nunchuck.c
@@ -301,7 +301,7 @@ static int nunchuck_open(FAR struct file *filep)
     {
       ierr("ERROR: Failed to allocate open structure\n");
       ret = -ENOMEM;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Attach the open structure to the device */
@@ -314,7 +314,7 @@ static int nunchuck_open(FAR struct file *filep)
   filep->f_priv = (FAR void *)opriv;
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   return ret;
 }
@@ -382,7 +382,7 @@ static int nunchuck_close(FAR struct file *filep)
     {
       ierr("ERROR: Failed to find open entry\n");
       ret = -ENOENT;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Remove the structure from the device */
@@ -402,7 +402,7 @@ static int nunchuck_close(FAR struct file *filep)
 
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   return ret;
 }
diff --git a/drivers/leds/userled_upper.c b/drivers/leds/userled_upper.c
index 4dface6f61..2c6b764e6f 100644
--- a/drivers/leds/userled_upper.c
+++ b/drivers/leds/userled_upper.c
@@ -229,7 +229,7 @@ static int userled_close(FAR struct file *filep)
     {
       lederr("ERROR: Failed to find open entry\n");
       ret = -ENOENT;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Remove the structure from the device */
@@ -248,7 +248,7 @@ static int userled_close(FAR struct file *filep)
   kmm_free(opriv);
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lu_lock);
   return ret;
 }
diff --git a/fs/mount/fs_automount.c b/fs/mount/fs_automount.c
index e7c8caadd1..8b35d231c0 100644
--- a/fs/mount/fs_automount.c
+++ b/fs/mount/fs_automount.c
@@ -223,7 +223,7 @@ static int automount_open(FAR struct file *filep)
     {
       ierr("ERROR: Failed to allocate open structure\n");
       ret = -ENOMEM;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Attach the open structure to the device */
@@ -236,7 +236,7 @@ static int automount_open(FAR struct file *filep)
   filep->f_priv = (FAR void *)opriv;
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   return ret;
 }
@@ -280,7 +280,7 @@ static int automount_close(FAR struct file *filep)
     {
       ierr("ERROR: Failed to find open entry\n");
       ret = -ENOENT;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Remove the structure from the device */
@@ -304,7 +304,7 @@ static int automount_close(FAR struct file *filep)
 
   ret = OK;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&priv->lock);
   return ret;
 }
diff --git a/fs/nxffs/nxffs_ioctl.c b/fs/nxffs/nxffs_ioctl.c
index fec6cc3548..c4e84fcf36 100644
--- a/fs/nxffs/nxffs_ioctl.c
+++ b/fs/nxffs/nxffs_ioctl.c
@@ -86,7 +86,7 @@ int nxffs_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
         {
           ferr("ERROR: Open files\n");
           ret = -EBUSY;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* Re-format the volume -- all is lost */
@@ -109,7 +109,7 @@ int nxffs_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
       ret = MTD_IOCTL(volume->mtd, cmd, arg);
     }
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&volume->lock);
 errout:
   return ret;
diff --git a/fs/nxffs/nxffs_open.c b/fs/nxffs/nxffs_open.c
index 5f5e05c9b1..7e884fb631 100644
--- a/fs/nxffs/nxffs_open.c
+++ b/fs/nxffs/nxffs_open.c
@@ -416,7 +416,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
 
           ferr("ERROR: File is open for reading\n");
           ret = -ENOSYS;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* It would be an error if we are asked to create the file
@@ -427,7 +427,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
         {
           ferr("ERROR: File exists, can't create O_EXCL\n");
           ret = -EEXIST;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* Were we asked to truncate the file?  NOTE: Don't truncate the
@@ -455,7 +455,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
           ferr("ERROR: File %s exists and we were not asked to "
                "truncate it\n", name);
           ret = -ENOSYS;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
     }
 
@@ -467,7 +467,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
     {
       ferr("ERROR: Not asked to create the file\n");
       ret = -ENOENT;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Make sure that the length of the file name will fit in a uint8_t */
@@ -477,7 +477,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
     {
       ferr("ERROR: Name is too long: %d\n", namlen);
       ret = -EINVAL;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Yes.. Create a new structure that will describe the state of this open
@@ -494,7 +494,7 @@ static inline int nxffs_wropen(FAR struct nxffs_volume_s *volume,
   if (!wrfile)
     {
       ret = -ENOMEM;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 #endif
 
@@ -660,7 +660,7 @@ errout_with_ofile:
   kmm_free(wrfile);
 #endif
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&volume->lock);
 errout_with_wrsem:
   nxsem_post(&volume->wrsem);
@@ -707,7 +707,7 @@ static inline int nxffs_rdopen(FAR struct nxffs_volume_s *volume,
         {
           ferr("ERROR: File is open for writing\n");
           ret = -ENOSYS;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* Just increment the reference count on the ofile */
@@ -731,7 +731,7 @@ static inline int nxffs_rdopen(FAR struct nxffs_volume_s *volume,
         {
           ferr("ERROR: ofile allocation failed\n");
           ret = -ENOMEM;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* Initialize the open file state structure */
@@ -762,7 +762,7 @@ static inline int nxffs_rdopen(FAR struct nxffs_volume_s *volume,
 
 errout_with_ofile:
   kmm_free(ofile);
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&volume->lock);
 errout:
   return ret;
diff --git a/fs/nxffs/nxffs_read.c b/fs/nxffs/nxffs_read.c
index dbc9498628..4a7639aa4d 100644
--- a/fs/nxffs/nxffs_read.c
+++ b/fs/nxffs/nxffs_read.c
@@ -170,7 +170,7 @@ ssize_t nxffs_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
     {
       ferr("ERROR: File not open for read access\n");
       ret = -EACCES;
-      goto errout_with_excllock;
+      goto errout_with_lock;
     }
 
   /* Loop until all bytes have been read */
@@ -194,7 +194,7 @@ ssize_t nxffs_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
         {
           ferr("ERROR: nxffs_rdseek failed: %d\n", -ret);
           ret = -EACCES;
-          goto errout_with_excllock;
+          goto errout_with_lock;
         }
 
       /* How many bytes are available at this offset */
@@ -222,7 +222,7 @@ ssize_t nxffs_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
   nxmutex_unlock(&volume->lock);
   return total;
 
-errout_with_excllock:
+errout_with_lock:
   nxmutex_unlock(&volume->lock);
 errout:
   return (ssize_t)ret;