Unverified Commit a9aa3381 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: ipc-msg-injector: Separate the message sending



Move out the code for sending the IPC message into a separate helper
function in preparation for support for handling IPC4 communication.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220506132647.18690-7-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 100c9374
Loading
Loading
Loading
Loading
+31 −17
Original line number Diff line number Diff line
@@ -67,22 +67,11 @@ static ssize_t sof_msg_inject_dfs_read(struct file *file, char __user *buffer,
	return count;
}

static ssize_t sof_msg_inject_dfs_write(struct file *file, const char __user *buffer,
					size_t count, loff_t *ppos)
static int sof_msg_inject_send_message(struct sof_client_dev *cdev)
{
	struct sof_client_dev *cdev = file->private_data;
	struct sof_msg_inject_priv *priv = cdev->data;
	struct device *dev = &cdev->auxdev.dev;
	int ret, err;
	size_t size;

	if (*ppos)
		return 0;

	size = simple_write_to_buffer(priv->tx_buffer, priv->max_msg_size,
				      ppos, buffer, count);
	if (size != count)
		return size > 0 ? -EFAULT : size;

	ret = pm_runtime_resume_and_get(dev);
	if (ret < 0 && ret != -EACCES) {
@@ -91,19 +80,44 @@ static ssize_t sof_msg_inject_dfs_write(struct file *file, const char __user *bu
	}

	/* send the message */
	memset(priv->rx_buffer, 0, priv->max_msg_size);
	ret = sof_client_ipc_tx_message(cdev, priv->tx_buffer, priv->rx_buffer,
					priv->max_msg_size);
	if (ret)
		dev_err(dev, "IPC message send failed: %d\n", ret);

	pm_runtime_mark_last_busy(dev);
	err = pm_runtime_put_autosuspend(dev);
	if (err < 0)
		dev_err_ratelimited(dev, "debugfs write failed to idle %d\n", err);

	/* return size if test is successful */
	if (ret >= 0)
		ret = size;

	return ret;
}

static ssize_t sof_msg_inject_dfs_write(struct file *file, const char __user *buffer,
					size_t count, loff_t *ppos)
{
	struct sof_client_dev *cdev = file->private_data;
	struct sof_msg_inject_priv *priv = cdev->data;
	size_t size;
	int ret;

	if (*ppos)
		return 0;

	size = simple_write_to_buffer(priv->tx_buffer, priv->max_msg_size,
				      ppos, buffer, count);
	if (size != count)
		return size > 0 ? -EFAULT : size;

	memset(priv->rx_buffer, 0, priv->max_msg_size);

	ret = sof_msg_inject_send_message(cdev);

	/* return the error code if test failed */
	if (ret < 0)
		size = ret;

	return size;
};

static int sof_msg_inject_dfs_release(struct inode *inode, struct file *file)