clear-pkgs-linux-iot-lts2018/0309-ASoC-Intel-Skylake-Deb...

154 lines
4.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Pardha Saradhi K <pardha.saradhi.kesapragada@intel.com>
Date: Thu, 25 Feb 2016 12:06:18 +0530
Subject: [PATCH] ASoC: Intel: Skylake: DebugFs changes to suit FDK
Following changes have been made in the generic ipc
debugfs interface to better suit the FDK implementation
1. Return IO error on write operation if the ipc fails.
2. IPC read operations are exposed in binary format
Change-Id: If0254fdb91030c917e0c0501089214d0654d39c7
Signed-off-by: Pardha Saradhi K <pardha.saradhi.kesapragada@intel.com>
Signed-off-by: Sanyog Kale <sanyog.r.kale@intel.com>
Reviewed-on:
Reviewed-by: Babu, Ramesh <ramesh.babu@intel.com>
Tested-by: Babu, Ramesh <ramesh.babu@intel.com>
Reviewed-on:
Reviewed-by: audio_build
Reviewed-by: Avati, Santosh Kumar <santosh.kumar.avati@intel.com>
Tested-by: Avati, Santosh Kumar <santosh.kumar.avati@intel.com>
---
sound/soc/intel/skylake/skl-debug.c | 67 +++++++----------------------
1 file changed, 16 insertions(+), 51 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c
index 39293c7a31ae..c1ae218a5009 100644
--- a/sound/soc/intel/skylake/skl-debug.c
+++ b/sound/soc/intel/skylake/skl-debug.c
@@ -151,37 +151,11 @@ static ssize_t mod_control_read(struct file *file,
char __user *user_buf, size_t count, loff_t *ppos)
{
struct skl_debug *d = file->private_data;
- char *state;
- char *buf1;
- int ret;
- unsigned int ofs = 0;
-
- if (d->ipc_data[0] == 0) {
- state = d->skl->mod_set_get_status ? "Fail\n" : "success\n";
- return simple_read_from_buffer(user_buf, count, ppos,
- state, strlen(state));
- }
-
- state = d->skl->mod_set_get_status ? "Fail\n" : "success\n";
- buf1 = kzalloc(MOD_BUF1, GFP_KERNEL);
- if (!buf1)
- return -ENOMEM;
-
- ret = snprintf(buf1, MOD_BUF1,
- "%s\nLARGE PARAM DATA\n", state);
-
- for (ofs = 0 ; ofs < d->ipc_data[0] ; ofs += 16) {
- ret += snprintf(buf1 + ret, MOD_BUF1 - ret, "0x%.4x : ", ofs);
- hex_dump_to_buffer(&(d->ipc_data[1]) + ofs, 16, 16, 4,
- buf1 + ret, MOD_BUF1 - ret, 0);
- ret += strlen(buf1 + ret);
- if (MOD_BUF1 - ret > 0)
- buf1[ret++] = '\n';
- }
+ const u32 param_data_size = d->ipc_data[0];
+ const u32 *param_data = &d->ipc_data[1];
- ret = simple_read_from_buffer(user_buf, count, ppos, buf1, ret);
- kfree(buf1);
- return ret;
+ return simple_read_from_buffer(user_buf, count, ppos,
+ param_data, param_data_size);
}
@@ -194,14 +168,14 @@ static ssize_t mod_control_write(struct file *file,
int retval, type;
ssize_t written;
u32 size, mbsz;
- u32 *large_data;
- int large_param_size;
struct skl_sst *ctx = d->skl->skl_sst;
struct skl_ipc_large_config_msg msg;
struct skl_ipc_header header = {0};
u64 *ipc_header = (u64 *)(&header);
+ d->ipc_data[0] = 0;
+
buf = kzalloc(MOD_BUF, GFP_KERNEL);
written = simple_write_to_buffer(buf, MOD_BUF, ppos,
user_buf, count);
@@ -225,28 +199,22 @@ static ssize_t mod_control_write(struct file *file,
msg.instance_id = ((header.primary) & 0x00ff0000)>>16;
msg.large_param_id = ((header.extension) & 0x0ff00000)>>20;
msg.param_data_size = (header.extension) & 0x000fffff;
- large_param_size = msg.param_data_size;
-
- large_data = kzalloc(large_param_size, GFP_KERNEL);
- if (!large_data)
- return -ENOMEM;
if (mbsz)
retval = skl_ipc_get_large_config(&ctx->ipc, &msg,
- large_data, &(mod_set_get->mailbx[0]),
- mbsz, NULL);
+ &d->ipc_data[1],
+ &mod_set_get->mailbx[0],
+ mbsz, NULL);
else
retval = skl_ipc_get_large_config(&ctx->ipc,
- &msg, large_data, NULL,
- 0, NULL);
-
- d->ipc_data[0] = msg.param_data_size;
- memcpy(&d->ipc_data[1], large_data, msg.param_data_size);
- kfree(large_data);
+ &msg,
+ &d->ipc_data[1],
+ NULL, 0, NULL);
+ if (retval == 0)
+ d->ipc_data[0] = msg.param_data_size;
break;
case IPC_MOD_LARGE_CONFIG_SET:
- d->ipc_data[0] = 0;
msg.module_id = (header.primary) & 0x0000ffff;
msg.instance_id = ((header.primary) & 0x00ff0000)>>16;
msg.large_param_id = ((header.extension) & 0x0ff00000)>>20;
@@ -254,7 +222,6 @@ static ssize_t mod_control_write(struct file *file,
retval = skl_ipc_set_large_config(&ctx->ipc, &msg,
(u32 *)(&mod_set_get->mailbx));
- d->ipc_data[0] = 0;
break;
default:
@@ -266,14 +233,12 @@ static ssize_t mod_control_write(struct file *file,
retval = sst_ipc_tx_message_wait(&ctx->ipc, *ipc_header,
NULL, 0, NULL, NULL);
- d->ipc_data[0] = 0;
break;
}
+
if (retval)
- d->skl->mod_set_get_status = 1;
- else
- d->skl->mod_set_get_status = 0;
+ return -EIO;
/* Userspace has been fiddling around behind the kernel's back */
add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
--
https://clearlinux.org