[PATCH v5 0/2] Add ADI I3C Controller
From: Jorge Marques <jorge.marques@analog.com>
Date: 2025-07-15 08:57:05
Also in:
linux-i3c, lkml
I3C Controller is subset of the I3C-basic specification to interface peripherals through I3C and I2C. The controller RTL is FPGA synthesizable and documentation is provided at https://analogdevicesinc.github.io/hdl/library/i3c_controller The main target for the I3C Controller IP is low-cost FPGAs. In this version the driver supports IBI (only the MDB), I3C and I2C transfers. Depends on https://lore.kernel.org/linux-i3c/20250622-i3c-writesl-readsl-v2-0-2afd34ec6306@analog.com/T/#t (local) Signed-off-by: Jorge Marques <jorge.marques@analog.com> --- Changes in v5: Documentation/devicetree/bindings/i3c/adi,i3c-master.yaml: - Use semantic versioning major field for dt-binding compatible, with the format adi,<ip-name>-v<major> adi-i3c-master.c: - Rename MAX_DEVS to ADI_MAX_DEVS - Encapsulate REG_CMD_FIFO_0_DEV_ADDR var - Reorder struct adi_i3c_i2c_dev_data fields - Start addr at 0 instead of 8 at adi_i3c_master_get_rr_slot - Minor rework on adi_i3c_master_handle_ibi to most logic out of the lock. Even if length is 0 (BCR[2]=0), the mdb field is extracted and written to the slot buffer. Since the length is 0, the written data doesn't matter. In a future update with additional bytes support (e.g., bits 31-23), len would be incremented and an IBI FIFO would be read. - Version check against first stable release, major v1. Driver+RTL features updates affect the minor field, therefore check for major == 1. - Link to v4: https://lore.kernel.org/r/20250626-adi-i3c-master-v4-0-3846a1f66d5e@analog.com (local) Changes in v4: Documentation/devicetree/bindings/i3c/adi,i3c-master.yaml: - Add -1.00.a suffix where missing - Extend clocks descriptions - Add minItems to clock-names, to match clocks - Use header in example adi-i3c-master.c: - Regmap: - Add new controller info registers (dyn_addr, dcr, bcr, pid) - Always decreasing fields - Add line break between registers - Reformat REG_DEV_CHAR_BSCR_IBI to use easier to read FIELD_GET, FIELD_PREP - Read controller info from regmap with explanation comment - Use linux/fpga/adi-axi-common.h macros - Use __counter_by macro on ncmds - Use __free macro - Use new i3c_writel_fifo and i3c_readl_fifo macros - Rename bytes to buf when nbytes is present - Use scoped_guard instead of spin_lock, spin_unlock - Reformat loops to read fifo status, use while single line alternative - Drop adi_i3c_master.max_devs, use MAX_DEVS directly - Use devm_clk_bulk_get_all_enabled, dropping clock name match (CHECK_DTB does it) - Init spin_lock - Init list head - Link to v3: https://lore.kernel.org/r/20250618-adi-i3c-master-v3-0-e66170a6cb95@analog.com (local) Changes in v3: Documentation/devicetree/bindings/i3c/adi,i3c-master.yaml: - Small reworking of the description - Add -1.00.a suffix to compatible adi-i3c-master.c: - Misspelling - Remove REG_CMD_FIFO_0_LEN_MAX since it is a HDL parameter - Use adapter timeout value for I2C transfers, as in https://lore.kernel.org/linux-i3c/aEBd%2FFIKADYr%2F631@lizhi-Precision-Tower-5810/T/#t (local) - Link to v2: https://lore.kernel.org/r/20250606-adi-i3c-master-v2-0-e68b9aad2630@analog.com (local) Changes in v2: Documentation/devicetree/bindings/i3c/adi,i3c-master.yaml: - Move allof - Rename clocks to axi, i3c adi-i3c-master.c: - Update license year - Rework regmap to use FIELD_GET, FIELD_PREP - Reformat regmap to have FIELDS after REG, prefixed by reg name. - Add overflow safeguards to cmd, tx fifos - Fix macro related macros (mostly erroneous `| ~BITMASK` - Use guard macros, remove goto. - Simplify daa logic - Replace devm_clk_get with devm_clk_get_enabled - Solve 64bit->32bit warnings on x86_64 systems by casting to u32 - Immediate clear irq request flags, then handle it. - Link to v1: https://lore.kernel.org/r/20250604-adi-i3c-master-v1-0-0488e80dafcb@analog.com (local) --- Jorge Marques (2): dt-bindings: i3c: Add adi-i3c-master i3c: master: Add driver for Analog Devices I3C Controller IP .../devicetree/bindings/i3c/adi,i3c-master.yaml | 67 ++ MAINTAINERS | 6 + drivers/i3c/master/Kconfig | 11 + drivers/i3c/master/Makefile | 1 + drivers/i3c/master/adi-i3c-master.c | 1019 ++++++++++++++++++++ 5 files changed, 1104 insertions(+) --- base-commit: 51963783b876a2f493a3eac0ea9eba271cb6809a change-id: 20250604-adi-i3c-master-2a5148c58c47 prerequisite-message-id: [off-list ref] prerequisite-patch-id: 5443f14ca82fc08593960fafdb43488cce56f7d9 prerequisite-patch-id: 647084f5fe09f4887f633b0b02b306912a156672 prerequisite-patch-id: 6f582bb2ef1aafb66f26c515a19d5efa06ab8968 Best regards, -- Jorge Marques [off-list ref]