Skip to content

MMIO Access APIs

Purpose

The MMIO access APIs provide a portable interface for reading from and writing to memory-mapped I/O (MMIO) registers.

Unlike normal memory access, device registers should be accessed through these APIs after they have been mapped into the kernel virtual address space with ioremap().


#include <linux/io.h>

Read APIs

readb()

Reads an 8-bit value from an MMIO register.

u8 readb(const volatile void __iomem *addr);

Parameters

Parameter Description
addr Virtual MMIO address returned by ioremap().

Return Value

Returns the 8-bit value stored at the specified MMIO address.

Example

u8 value;

value = readb(base + REG_STATUS);

readw()

Reads a 16-bit value from an MMIO register.

u16 readw(const volatile void __iomem *addr);

Parameters

Parameter Description
addr Virtual MMIO address returned by ioremap().

Return Value

Returns the 16-bit value stored at the specified MMIO address.

Example

u16 value;

value = readw(base + REG_STATUS);

readl()

Reads a 32-bit value from an MMIO register.

u32 readl(const volatile void __iomem *addr);

Parameters

Parameter Description
addr Virtual MMIO address returned by ioremap().

Return Value

Returns the 32-bit value stored at the specified MMIO address.

Example

u32 status;

status = readl(base + REG_STATUS);

Write APIs

writeb()

Writes an 8-bit value to an MMIO register.

void writeb(u8 value, volatile void __iomem *addr);

Parameters

Parameter Description
value 8-bit value to write.
addr Virtual MMIO address returned by ioremap().

Return Value

None.

Example

writeb(0x80, base + REG_CTRL);

writew()

Writes a 16-bit value to an MMIO register.

void writew(u16 value, volatile void __iomem *addr);

Parameters

Parameter Description
value 16-bit value to write.
addr Virtual MMIO address returned by ioremap().

Return Value

None.

Example

writew(0x1234, base + REG_CTRL);

writel()

Writes a 32-bit value to an MMIO register.

void writel(u32 value, volatile void __iomem *addr);

Parameters

Parameter Description
value 32-bit value to write.
addr Virtual MMIO address returned by ioremap().

Return Value

None.

Example

writel(CTRL_ENABLE, base + REG_CTRL);

Typical Usage

A typical Linux platform driver accesses device registers as follows:

void __iomem *base;
u32 status;

base = ioremap(PHYS_ADDR, SIZE);

writel(CTRL_ENABLE, base + REG_CTRL);

status = readl(base + REG_STATUS);

iounmap(base);