Hi

This patch is reworked patch with Alan's comments fixed.
The original patch was submitted on Dec 14.


From: Vinod Koul <[email protected]>

This patch adds new IOCTL for application interface.

Using parameter tuning IOCTL, application can fine
tune the audio firmware for its requirement.

Signed-off-by: Vinod Koul <[email protected]>
Signed-off-by: Ramesh Babu K V <[email protected]>
---
 include/sound/intel_sst_ioctl.h         |    8 +++++++
 sound/pci/sst/intel_sst_app_interface.c |   35 +++++++++++++++++++++++++++++++
 sound/pci/sst/intel_sst_common.h        |    4 +-
 sound/pci/sst/intel_sst_fw_ipc.h        |    1 +
 sound/pci/sst/intel_sst_ipc.c           |   18 ++++++++++++++++
 5 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/include/sound/intel_sst_ioctl.h b/include/sound/intel_sst_ioctl.h
index bebc395..d1ffc2d 100644
--- a/include/sound/intel_sst_ioctl.h
+++ b/include/sound/intel_sst_ioctl.h
@@ -400,6 +400,13 @@ struct snd_sst_dbufs  {
        struct snd_sst_buffs *obufs;
 };
 
+struct snd_sst_tuning_params {
+       __u8 type;
+       __u8 str_id;
+       __u8 size;
+       __u8 rsvd;
+       unsigned long addr;
+} __attribute__ ((packed));
 /*IOCTL defined here */
 /*SST MMF IOCTLS only */
 #define SNDRV_SST_STREAM_SET_PARAMS _IOR('L', 0x00, \
@@ -428,5 +435,6 @@ struct snd_sst_dbufs  {
 /*DSP Ioctls on /dev/intel_sst_ctrl only*/
 #define SNDRV_SST_SET_ALGO     _IOW('L', 0x30,  struct snd_ppp_params *)
 #define SNDRV_SST_GET_ALGO     _IOWR('L', 0x31,  struct snd_ppp_params *)
+#define SNDRV_SST_TUNING_PARAMS        _IOW('L', 0x32,  struct 
snd_sst_tuning_params *)
 
 #endif /* __INTEL_SST_IOCTL_H__ */
diff --git a/sound/pci/sst/intel_sst_app_interface.c 
b/sound/pci/sst/intel_sst_app_interface.c
index cd78d72..4a0d1bb 100644
--- a/sound/pci/sst/intel_sst_app_interface.c
+++ b/sound/pci/sst/intel_sst_app_interface.c
@@ -950,6 +950,32 @@ free_mem:
        return retval;
 }
 
+
+int sst_ioctl_tuning_params(unsigned long arg)
+{
+       struct snd_sst_tuning_params params;
+       struct ipc_post *msg;
+
+       if (copy_from_user(&params, (void __user *)arg, sizeof(params)))
+               return -EFAULT;
+       if (params.size > SST_MAILBOX_SIZE)
+               return -ENOMEM;
+       pr_debug("sst: Parameter %d, Stream %d, Size %d\n", params.type,
+                       params.str_id, params.size);
+       if (sst_create_large_msg(&msg))
+               return -ENOMEM;
+       sst_fill_header(&msg->header, IPC_IA_TUNING_PARAMS, 1, params.str_id);
+       msg->header.part.data = sizeof(u32) + sizeof(params) + params.size;
+       memcpy(msg->mailbox_data, &msg->header.full, sizeof(u32));
+       memcpy(msg->mailbox_data + sizeof(u32), &params, sizeof(params));
+       if (copy_from_user(msg->mailbox_data + sizeof(params),
+                       (void __user *)params.addr, params.size)) {
+               kfree(msg->mailbox_data);
+               kfree(msg);
+               return -EFAULT;
+       }
+       return sst_send_algo_ipc(&msg);
+}
 /**
  * intel_sst_ioctl - recieves the device ioctl's
  * @file_ptr:pointer to file
@@ -1381,6 +1407,15 @@ long intel_sst_ioctl(struct file *file_ptr, unsigned int 
cmd, unsigned long arg)
                }
                retval = intel_sst_ioctl_dsp(cmd, arg);
                break;
+
+       case _IOC_NR(SNDRV_SST_TUNING_PARAMS):
+               if (minor != AM_MODULE) {
+                       retval = -EBADRQC;
+                       break;
+               }
+               retval = sst_ioctl_tuning_params(arg);
+               break;
+
        default:
                retval = -EINVAL;
        }
diff --git a/sound/pci/sst/intel_sst_common.h b/sound/pci/sst/intel_sst_common.h
index 4e02dd9..5759ea8 100644
--- a/sound/pci/sst/intel_sst_common.h
+++ b/sound/pci/sst/intel_sst_common.h
@@ -28,8 +28,8 @@
  *  Common private declarations for SST
  */
 
-#define SST_DRIVER_VERSION "1.2.14"
-#define SST_VERSION_NUM 0x1214
+#define SST_DRIVER_VERSION "1.2.15"
+#define SST_VERSION_NUM 0x1215
 
 /* driver names */
 #define SST_DRV_NAME "intel_sst_driver"
diff --git a/sound/pci/sst/intel_sst_fw_ipc.h b/sound/pci/sst/intel_sst_fw_ipc.h
index 11f9da9..d5abb8f 100644
--- a/sound/pci/sst/intel_sst_fw_ipc.h
+++ b/sound/pci/sst/intel_sst_fw_ipc.h
@@ -71,6 +71,7 @@
 #define IPC_IA_DECODE_FRAMES 0x18
 
 #define IPC_IA_ALG_PARAMS 0x1A
+#define IPC_IA_TUNING_PARAMS 0x1B
 
 /* I2L Stream config/control msgs */
 #define IPC_IA_ALLOC_STREAM 0x20 /* Allocate a stream ID */
diff --git a/sound/pci/sst/intel_sst_ipc.c b/sound/pci/sst/intel_sst_ipc.c
index 5da1df2..82a36ef 100644
--- a/sound/pci/sst/intel_sst_ipc.c
+++ b/sound/pci/sst/intel_sst_ipc.c
@@ -404,6 +404,24 @@ void sst_process_reply(struct work_struct *work)
                }
                break;
        }
+
+       case IPC_IA_TUNING_PARAMS: {
+               pr_debug("sst:IPC_TUNING_PARAMS resp: %x\n", msg->header.full);
+               pr_debug("sst: data value %x\n", msg->header.part.data);
+               if (msg->header.part.large) {
+                       pr_debug("sst: alg set failed\n");
+                       sst_drv_ctx->ppp_params_blk.ret_code =
+                                                       -msg->header.part.data;
+               } else {
+                       pr_debug("sst: alg set success\n");
+                       sst_drv_ctx->ppp_params_blk.ret_code = 0;
+               }
+               if (sst_drv_ctx->ppp_params_blk.on == true) {
+                       sst_drv_ctx->ppp_params_blk.condition = true;
+                       wake_up(&sst_drv_ctx->wait_queue);
+               }
+       }
+
        case IPC_IA_GET_FW_INFO: {
                struct snd_sst_fw_info *fw_info =
                        (struct snd_sst_fw_info *)msg->mailbox;
-- 
1.6.2.5

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to