Commit e0906f1f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull i3c updates from Alexandre Belloni:
 "Subsystem:
   - OF alias bus numbering
   - convert to platform remove callback returning void

  New driver:
   - AST2600 controller, based on Synopsys DesignWare IP

  Driver update:
   - dw: add infrastructure to support different platform integrations"

* tag 'i3c/for-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux:
  i3c: ast2600: set variable ast2600_i3c_ops storage-class-specifier to static
  i3c: ast2600: fix register setting for 545 ohm pullups
  i3c: ast2600: enable IBI support
  i3c: dw: Add a platform facility for IBI PEC workarounds
  i3c: dw: Add support for in-band interrupts
  i3c: dw: Turn DAT array entry into a struct
  i3c: dw: Create a generic fifo read function
  i3c: Allow OF-alias-based persistent bus numbering
  i3c: ast2600: Add AST2600 platform-specific driver
  dt-bindings: i3c: Add AST2600 i3c controller
  i3c: dw: Add infrastructure for platform-specific implementations
  i3c: dw: use bus mode rather than device reg for conditional tCAS setting
  i3c: dw: Return the length from a read priv_xfer
  i3c: svc: Convert to platform remove callback returning void
  i3c: mipi-i3c-hci: Convert to platform remove callback returning void
  i3c: cdns: Convert to platform remove callback returning void
  i3c: dw: Convert to platform remove callback returning void
  i3c: Make i3c_master_unregister() return void
  i3c: dw: drop of_match_ptr for ID table
  i3c: Correct reference to the I²C device data type
parents 06936aaf 6b496a94
Loading
Loading
Loading
Loading
+72 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/i3c/aspeed,ast2600-i3c.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: ASPEED AST2600 i3c controller

maintainers:
  - Jeremy Kerr <jk@codeconstruct.com.au>

allOf:
  - $ref: i3c.yaml#

properties:
  compatible:
    const: aspeed,ast2600-i3c

  reg:
    maxItems: 1

  clocks:
    maxItems: 1

  resets:
    maxItems: 1

  interrupts:
    maxItems: 1

  sda-pullup-ohms:
    enum: [545, 750, 2000]
    default: 2000
    description: |
      Value to configure SDA pullup resistor, in Ohms.

  aspeed,global-regs:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    items:
      - items:
          - description: phandle to i3c global register syscon node
          - description: index of this i3c controller in the global register set
    description: |
      A (phandle, controller index) reference to the i3c global register set
      used for this device.

required:
  - compatible
  - reg
  - clocks
  - interrupts
  - aspeed,global-regs

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    i3c-master@2000 {
        compatible = "aspeed,ast2600-i3c";
        reg = <0x2000 0x1000>;
        #address-cells = <3>;
        #size-cells = <0>;
        clocks = <&syscon 0>;
        resets = <&syscon 0>;
        aspeed,global-regs = <&i3c_global 0>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i3c1_default>;
        interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
    };
...
+6 −0
Original line number Diff line number Diff line
@@ -9778,6 +9778,12 @@ S: Orphan
F:	Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
F:	drivers/i3c/master/dw*
I3C DRIVER FOR ASPEED AST2600
M:	Jeremy Kerr <jk@codeconstruct.com.au>
S:	Maintained
F:	Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c.yaml
F:	drivers/i3c/master/ast2600-i3c-master.c
I3C SUBSYSTEM
M:	Alexandre Belloni <alexandre.belloni@bootlin.com>
L:	linux-i3c@lists.infradead.org (moderated for non-subscribers)
+26 −10
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@

static DEFINE_IDR(i3c_bus_idr);
static DEFINE_MUTEX(i3c_core_lock);
static int __i3c_first_dynamic_bus_num;

/**
 * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation
@@ -419,9 +420,9 @@ static void i3c_bus_cleanup(struct i3c_bus *i3cbus)
	mutex_unlock(&i3c_core_lock);
}

static int i3c_bus_init(struct i3c_bus *i3cbus)
static int i3c_bus_init(struct i3c_bus *i3cbus, struct device_node *np)
{
	int ret;
	int ret, start, end, id = -1;

	init_rwsem(&i3cbus->lock);
	INIT_LIST_HEAD(&i3cbus->devs.i2c);
@@ -429,8 +430,19 @@ static int i3c_bus_init(struct i3c_bus *i3cbus)
	i3c_bus_init_addrslots(i3cbus);
	i3cbus->mode = I3C_BUS_MODE_PURE;

	if (np)
		id = of_alias_get_id(np, "i3c");

	mutex_lock(&i3c_core_lock);
	ret = idr_alloc(&i3c_bus_idr, i3cbus, 0, 0, GFP_KERNEL);
	if (id >= 0) {
		start = id;
		end = start + 1;
	} else {
		start = __i3c_first_dynamic_bus_num;
		end = 0;
	}

	ret = idr_alloc(&i3c_bus_idr, i3cbus, start, end, GFP_KERNEL);
	mutex_unlock(&i3c_core_lock);

	if (ret < 0)
@@ -2606,7 +2618,7 @@ int i3c_master_register(struct i3c_master_controller *master,
	INIT_LIST_HEAD(&master->boardinfo.i2c);
	INIT_LIST_HEAD(&master->boardinfo.i3c);

	ret = i3c_bus_init(i3cbus);
	ret = i3c_bus_init(i3cbus, master->dev.of_node);
	if (ret)
		return ret;

@@ -2695,17 +2707,13 @@ EXPORT_SYMBOL_GPL(i3c_master_register);
 * @master: master used to send frames on the bus
 *
 * Basically undo everything done in i3c_master_register().
 *
 * Return: 0 in case of success, a negative error code otherwise.
 */
int i3c_master_unregister(struct i3c_master_controller *master)
void i3c_master_unregister(struct i3c_master_controller *master)
{
	i3c_master_i2c_adapter_cleanup(master);
	i3c_master_unregister_i3c_devs(master);
	i3c_master_bus_cleanup(master);
	device_unregister(&master->dev);

	return 0;
}
EXPORT_SYMBOL_GPL(i3c_master_unregister);

@@ -2834,8 +2842,16 @@ void i3c_dev_free_ibi_locked(struct i3c_dev_desc *dev)

static int __init i3c_init(void)
{
	int res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
	int res;

	res = of_alias_get_highest_id("i3c");
	if (res >= 0) {
		mutex_lock(&i3c_core_lock);
		__i3c_first_dynamic_bus_num = res + 1;
		mutex_unlock(&i3c_core_lock);
	}

	res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
	if (res)
		return res;

+14 −0
Original line number Diff line number Diff line
@@ -22,6 +22,20 @@ config DW_I3C_MASTER
	  This driver can also be built as a module.  If so, the module
	  will be called dw-i3c-master.

config AST2600_I3C_MASTER
	tristate "ASPEED AST2600 I3C master driver"
	depends on DW_I3C_MASTER
	depends on ARCH_ASPEED || COMPILE_TEST
	select MFD_SYSCON
	help
	  Support for ASPEED AST2600 I3C Controller.

	  This hardware is an instance of the DW I3C controller; this
	  driver adds platform- specific support for AST2600 hardware.

	  This driver can also be built as a module.  If so, the module
	  will be called ast2600-i3c-master.

config SVC_I3C_MASTER
	tristate "Silvaco I3C Dual-Role Master driver"
	depends on I3C
+1 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_CDNS_I3C_MASTER)		+= i3c-master-cdns.o
obj-$(CONFIG_DW_I3C_MASTER)		+= dw-i3c-master.o
obj-$(CONFIG_AST2600_I3C_MASTER)	+= ast2600-i3c-master.o
obj-$(CONFIG_SVC_I3C_MASTER)		+= svc-i3c-master.o
obj-$(CONFIG_MIPI_I3C_HCI)		+= mipi-i3c-hci/
Loading