Commit c2f2b01b authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull i3c updates from Alexandre Belloni:
 "HDR support has finally been added. mipi-i3c-hci has been reworked and
  Intel Nova Lake-S support has been added.

  Subsystem:
   - Add HDR transfer support

  Drivers:
   - dw: fix bus hang on Agilex5
   - mipi-i3c-hci: Intel Nova Lake-S support, IOMMU support
   - svc: HDR support"

* tag 'i3c/for-6.19' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux: (28 commits)
  regmap: i3c: switch to use i3c_xfer from i3c_priv_xfer
  net: mctp i3c: switch to use i3c_xfer from i3c_priv_xfer
  hwmon: (lm75): switch to use i3c_xfer from i3c_priv_xfer
  i3c: document i3c_xfers
  i3c: fix I3C_SDR bit number
  i3c: master: svc: Add basic HDR mode support
  i3c: master: svc: Replace bool rnw with union for HDR support
  i3c: Switch to use new i3c_xfer from i3c_priv_xfer
  i3c: Add HDR API support
  i3c: master: add WQ_PERCPU to alloc_workqueue users
  i3c: master: Remove i3c_device_free_ibi from i3c_device_remove
  i3c: mipi-i3c-hci-pci: Set d3cold_delay to 0 for Intel controllers
  i3c: mipi-i3c-hci-pci: Add LTR support for Intel controllers
  i3c: mipi-i3c-hci-pci: Add exit callback
  i3c: mipi-i3c-hci-pci: Change callback parameter
  i3c: mipi-i3c-hci-pci: Allocate a structure for mipi_i3c_hci_pci device information
  i3c: mipi-i3c-hci-pci: Factor out intel_reset()
  i3c: mipi-i3c-hci-pci: Factor out private registers ioremapping
  i3c: mipi-i3c-hci-pci: Constify driver data
  i3c: mipi-i3c-hci-pci: Use readl_poll_timeout()
  ...
parents ba65a4e7 79c3ae7a
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -14,7 +14,11 @@ allOf:

properties:
  compatible:
    const: snps,dw-i3c-master-1.00a
    oneOf:
      - const: snps,dw-i3c-master-1.00a
      - items:
          - const: altr,agilex5-dw-i3c-master
          - const: snps,dw-i3c-master-1.00a

  reg:
    maxItems: 1
+4 −4
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ static int regmap_i3c_write(void *context, const void *data, size_t count)
{
	struct device *dev = context;
	struct i3c_device *i3c = dev_to_i3cdev(dev);
	struct i3c_priv_xfer xfers[] = {
	struct i3c_xfer xfers[] = {
		{
			.rnw = false,
			.len = count,
@@ -19,7 +19,7 @@ static int regmap_i3c_write(void *context, const void *data, size_t count)
		},
	};

	return i3c_device_do_priv_xfers(i3c, xfers, ARRAY_SIZE(xfers));
	return i3c_device_do_xfers(i3c, xfers, ARRAY_SIZE(xfers), I3C_SDR);
}

static int regmap_i3c_read(void *context,
@@ -28,7 +28,7 @@ static int regmap_i3c_read(void *context,
{
	struct device *dev = context;
	struct i3c_device *i3c = dev_to_i3cdev(dev);
	struct i3c_priv_xfer xfers[2];
	struct i3c_xfer xfers[2];

	xfers[0].rnw = false;
	xfers[0].len = reg_size;
@@ -38,7 +38,7 @@ static int regmap_i3c_read(void *context,
	xfers[1].len = val_size;
	xfers[1].data.in = val;

	return i3c_device_do_priv_xfers(i3c, xfers, ARRAY_SIZE(xfers));
	return i3c_device_do_xfers(i3c, xfers, ARRAY_SIZE(xfers), I3C_SDR);
}

static const struct regmap_bus regmap_i3c = {
+4 −4
Original line number Diff line number Diff line
@@ -621,7 +621,7 @@ static int lm75_i3c_reg_read(void *context, unsigned int reg, unsigned int *val)
{
	struct i3c_device *i3cdev = context;
	struct lm75_data *data = i3cdev_get_drvdata(i3cdev);
	struct i3c_priv_xfer xfers[] = {
	struct i3c_xfer xfers[] = {
		{
			.rnw = false,
			.len = 1,
@@ -640,7 +640,7 @@ static int lm75_i3c_reg_read(void *context, unsigned int reg, unsigned int *val)
	if (reg == LM75_REG_CONF && !data->params->config_reg_16bits)
		xfers[1].len--;

	ret = i3c_device_do_priv_xfers(i3cdev, xfers, 2);
	ret = i3c_device_do_xfers(i3cdev, xfers, 2, I3C_SDR);
	if (ret < 0)
		return ret;

@@ -658,7 +658,7 @@ static int lm75_i3c_reg_write(void *context, unsigned int reg, unsigned int val)
{
	struct i3c_device *i3cdev = context;
	struct lm75_data *data = i3cdev_get_drvdata(i3cdev);
	struct i3c_priv_xfer xfers[] = {
	struct i3c_xfer xfers[] = {
		{
			.rnw = false,
			.len = 3,
@@ -680,7 +680,7 @@ static int lm75_i3c_reg_write(void *context, unsigned int reg, unsigned int val)
		data->val_buf[2] = val & 0xff;
	}

	return i3c_device_do_priv_xfers(i3cdev, xfers, 1);
	return i3c_device_do_xfers(i3cdev, xfers, 1, I3C_SDR);
}

static const struct regmap_bus lm75_i3c_regmap_bus = {
+20 −7
Original line number Diff line number Diff line
@@ -15,12 +15,12 @@
#include "internals.h"

/**
 * i3c_device_do_priv_xfers() - do I3C SDR private transfers directed to a
 *				specific device
 * i3c_device_do_xfers() - do I3C transfers directed to a specific device
 *
 * @dev: device with which the transfers should be done
 * @xfers: array of transfers
 * @nxfers: number of transfers
 * @mode: transfer mode
 *
 * Initiate one or several private SDR transfers with @dev.
 *
@@ -33,9 +33,8 @@
 *   'xfers' some time later. See I3C spec ver 1.1.1 09-Jun-2021. Section:
 *   5.1.2.2.3.
 */
int i3c_device_do_priv_xfers(struct i3c_device *dev,
			     struct i3c_priv_xfer *xfers,
			     int nxfers)
int i3c_device_do_xfers(struct i3c_device *dev, struct i3c_xfer *xfers,
			int nxfers, enum i3c_xfer_mode mode)
{
	int ret, i;

@@ -48,12 +47,12 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev,
	}

	i3c_bus_normaluse_lock(dev->bus);
	ret = i3c_dev_do_priv_xfers_locked(dev->desc, xfers, nxfers);
	ret = i3c_dev_do_xfers_locked(dev->desc, xfers, nxfers, mode);
	i3c_bus_normaluse_unlock(dev->bus);

	return ret;
}
EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers);
EXPORT_SYMBOL_GPL(i3c_device_do_xfers);

/**
 * i3c_device_do_setdasa() - do I3C dynamic address assignement with
@@ -260,6 +259,20 @@ i3c_device_match_id(struct i3c_device *i3cdev,
}
EXPORT_SYMBOL_GPL(i3c_device_match_id);

/**
 * i3c_device_get_supported_xfer_mode - Returns the supported transfer mode by
 *					connected master controller.
 * @dev: I3C device
 *
 * Return: a bit mask, which supported transfer mode, bit position is defined at
 *	   enum i3c_hdr_mode
 */
u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev)
{
	return i3c_dev_get_master(dev->desc)->this->info.hdr_cap | BIT(I3C_SDR);
}
EXPORT_SYMBOL_GPL(i3c_device_get_supported_xfer_mode);

/**
 * i3c_driver_register_with_owner() - register an I3C device driver
 *
+3 −3
Original line number Diff line number Diff line
@@ -15,9 +15,9 @@ void i3c_bus_normaluse_lock(struct i3c_bus *bus);
void i3c_bus_normaluse_unlock(struct i3c_bus *bus);

int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev);
int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev,
				 struct i3c_priv_xfer *xfers,
				 int nxfers);
int i3c_dev_do_xfers_locked(struct i3c_dev_desc *dev,
			    struct i3c_xfer *xfers,
			    int nxfers, enum i3c_xfer_mode mode);
int i3c_dev_disable_ibi_locked(struct i3c_dev_desc *dev);
int i3c_dev_enable_ibi_locked(struct i3c_dev_desc *dev);
int i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev,
Loading