STRUCT I3C_MASTER_CONTROLLER(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… 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 called this. 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. see struct i3c_master_controller_ops. iykyk
  • secondary β€” true if the master is a secondary master. side character but still important πŸ’œ
  • init_done β€” true when the bus initialization is done. the "we're so back" flag ✨
  • hotjoin β€” true if the master supports hotjoin
  • rpm_allowed β€” true if Runtime PM is allowed
  • rpm_ibi_allowed β€” true if IBI and Hot-Join are allowed while runtime suspended
  • ibi_wakeup β€” IBI can wake up the system. she can pull you out of sleep, iconic 🌸
  • shutting_down β€” set to true when the master begins shutdown or unregister. the "we're leaving, wrap it up" signal πŸ’€
  • boardinfo β€” board-level information attached to devices connected on the bus
    • boardinfo.i3c β€” list of I3C boardinfo objects
    • boardinfo.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 to wq by i3c_master_queue_hotjoin
  • reg_work β€” the work item used to register newly discovered I3C devices with the driver model. it's queued to wq by i3c_master_do_daa_ext so 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 the struct i3c_master_controller fields should be set manually. do not do it. just pass appropriate values to i3c_master_register and 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