History

i3c: export SETDASA method

Because not all I3C drivers have the hot-join feature ready, and especially not all I3C devices support hot-join feature, exporting SETDASA method could be useful. With this function, the I3C controller could perform a DAA to I3C devices when users decide to turn these I3C devices off and on again during run-time. Tested: This change has been tested with turnning off an I3C device and turning on it again during run-time. The device driver calls SETDASA method to perform DAA to the device. And communication between I3C controller and device is set up again correctly.

Jack Chen committed 3 years ago

Commit 672825c1 parent 01744ce4 files · +42 −0Browse files

Unified · Split

4 files
  1. drivers/i3c/device.c +20 −0
  2. drivers/i3c/internals.h +1 −0
  3. drivers/i3c/master.c +19 −0
  4. include/linux/i3c/device.h +2 −0
drivers/i3c/device.c+20−0
@@ -50,6 +50,26 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, · 49 unmodified lines
5050 }
5151 EXPORT_SYMBOL_GPL(i3c_device_do_priv_xfers);
5252
53+/**
54+ * i3c_device_do_setdasa() - do I3C dynamic address assignement with
55+ * static address
56+ *
57+ * @dev: device with which the DAA should be done
58+ *
59+ * Return: 0 in case of success, a negative error core otherwise.
60+ */
61+int i3c_device_do_setdasa(struct i3c_device *dev)
62+{
63+ int ret;
64+
65+ i3c_bus_normaluse_lock(dev->bus);
66+ ret = i3c_dev_setdasa_locked(dev->desc);
67+ i3c_bus_normaluse_unlock(dev->bus);
68+
69+ return ret;
70+}
71+EXPORT_SYMBOL_GPL(i3c_device_do_setdasa);
72+
5373 /**
5474 * i3c_device_get_info() - get I3C device information
5575 *
drivers/i3c/internals.h+1−0
@@ -15,6 +15,7 @@ extern struct bus_type i3c_bus_type; · 14 unmodified lines
1515 void i3c_bus_normaluse_lock(struct i3c_bus *bus);
1616 void i3c_bus_normaluse_unlock(struct i3c_bus *bus);
1717
18+int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev);
1819 int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev,
1920 struct i3c_priv_xfer *xfers,
2021 int nxfers);
drivers/i3c/master.c+19−0
@@ -2708,6 +2708,25 @@ int i3c_master_unregister(struct i3c_master_controller *master) · 2707 unmodified lines
27082708 }
27092709 EXPORT_SYMBOL_GPL(i3c_master_unregister);
27102710
2711+int i3c_dev_setdasa_locked(struct i3c_dev_desc *dev)
2712+{
2713+ struct i3c_master_controller *master;
2714+
2715+ if (!dev)
2716+ return -ENOENT;
2717+
2718+ master = i3c_dev_get_master(dev);
2719+ if (!master)
2720+ return -EINVAL;
2721+
2722+ if (!dev->boardinfo || !dev->boardinfo->init_dyn_addr ||
2723+ !dev->boardinfo->static_addr)
2724+ return -EINVAL;
2725+
2726+ return i3c_master_setdasa_locked(master, dev->info.static_addr,
2727+ dev->boardinfo->init_dyn_addr);
2728+}
2729+
27112730 int i3c_dev_do_priv_xfers_locked(struct i3c_dev_desc *dev,
27122731 struct i3c_priv_xfer *xfers,
27132732 int nxfers)
include/linux/i3c/device.h+2−0
@@ -294,6 +294,8 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev, · 293 unmodified lines
294294 struct i3c_priv_xfer *xfers,
295295 int nxfers);
296296
297+int i3c_device_do_setdasa(struct i3c_device *dev);
298+
297299 void i3c_device_get_info(struct i3c_device *dev, struct i3c_device_info *info);
298300
299301 struct i3c_ibi_payload {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t