summaryrefslogtreecommitdiff
path: root/drivers/i3c/master/dw-i3c-master.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i3c/master/dw-i3c-master.c')
-rw-r--r--drivers/i3c/master/dw-i3c-master.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index 6d3d2ab5e71..d96eb9b134e 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -674,8 +674,11 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
newdevs &= ~olddevs;
for (pos = 0; pos < master->maxdevs; pos++) {
- if (newdevs & BIT(pos))
+ if (newdevs & BIT(pos)) {
i3c_master_add_i3c_dev_locked(m, master->addrs[pos]);
+ master->i3cdev[pos] = m->this;
+ master->num_i3cdevs++;
+ }
}
dw_i3c_master_free_xfer(xfer);
@@ -1010,8 +1013,38 @@ err_assert_rst:
return ret;
}
+static int dw_i3c_master_priv_read(struct udevice *dev, u32 dev_number,
+ u8 *buf, u32 buf_size)
+{
+ struct dw_i3c_master *master = dev_get_priv(dev);
+ struct i3c_dev_desc *i3cdev = master->i3cdev[dev_number];
+ struct i3c_priv_xfer i3c_xfers;
+
+ i3c_xfers.data.in = buf;
+ i3c_xfers.len = buf_size;
+ i3c_xfers.rnw = I3C_MSG_READ;
+
+ return dw_i3c_master_priv_xfers(i3cdev, &i3c_xfers, 1);
+}
+
+static int dw_i3c_master_priv_write(struct udevice *dev, u32 dev_number,
+ u8 *buf, u32 buf_size)
+{
+ struct dw_i3c_master *master = dev_get_priv(dev);
+ struct i3c_dev_desc *i3cdev = master->i3cdev[dev_number];
+ struct i3c_priv_xfer i3c_xfers;
+
+ i3c_xfers.data.out = buf;
+ i3c_xfers.len = buf_size;
+ i3c_xfers.rnw = I3C_MSG_WRITE;
+
+ return dw_i3c_master_priv_xfers(i3cdev, &i3c_xfers, 1);
+}
+
static const struct dm_i3c_ops dw_i3c_ops = {
.i3c_xfers = dw_i3c_master_priv_xfers,
+ .read = dw_i3c_master_priv_read,
+ .write = dw_i3c_master_priv_write,
};
static const struct udevice_id dw_i3c_ids[] = {