.. SPDX-License-Identifier: GPL-2.0 ============================== How to instantiate SPI devices ============================== SPI devices are normally declared statically via device-tree, ACPI, or board files. When the SPI controller is registered, these devices are instantiated automatically by the SPI core. This is the preferred method for any device with a proper kernel driver. Instantiate from user-space --------------------------- In certain cases a SPI device cannot be declared statically: * The ``spidev`` driver, which provides raw userspace access to SPI buses, explicitly rejects the bare ``"spidev"`` compatible string in device-tree because spidev is a Linux implementation detail, not a hardware description. Vendor-specific compatible strings for spidev (e.g. ``"vendor,board-spidev"``) are also generally not accepted upstream. Device-tree overlays do not help here either, since the spidev driver performs the same compatible check regardless of how the DT node was loaded. * You are developing or testing a SPI device on a development board where the SPI bus is exposed on expansion headers, and the connected device may change frequently. For these cases, a sysfs interface is provided on each SPI host controller (similar to the I2C ``new_device``/``delete_device`` interface described in Documentation/i2c/instantiating-devices.rst). Two write-only attribute files are created in every SPI host controller directory: ``new_device`` and ``delete_device``. File ``new_device`` takes 2 to 4 parameters: the name of the SPI device (a string), the chip select number, and optionally ``max_speed_hz`` and ``mode``:: [ []] The modalias is set both as the device's ``modalias`` field and as its ``driver_override``. This ensures that the device binds to the named driver directly, bypassing the normal bus matching logic (OF, ACPI, and ``id_table``). This is necessary because drivers like ``spidev`` deliberately exclude generic names from their ``id_table``. If ``max_speed_hz`` is omitted or 0, ``spi_setup()`` clamps it to the controller's maximum speed. If ``mode`` is omitted, SPI mode 0 (CPOL=0, CPHA=0) is used. File ``delete_device`` takes a single parameter: the chip select number. As no two devices can share a chip select on a given SPI bus, the chip select is sufficient to uniquely identify the device. Examples:: # Create a spidev device on SPI bus 0, chip select 0 echo spidev 0 > /sys/class/spi_master/spi0/new_device # Create with explicit clock rate and SPI mode echo spidev 0 10000000 3 > /sys/class/spi_master/spi0/new_device # Remove the device echo 0 > /sys/class/spi_master/spi0/delete_device The attributes are added after the host controller and its firmware-described devices have been registered. Their addition emits a ``change`` uevent, allowing a udev rule to write to ``new_device`` when the interface is ready. Limitations ^^^^^^^^^^^ Devices created through this interface have the following limitations compared to devices declared via device-tree: * No interrupt (IRQ) support. * No additional properties such as ``spi-max-frequency`` DT bindings or controller-specific configuration. * No platform data or software nodes. For ``spidev`` usage these limitations are not relevant, since spidev provides a raw byte-level interface that does not require any of these features. Only devices created via ``new_device`` can be removed through ``delete_device``. Devices declared via device-tree, ACPI, or board files are not affected by this interface.