diff options
Diffstat (limited to 'drivers/i3c/master.c')
-rw-r--r-- | drivers/i3c/master.c | 52 |
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) { |