summaryrefslogtreecommitdiff
path: root/drivers/i3c/master.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i3c/master.c')
-rw-r--r--drivers/i3c/master.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index 8ad15e2dcc62..11666adac6fb 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -1044,8 +1044,7 @@ static int i3c_master_sethid_locked(struct i3c_master_controller *master)
return ret;
}
-static int i3c_master_getmrl_locked(struct i3c_master_controller *master,
- struct i3c_device_info *info)
+int i3c_master_getmrl_locked(struct i3c_master_controller *master, struct i3c_device_info *info)
{
struct i3c_ccc_cmd_dest dest;
struct i3c_ccc_mrl *mrl;
@@ -1086,8 +1085,7 @@ out:
return ret;
}
-static int i3c_master_getmwl_locked(struct i3c_master_controller *master,
- struct i3c_device_info *info)
+int i3c_master_getmwl_locked(struct i3c_master_controller *master, struct i3c_device_info *info)
{
struct i3c_ccc_cmd_dest dest;
struct i3c_ccc_mwl *mwl;
@@ -1116,6 +1114,52 @@ out:
return ret;
}
+int i3c_master_setmrl_locked(struct i3c_master_controller *master,
+ struct i3c_device_info *info, __be16 read_len, u8 ibi_len)
+{
+ struct i3c_ccc_cmd_dest dest;
+ struct i3c_ccc_cmd cmd;
+ struct i3c_ccc_mrl *mrl;
+ int ret;
+
+ mrl = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*mrl));
+ if (!mrl)
+ return -ENOMEM;
+
+ mrl->read_len = read_len;
+ mrl->ibi_len = ibi_len;
+ info->max_read_len = mrl->read_len;
+ info->max_ibi_len = mrl->ibi_len;
+ i3c_ccc_cmd_init(&cmd, false, I3C_CCC_SETMRL(false), &dest, 1);
+
+ ret = i3c_master_send_ccc_cmd_locked(master, &cmd);
+ i3c_ccc_cmd_dest_cleanup(&dest);
+
+ return ret;
+}
+
+int i3c_master_setmwl_locked(struct i3c_master_controller *master,
+ struct i3c_device_info *info, __be16 write_len)
+{
+ struct i3c_ccc_cmd_dest dest;
+ struct i3c_ccc_cmd cmd;
+ struct i3c_ccc_mwl *mwl;
+ int ret;
+
+ mwl = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*mwl));
+ if (!mwl)
+ return -ENOMEM;
+
+ mwl->len = write_len;
+ info->max_write_len = mwl->len;
+ i3c_ccc_cmd_init(&cmd, false, I3C_CCC_SETMWL(false), &dest, 1);
+
+ ret = i3c_master_send_ccc_cmd_locked(master, &cmd);
+ i3c_ccc_cmd_dest_cleanup(&dest);
+
+ return ret;
+}
+
static int i3c_master_getmxds_locked(struct i3c_master_controller *master,
struct i3c_device_info *info)
{