STRUCT I3C_MASTER_CONTROLLER(9)
π struct i3c_master_controller(9) β the Kernel API Manual, but make it make sense
okay so bestie, this is the manual page for struct i3c_master_controller from the Kernel API Manual, and it's literally the blueprint for every I3C master controller object in the kernel. no cap. let's get into it π
β¨ NAME β¨
struct i3c_master_controller β the I3C master controller object, the main character of your I3C bus π
πΈ SYNOPSIS πΈ
here's the whole vibe, character for character, no edits from me:
struct i3c_master_controller {
struct device dev;
struct i3c_dev_desc *this;
struct i2c_adapter i2c;
const struct i3c_master_controller_ops *ops;
unsigned int secondary : 1;
unsigned int init_done : 1;
unsigned int hotjoin: 1;
unsigned int rpm_allowed: 1;
unsigned int rpm_ibi_allowed: 1;
unsigned int ibi_wakeup: 1;
bool shutting_down;
struct {
struct list_head i3c;
struct list_head i2c;
} boardinfo;
struct i3c_bus bus;
u8 addr_method;
struct workqueue_struct *wq;
struct work_struct hj_work;
struct work_struct reg_work;
unsigned int dev_nack_retry_count;
};
π¦ Members π¦
bestie, let's go field by field, because every single one of these slays in its own way:
devβ the device that gets registered to the device-model. that's her official government name πthisβ an I3C device object that represents this master. it gets added to the list of I3C devs available on the bus. yes, the struct literally has a field calledthis. she's self-aware, periodt.i2cβ the I2C adapter used for backward compatibility. this adapter is registered to the I2C subsystem so it's as transparent as possible to existing I2C drivers. legacy support icon behavior, honestly π«Άopsβ the master operations. seestruct i3c_master_controller_ops. iykyksecondaryβtrueif the master is a secondary master. side character but still important πinit_doneβtruewhen the bus initialization is done. the "we're so back" flag β¨hotjoinβtrueif the master supports hotjoinrpm_allowedβtrueif Runtime PM is allowedrpm_ibi_allowedβtrueif IBI and Hot-Join are allowed while runtime suspendedibi_wakeupβ IBI can wake up the system. she can pull you out of sleep, iconic πΈshutting_downβ set totruewhen the master begins shutdown or unregister. the "we're leaving, wrap it up" signal πboardinfoβ board-level information attached to devices connected on the busboardinfo.i3cβ list of I3C boardinfo objectsboardinfo.i2cβ list of I2C boardinfo objects
busβ the I3C bus exposed by this master πaddr_methodβ a bitmap describing which methods of Address Assignment are required to be run for discovering all the devices on the bus. Bit 0: SETDASA. Bit 1: SETAASA. All other bits are reserved. so don't go touching the reserved bits, bestie, that's not your business π₯wqβ a freezable workqueue that master drivers can use if they need to postpone operations that need to take place in a thread context. typical examples are Hot Join processing, which requires taking the bus lock in maintenance, which in turn can only be done from a sleep-able context. sleepy-girl-only zone π΄hj_workβ the work item used to run DAA after a Hot-Join event is detected. it's queued towqbyi3c_master_queue_hotjoinreg_workβ the work item used to register newly discovered I3C devices with the driver model. it's queued towqbyi3c_master_do_daa_extso that device registration is deferred out of the DAA caller's context (notably the resume path), and it's skipped if the controller is shutting down. deferring is self care π§dev_nack_retry_countβ retry count when the slave device nacks. she persists πͺ
π Description π
okay so here's the rule, and it's a big one: a struct i3c_master_controller has to be registered to the I3C subsystem through i3c_master_register.
π¨ and listen β none of thestruct i3c_master_controllerfields should be set manually. do not do it. just pass appropriate values toi3c_master_registerand let her cook. this is the whole personality of the page, fr fr.
β SEE ALSO β
everything in the extended universe, all present and accounted for:
Kernel file ./include/linux/i3c/master.h struct i3c_i2c_dev_desc(9), struct i2c_dev_boardinfo(9), struct i2c_dev_desc(9), struct i3c_ibi_slot(9), struct i3c_device_ibi_info(9), struct i3c_dev_boardinfo(9), struct i3c_dev_desc(9), struct i3c_device(9), enum i3c_bus_mode(9), enum i3c_open_drain_speed(9), enum i3c_addr_slot_status(9), struct i3c_bus(9), struct i3c_master_controller_ops(9), i3c_bus_for_each_i2cdev(9), i3c_bus_for_each_i3cdev(9), struct i3c_dma(9), i3c_dev_get_master_data(9), i3c_dev_set_master_data(9), i2c_dev_get_master_data(9), i2c_dev_set_master_data(9), i3c_dev_get_master(9), i2c_dev_get_master(9), i3c_master_get_bus(9)
and that's the whole page, bestie π«Ά you ate that. go register your master controller properly and don't touch the fields manually, ok?? love u, bye π
sign-off time: this one lives at ./include/linux/i3c, dated October 2026, and the page header/footer is struct i3c_m...r_controller(9). mwah π
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms