Skip to content

Commit 672825c

Browse files
zenghuchen-ggalexandrebelloni
authored andcommitted
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. Signed-off-by: Jack Chen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexandre Belloni <[email protected]>
1 parent 01744ce commit 672825c

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

drivers/i3c/device.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,26 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev,
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extern struct bus_type i3c_bus_type;
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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2708,6 +2708,25 @@ int i3c_master_unregister(struct i3c_master_controller *master)
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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ int i3c_device_do_priv_xfers(struct i3c_device *dev,
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 {

0 commit comments

Comments
 (0)