ASoC: Intel: use local values for ssp configuration
authorVinod Koul <vinod.koul@intel.com>
Wed, 6 May 2015 16:36:41 +0000 (22:06 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 6 May 2015 18:50:22 +0000 (19:50 +0100)
So right now SSP configuration is statically coded in the driver. While we
would like to keep this configuration intact for the users who are using
these defaults, we need to provide a way for users to program it.
So create a local value in driver structure which is populate with default
value for now

Signed-off-by: Praveen Diwakar <praveen.diwakar@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/atom/sst-atom-controls.c
sound/soc/intel/atom/sst-mfld-platform.h

index 59517b3fa04d78d1f8a336e3460e65ec665f0715..93c6c8b5fbc61fb9054766fa067024386201d60c 100644 (file)
@@ -793,45 +793,52 @@ static const struct sst_ssp_config sst_ssp_configs = {
        .data_polarity = 1,
 };
 
+void sst_fill_ssp_defaults(struct snd_soc_dai *dai)
+{
+       const struct sst_ssp_config *config;
+       struct sst_data *ctx = snd_soc_dai_get_drvdata(dai);
+
+       config = &sst_ssp_configs;
+
+       ctx->ssp_cmd.selection = config->ssp_id;
+       ctx->ssp_cmd.nb_bits_per_slots = config->bits_per_slot;
+       ctx->ssp_cmd.nb_slots = config->slots;
+       ctx->ssp_cmd.mode = config->ssp_mode | (config->pcm_mode << 1);
+       ctx->ssp_cmd.duplex = config->duplex;
+       ctx->ssp_cmd.active_tx_slot_map = config->active_slot_map;
+       ctx->ssp_cmd.active_rx_slot_map = config->active_slot_map;
+       ctx->ssp_cmd.frame_sync_frequency = config->fs_frequency;
+       ctx->ssp_cmd.frame_sync_polarity = config->frame_sync_polarity;
+       ctx->ssp_cmd.data_polarity = config->data_polarity;
+       ctx->ssp_cmd.frame_sync_width = config->fs_width;
+       ctx->ssp_cmd.ssp_protocol = config->ssp_protocol;
+       ctx->ssp_cmd.start_delay = config->start_delay;
+       ctx->ssp_cmd.reserved1 = ctx->ssp_cmd.reserved2 = 0xFF;
+}
+
 int send_ssp_cmd(struct snd_soc_dai *dai, const char *id, bool enable)
 {
-       struct sst_cmd_sba_hw_set_ssp cmd;
        struct sst_data *drv = snd_soc_dai_get_drvdata(dai);
        const struct sst_ssp_config *config;
 
        dev_info(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id);
 
-       SST_FILL_DEFAULT_DESTINATION(cmd.header.dst);
-       cmd.header.command_id = SBA_HW_SET_SSP;
-       cmd.header.length = sizeof(struct sst_cmd_sba_hw_set_ssp)
+       SST_FILL_DEFAULT_DESTINATION(drv->ssp_cmd.header.dst);
+       drv->ssp_cmd.header.command_id = SBA_HW_SET_SSP;
+       drv->ssp_cmd.header.length = sizeof(struct sst_cmd_sba_hw_set_ssp)
                                - sizeof(struct sst_dsp_header);
 
        config = &sst_ssp_configs;
        dev_dbg(dai->dev, "ssp_id: %u\n", config->ssp_id);
 
        if (enable)
-               cmd.switch_state = SST_SWITCH_ON;
+               drv->ssp_cmd.switch_state = SST_SWITCH_ON;
        else
-               cmd.switch_state = SST_SWITCH_OFF;
-
-       cmd.selection = config->ssp_id;
-       cmd.nb_bits_per_slots = config->bits_per_slot;
-       cmd.nb_slots = config->slots;
-       cmd.mode = config->ssp_mode | (config->pcm_mode << 1);
-       cmd.duplex = config->duplex;
-       cmd.active_tx_slot_map = config->active_slot_map;
-       cmd.active_rx_slot_map = config->active_slot_map;
-       cmd.frame_sync_frequency = config->fs_frequency;
-       cmd.frame_sync_polarity = SSP_FS_ACTIVE_HIGH;
-       cmd.data_polarity = 1;
-       cmd.frame_sync_width = config->fs_width;
-       cmd.ssp_protocol = config->ssp_protocol;
-       cmd.start_delay = config->start_delay;
-       cmd.reserved1 = cmd.reserved2 = 0xFF;
+               drv->ssp_cmd.switch_state = SST_SWITCH_OFF;
 
        return sst_fill_and_send_cmd(drv, SST_IPC_IA_CMD, SST_FLAG_BLOCKED,
-                               SST_TASK_SBA, 0, &cmd,
-                               sizeof(cmd.header) + cmd.header.length);
+                               SST_TASK_SBA, 0, &drv->ssp_cmd,
+                               sizeof(drv->ssp_cmd.header) + drv->ssp_cmd.header.length);
 }
 
 static int sst_set_be_modules(struct snd_soc_dapm_widget *w,
index 9094314be2b043e724bfcf3db3f0f54b10dd61d4..2409b23eeacf4d62b6ed377c13666b063c92b6ff 100644 (file)
@@ -22,6 +22,7 @@
 #define __SST_PLATFORMDRV_H__
 
 #include "sst-mfld-dsp.h"
+#include "sst-atom-controls.h"
 
 extern struct sst_device *sst;
 
@@ -175,6 +176,7 @@ struct sst_data {
        struct snd_sst_bytes_v2 *byte_stream;
        struct mutex lock;
        struct snd_soc_card *soc_card;
+       struct sst_cmd_sba_hw_set_ssp ssp_cmd;
 };
 int sst_register_dsp(struct sst_device *sst);
 int sst_unregister_dsp(struct sst_device *sst);