Driver implementer’s API guide¶
The kernel offers a wide variety of interfaces to support the development of device drivers. This document is an only somewhat organized collection of some of those interfaces — it will hopefully get better over time! The available subsections can be seen below.
Table of contents
- Driver Model
- Driver Basics
- Device drivers infrastructure
- ioctl based interfaces
- Early Userspace
- CPU and Device Power Management
- The Common Clk Framework
- Bus-Independent Device Accesses
- Buffer Sharing and Synchronization (dma-buf)
- Device links
- Component Helper for Aggregate Drivers
- Message-based devices
- InfiniBand and Remote DMA (RDMA) Interfaces
- Managing Ownership of the Framebuffer Aperture
- Frame Buffer Library
- Voltage and current regulator API
- Reset controller API
- Industrial I/O
- Input Subsystem
- Linux USB API
- The Linux-USB Host Side API
- USB Gadget API for Linux
- USB Anchors
- USB bulk streams
- USB core callbacks
- USB DMA
- USB Request Block (URB)
- Power Management for USB
- USB hotplugging
- USB device persistence during system suspend
- USB Error codes
- Writing USB Device Drivers
- Synopsys DesignWare Core SuperSpeed USB 3.0 Controller
- Writing a MUSB Glue Layer
- USB Type-C connector class
- API for USB Type-C Alternate Mode drivers
- USB3 debug port
- Firewire (IEEE 1394) driver Interface Guide
- The Linux PCI driver implementer’s API guide
- Compute Express Link
- Serial Peripheral Interface (SPI)
spi_statisticsspi_delayspi_devicespi_driverspi_unregister_driver()module_spi_driverspi_controllerspi_resspi_transferspi_messagespi_message_init_with_transfers()spi_is_bpw_supported()spi_controller_xfer_timeout()spi_replaced_transfersspi_sync_transfer()spi_write()spi_read()spi_w8r8()spi_w8r16()spi_w8r16be()spi_board_infospi_register_board_info()__spi_register_driver()spi_alloc_device()spi_add_device()spi_new_device()spi_unregister_device()spi_finalize_current_transfer()spi_take_timestamp_pre()spi_take_timestamp_post()spi_get_next_queued_message()spi_finalize_current_message()spi_new_ancillary_device()acpi_spi_count_resources()acpi_spi_device_alloc()spi_slave_abort()__spi_alloc_controller()__devm_spi_alloc_controller()spi_register_controller()devm_spi_register_controller()spi_unregister_controller()spi_split_transfers_maxsize()spi_split_transfers_maxwords()spi_setup()spi_async()spi_sync()spi_sync_locked()spi_bus_lock()spi_bus_unlock()spi_write_then_read()
- I2C and SMBus Subsystem
i2c_master_recv()i2c_master_recv_dmasafe()i2c_master_send()i2c_master_send_dmasafe()i2c_device_identityi2c_driver_flagsi2c_driveri2c_clienti2c_board_infoI2C_BOARD_INFOi2c_algorithmi2c_lock_operationsi2c_timingsi2c_bus_recovery_infoi2c_adapter_quirksi2c_lock_bus()i2c_trylock_bus()i2c_unlock_bus()i2c_mark_adapter_suspended()i2c_mark_adapter_resumed()i2c_check_quirks()module_i2c_driverbuiltin_i2c_driveri2c_register_board_info()i2c_verify_client()i2c_new_client_device()i2c_unregister_device()i2c_find_device_by_fwnode()i2c_new_dummy_device()devm_i2c_new_dummy_device()i2c_new_ancillary_device()i2c_verify_adapter()i2c_handle_smbus_host_notify()i2c_add_adapter()i2c_add_numbered_adapter()i2c_del_adapter()devm_i2c_add_adapter()i2c_find_adapter_by_fwnode()i2c_get_adapter_by_fwnode()i2c_parse_fw_timings()i2c_del_driver()__i2c_transfer()i2c_transfer()i2c_transfer_buffer_flags()i2c_get_device_id()i2c_client_get_device_id()i2c_get_dma_safe_msg_buf()i2c_put_dma_safe_msg_buf()i2c_smbus_pec()i2c_smbus_read_byte()i2c_smbus_write_byte()i2c_smbus_read_byte_data()i2c_smbus_write_byte_data()i2c_smbus_read_word_data()i2c_smbus_write_word_data()i2c_smbus_read_block_data()i2c_smbus_write_block_data()i2c_smbus_xfer()i2c_smbus_read_i2c_block_data_or_emulated()i2c_new_smbus_alert_device()
- IPMB Driver for a Satellite MC
- The Linux IPMI Driver
- I3C subsystem
- Generic System Interconnect Subsystem
- Device Frequency Scaling
- High Speed Synchronous Serial Interface (HSI)
- Error Detection And Correction (EDAC) Devices
- SCSI Interfaces Guide
- libATA Developer’s Guide
- target and iSCSI Interfaces Guide
- The Common Mailbox Framework
- MTD NAND Driver Programming Interface
- Parallel Port Devices
parport_register_drivermodule_parport_driverparport_yield()parport_yield_blocking()parport_wait_event()parport_wait_peripheral()parport_negotiate()parport_write()parport_read()parport_set_timeout()__parport_register_driver()parport_unregister_driver()parport_get_port()parport_put_port()parport_register_port()parport_announce_port()parport_remove_port()parport_register_dev_model()parport_unregister_device()parport_find_number()parport_find_base()parport_claim()parport_claim_or_block()parport_release()parport_open()parport_close()
- 16x50 UART Driver
- Pulse-Width Modulation (PWM)
pwm_polaritypwm_argspwm_devicepwm_get_state()pwm_init_state()pwm_get_relative_duty_cycle()pwm_set_relative_duty_cycle()pwm_capturepwm_opspwm_chippwm_config()pwm_enable()pwm_disable()pwm_set_chip_data()pwm_get_chip_data()pwmchip_add()pwmchip_remove()pwm_request_from_chip()pwm_apply_might_sleep()pwm_adjust_config()pwm_get()pwm_put()devm_pwm_get()devm_fwnode_pwm_get()
- Intel(R) Management Engine Interface (Intel(R) MEI)
- Memory Technology Device (MTD)
- MMC/SD/SDIO card support
- Non-Volatile Memory Device (NVDIMM)
- W1: Dallas’ 1-wire bus
- The Linux RapidIO Subsystem
- Writing s390 channel device drivers
- VME Device Drivers
- Linux 802.11 Driver Developer’s Guide
- The Userspace I/O HOWTO
- Linux Firmware API
- PINCTRL (PIN CONTROL) subsystem
- Top-level interface
- Pin groups
- Pin configuration
- Interaction with the GPIO subsystem
- PINMUX interfaces
- What is pinmuxing?
- Pinmux conventions
- Pinmux drivers
- Pin control interaction with the GPIO subsystem
- GPIO mode pitfalls
- Board/machine configuration
- Complex mappings
- Pin control requests from drivers
- Drivers needing both pin control and GPIOs
- System pin control hogging
- Runtime pinmuxing
- Debugfs files
- General Purpose Input/Output (GPIO)
- Introduction
- Using GPIO Lines in Linux
- GPIO Driver Interface
- GPIO Descriptor Consumer Interface
- GPIO Mappings
- Subsystem drivers using GPIO
- Legacy GPIO Interfaces
- A driver for a selfmade cheap BT8xx based PCI GPIO-card (bt8xxgpio)
- Core
- ACPI support
- Device tree support
- Device-managed API
- sysfs helpers
- RAID
- Media subsystem kernel internal API
- Miscellaneous Devices
- Near Field Communication
- DMAEngine documentation
- Linux kernel SLIMbus support
- SoundWire Documentation
- Thermal
- FPGA Subsystem
- ACPI Support
- Auxiliary Bus
- Kernel driver lp855x
- Kernel Connector
- Console Drivers
- Dell Systems Management Base Driver
- EISA bus support
- ISA Drivers
- ISA Plug & Play support by Jaroslav Kysela <perex@suse.cz>
- The io_mapping functions
- Ordering I/O writes to memory-mapped addresses
- Generic Counter Interface
- Memory Controller drivers
- MEN Chameleon Bus
- NTB Drivers
- NVMEM Subsystem
- PARPORT interface documentation
- PPS - Pulse Per Second
- PTP hardware clock infrastructure for Linux
- Generic PHY Framework
- Pulse Width Modulation (PWM) interface
- PLDM Firmware Flash Update Library
- Overview of the
pldmfwlibrary - rfkill - RF kill switch support
- Support for Serial devices
- SM501 Driver
- Surface System Aggregator Module (SSAM)
- Linux Switchtec Support
- Sync File API Guide
- TTY
- VFIO Mediated devices
- VFIO - “Virtual Function I/O”
- Acceptance criteria for vfio-pci device specific driver variants
- Virtio
- Xilinx FPGA
- Xillybus driver for generic FPGA interface
- Writing Device Drivers for Zorro Devices
- The Linux Hardware Timestamping Engine (HTE)
- WMI Driver API
wmi_devicewmi_driverwmi_driver_registermodule_wmi_driverset_required_buffer_size()wmi_instance_count()wmidev_instance_count()wmi_evaluate_method()wmidev_evaluate_method()wmi_query_block()wmidev_block_query()wmi_set_block()wmi_install_notify_handler()wmi_remove_notify_handler()wmi_get_event_data()wmi_has_guid()wmi_get_acpi_device_uid()wmi_driver_unregister()