Added the common interface sending ccc cmd in I3C driver
Signed-off-by: yangshuyong <yangshuyong@xiaomi.com>
This commit is contained in:
parent
5b48dea4f5
commit
9790c3d316
|
@ -244,6 +244,46 @@ void i3c_device_free_ibi(FAR const struct i3c_device *dev)
|
|||
i3c_bus_normaluse_unlock(dev->bus);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_device_send_ccc_cmd
|
||||
*
|
||||
* Description:
|
||||
* This function is used to send a common ccc command.
|
||||
*
|
||||
* Input Parameters:
|
||||
* dev - An I3C device descriptor will be used for
|
||||
* cmd - The buf of ccc commands to transfer, only one frame at a time
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 or positive if Success, nagative otherwise.
|
||||
****************************************************************************/
|
||||
|
||||
int i3c_device_send_ccc_cmd(FAR const struct i3c_device *dev,
|
||||
FAR struct i3c_ccc_cmd *cmd)
|
||||
{
|
||||
int ret;
|
||||
FAR struct i3c_master_controller *master;
|
||||
|
||||
if (dev == NULL || cmd == NULL)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
master = i3c_dev_get_master(dev->desc);
|
||||
|
||||
i3c_bus_normaluse_lock(dev->bus);
|
||||
|
||||
ret = i3c_master_send_ccc_cmd_locked(master, cmd);
|
||||
if (ret < 0)
|
||||
{
|
||||
ret = cmd->err;
|
||||
}
|
||||
|
||||
i3c_bus_normaluse_unlock(dev->bus);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_master_find_i3c_dev
|
||||
*
|
||||
|
|
|
@ -351,57 +351,6 @@ static void i3c_ccc_cmd_init(FAR struct i3c_ccc_cmd *cmd, bool rnw,
|
|||
cmd->err = I3C_ERROR_UNKNOWN;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_master_send_ccc_cmd_locked
|
||||
****************************************************************************/
|
||||
|
||||
static int i3c_master_send_ccc_cmd_locked(
|
||||
FAR struct i3c_master_controller *master,
|
||||
FAR struct i3c_ccc_cmd *cmd)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!cmd || !master)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (master->init_done &&
|
||||
nxmutex_is_locked(&master->bus.lock))
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!master->ops->send_ccc_cmd)
|
||||
{
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if ((cmd->id & I3C_CCC_DIRECT) && (!cmd->dests || !cmd->ndests))
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (master->ops->supports_ccc_cmd &&
|
||||
!master->ops->supports_ccc_cmd(master, cmd))
|
||||
{
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
ret = master->ops->send_ccc_cmd(master, cmd);
|
||||
if (ret)
|
||||
{
|
||||
if (cmd->err != I3C_ERROR_UNKNOWN)
|
||||
{
|
||||
return cmd->err;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FAR struct i3c_dev_desc *
|
||||
i3c_master_alloc_i3c_dev(FAR struct i3c_master_controller *master,
|
||||
FAR const struct i3c_device_info *info)
|
||||
|
@ -1305,6 +1254,57 @@ static void i3c_unregister_driver(FAR struct i3c_master_controller *master)
|
|||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_master_send_ccc_cmd_locked
|
||||
****************************************************************************/
|
||||
|
||||
int i3c_master_send_ccc_cmd_locked(
|
||||
FAR struct i3c_master_controller *master,
|
||||
FAR struct i3c_ccc_cmd *cmd)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!cmd || !master)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (master->init_done &&
|
||||
nxmutex_is_locked(&master->bus.lock))
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!master->ops->send_ccc_cmd)
|
||||
{
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if ((cmd->id & I3C_CCC_DIRECT) && (!cmd->dests || !cmd->ndests))
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (master->ops->supports_ccc_cmd &&
|
||||
!master->ops->supports_ccc_cmd(master, cmd))
|
||||
{
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
ret = master->ops->send_ccc_cmd(master, cmd);
|
||||
if (ret)
|
||||
{
|
||||
if (cmd->err != I3C_ERROR_UNKNOWN)
|
||||
{
|
||||
return cmd->err;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_bus_normaluse_lock
|
||||
*
|
||||
|
|
|
@ -90,6 +90,7 @@
|
|||
****************************************************************************/
|
||||
|
||||
struct i3c_device;
|
||||
struct i3c_ccc_cmd;
|
||||
|
||||
struct i3c_device_id
|
||||
{
|
||||
|
@ -417,4 +418,21 @@ FAR const struct i3c_device *i3c_master_find_i3c_dev(
|
|||
FAR struct i3c_master_controller *master,
|
||||
FAR const struct i3c_device_id *id);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_device_send_ccc_cmd
|
||||
*
|
||||
* Description:
|
||||
* This function is used to send a common ccc command.
|
||||
*
|
||||
* Input Parameters:
|
||||
* dev - An I3C device descriptor will be used for
|
||||
* cmd - The buf of ccc commands to transfer, only one frame at a time
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 or positive if Success, nagative otherwise.
|
||||
****************************************************************************/
|
||||
|
||||
int i3c_device_send_ccc_cmd(FAR const struct i3c_device *dev,
|
||||
FAR struct i3c_ccc_cmd *cmd);
|
||||
|
||||
#endif /* __INCLUDE_NUTTX_I3C_DEV_H */
|
||||
|
|
|
@ -1147,4 +1147,22 @@ int i3c_master_do_daa(FAR struct i3c_master_controller *master);
|
|||
int i3c_master_set_info(FAR struct i3c_master_controller *master,
|
||||
FAR const struct i3c_device_info *info);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: i3c_master_send_ccc_cmd_locked
|
||||
*
|
||||
* Description:
|
||||
* Set master ccc command to i3c device of i3c bus
|
||||
*
|
||||
* Input Parameters:
|
||||
* master - Master used to send ccc frames on the bus
|
||||
* cmd - Command data to send on the bus
|
||||
*
|
||||
* Returned Value:
|
||||
* 0 in case of success, an negative error code otherwise.
|
||||
****************************************************************************/
|
||||
|
||||
int i3c_master_send_ccc_cmd_locked(
|
||||
FAR struct i3c_master_controller *master,
|
||||
FAR struct i3c_ccc_cmd *cmd);
|
||||
|
||||
#endif /* __INCLUDE_NUTTX_I3C_MASTER_H */
|
||||
|
|
Loading…
Reference in New Issue