I3C device driver API

enum i3c_error_code

I3C error codes

Constants

I3C_ERROR_UNKNOWN

unknown error, usually means the error is not I3C related

I3C_ERROR_M0

M0 error

I3C_ERROR_M1

M1 error

I3C_ERROR_M2

M2 error

Description

These are the standard error codes as defined by the I3C specification. When -EIO is returned by the i3c_device_do_priv_xfers() or i3c_device_send_hdr_cmds() one can check the error code in struct_i3c_priv_xfer.err or struct i3c_hdr_cmd.err to get a better idea of what went wrong.

enum i3c_hdr_mode

HDR mode ids

Constants

I3C_HDR_DDR

DDR mode

I3C_HDR_TSP

TSP mode

I3C_HDR_TSL

TSL mode

struct i3c_priv_xfer

I3C SDR private transfer

Definition:

struct i3c_priv_xfer {
    u8 rnw;
    u16 len;
    u16 actual_len;
    union {
        void *in;
        const void *out;
    } data;
    enum i3c_error_code err;
};

Members

rnw

encodes the transfer direction. true for a read, false for a write

len

transfer length in bytes of the transfer

actual_len

actual length in bytes are transferred by the controller

data

input/output buffer

data.in

input buffer. Must point to a DMA-able buffer

data.out

output buffer. Must point to a DMA-able buffer

err

I3C error code

enum i3c_dcr

I3C DCR values

Constants

I3C_DCR_GENERIC_DEVICE

generic I3C device

struct i3c_device_info

I3C device information

Definition:

struct i3c_device_info {
    u64 pid;
    u8 bcr;
    u8 dcr;
    u8 static_addr;
    u8 dyn_addr;
    u8 hdr_cap;
    u8 max_read_ds;
    u8 max_write_ds;
    u8 max_ibi_len;
    u32 max_read_turnaround;
    u16 max_read_len;
    u16 max_write_len;
};

Members

pid

Provisioned ID

bcr

Bus Characteristic Register

dcr

Device Characteristic Register

static_addr

static/I2C address

dyn_addr

dynamic address

hdr_cap

supported HDR modes

max_read_ds

max read speed information

max_write_ds

max write speed information

max_ibi_len

max IBI payload length

max_read_turnaround

max read turn-around time in micro-seconds

max_read_len

max private SDR read length in bytes

max_write_len

max private SDR write length in bytes

Description

These are all basic information that should be advertised by an I3C device. Some of them are optional depending on the device type and device capabilities. For each I3C slave attached to a master with i3c_master_add_i3c_dev_locked(), the core will send the relevant CCC command to retrieve these data.

struct i3c_driver

I3C device driver

Definition:

struct i3c_driver {
    struct device_driver driver;
    int (*probe)(struct i3c_device *dev);
    void (*remove)(struct i3c_device *dev);
    const struct i3c_device_id *id_table;
};

Members

driver

inherit from device_driver

probe

I3C device probe method

remove

I3C device remove method

id_table

I3C device match table. Will be used by the framework to decide which device to bind to this driver

dev_to_i3cdev

dev_to_i3cdev (__dev)

Returns the I3C device containing dev

Parameters

__dev

device object

Return

a pointer to an I3C device object.

module_i3c_driver

module_i3c_driver (__drv)

Register a module providing an I3C driver

Parameters

__drv

the I3C driver to register

Description

Provide generic init/exit functions that simply register/unregister an I3C driver. Should be used by any driver that does not require extra init/cleanup steps.

int i3c_i2c_driver_register(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

Register an i2c and an i3c driver

Parameters

struct i3c_driver *i3cdrv

the I3C driver to register

struct i2c_driver *i2cdrv

the I2C driver to register

Description

This function registers both i2cdev and i3cdev, and fails if one of these registrations fails. This is mainly useful for devices that support both I2C and I3C modes. Note that when CONFIG_I3C is not enabled, this function only registers the I2C driver.

Return

0 if both registrations succeeds, a negative error code otherwise.

void i3c_i2c_driver_unregister(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

Unregister an i2c and an i3c driver

Parameters

struct i3c_driver *i3cdrv

the I3C driver to register

struct i2c_driver *i2cdrv

the I2C driver to register

Description

This function unregisters both i3cdrv and i2cdrv. Note that when CONFIG_I3C is not enabled, this function only unregisters the i2cdrv.

module_i3c_i2c_driver

module_i3c_i2c_driver (__i3cdrv, __i2cdrv)

Register a module providing an I3C and an I2C driver

Parameters

__i3cdrv

the I3C driver to register

__i2cdrv

the I3C driver to register

Description

Provide generic init/exit functions that simply register/unregister an I3C and an I2C driver. This macro can be used even if CONFIG_I3C is disabled, in this case, only the I2C driver will be registered. Should be used by any driver that does not require extra init/cleanup steps.

struct i3c_ibi_setup

IBI setup object

Definition:

struct i3c_ibi_setup {
    unsigned int max_payload_len;
    unsigned int num_slots;
    void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload);
};

Members

max_payload_len

maximum length of the payload associated to an IBI. If one IBI appears to have a payload that is bigger than this number, the IBI will be rejected.

num_slots

number of pre-allocated IBI slots. This should be chosen so that the system never runs out of IBI slots, otherwise you’ll lose IBIs.

handler

IBI handler, every time an IBI is received. This handler is called in a workqueue context. It is allowed to sleep and send new messages on the bus, though it’s recommended to keep the processing done there as fast as possible to avoid delaying processing of other queued on the same workqueue.

Description

Temporary structure used to pass information to i3c_device_request_ibi(). This object can be allocated on the stack since i3c_device_request_ibi() copies every bit of information and do not use it after i3c_device_request_ibi() has returned.

int i3c_device_do_priv_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfers, int nxfers)

do I3C SDR private transfers directed to a specific device

Parameters

struct i3c_device *dev

device with which the transfers should be done

struct i3c_priv_xfer *xfers

array of transfers

int nxfers

number of transfers

Description

Initiate one or several private SDR transfers with dev.

This function can sleep and thus cannot be called in atomic context.

Return

0 in case of success, a negative error core otherwise.
-EAGAIN: controller lost address arbitration. Target

(IBI, HJ or controller role request) win the bus. Client driver needs to resend the ‘xfers’ some time later. See I3C spec ver 1.1.1 09-Jun-2021. Section: 5.1.2.2.3.

int i3c_device_do_setdasa(struct i3c_device *dev)

do I3C dynamic address assignement with static address

Parameters

struct i3c_device *dev

device with which the DAA should be done

Return

0 in case of success, a negative error core otherwise.

void i3c_device_get_info(const struct i3c_device *dev, struct i3c_device_info *info)

get I3C device information

Parameters

const struct i3c_device *dev

device we want information on

struct i3c_device_info *info

the information object to fill in

Description

Retrieve I3C dev info.

int i3c_device_disable_ibi(struct i3c_device *dev)

Disable IBIs coming from a specific device

Parameters

struct i3c_device *dev

device on which IBIs should be disabled

Description

This function disable IBIs coming from a specific device and wait for all pending IBIs to be processed.

Return

0 in case of success, a negative error core otherwise.

int i3c_device_enable_ibi(struct i3c_device *dev)

Enable IBIs coming from a specific device

Parameters

struct i3c_device *dev

device on which IBIs should be enabled

Description

This function enable IBIs coming from a specific device and wait for all pending IBIs to be processed. This should be called on a device where i3c_device_request_ibi() has succeeded.

Note that IBIs from this device might be received before this function returns to its caller.

Return

0 in case of success, a negative error core otherwise.

int i3c_device_request_ibi(struct i3c_device *dev, const struct i3c_ibi_setup *req)

Request an IBI

Parameters

struct i3c_device *dev

device for which we should enable IBIs

const struct i3c_ibi_setup *req

setup requested for this IBI

Description

This function is responsible for pre-allocating all resources needed to process IBIs coming from dev. When this function returns, the IBI is not enabled until i3c_device_enable_ibi() is called.

Return

0 in case of success, a negative error core otherwise.

void i3c_device_free_ibi(struct i3c_device *dev)

Free all resources needed for IBI handling

Parameters

struct i3c_device *dev

device on which you want to release IBI resources

Description

This function is responsible for de-allocating resources previously allocated by i3c_device_request_ibi(). It should be called after disabling IBIs with i3c_device_disable_ibi().

struct device *i3cdev_to_dev(struct i3c_device *i3cdev)

Returns the device embedded in i3cdev

Parameters

struct i3c_device *i3cdev

I3C device

Return

a pointer to a device object.

const struct i3c_device_id *i3c_device_match_id(struct i3c_device *i3cdev, const struct i3c_device_id *id_table)

Returns the i3c_device_id entry matching i3cdev

Parameters

struct i3c_device *i3cdev

I3C device

const struct i3c_device_id *id_table

I3C device match table

Return

a pointer to an i3c_device_id object or NULL if there’s no match.

int i3c_driver_register_with_owner(struct i3c_driver *drv, struct module *owner)

register an I3C device driver

Parameters

struct i3c_driver *drv

driver to register

struct module *owner

module that owns this driver

Description

Register drv to the core.

Return

0 in case of success, a negative error core otherwise.

void i3c_driver_unregister(struct i3c_driver *drv)

unregister an I3C device driver

Parameters

struct i3c_driver *drv

driver to unregister

Description

Unregister drv.