Commit 5749d70e authored by Vinod Koul's avatar Vinod Koul Committed by Mark Brown

ASoC: Intel: use local values for ssp configuration

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: default avatarPraveen Diwakar <praveen.diwakar@intel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1f2d86f1
...@@ -793,45 +793,52 @@ static const struct sst_ssp_config sst_ssp_configs = { ...@@ -793,45 +793,52 @@ static const struct sst_ssp_config sst_ssp_configs = {
.data_polarity = 1, .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) 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); struct sst_data *drv = snd_soc_dai_get_drvdata(dai);
const struct sst_ssp_config *config; const struct sst_ssp_config *config;
dev_info(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id); dev_info(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id);
SST_FILL_DEFAULT_DESTINATION(cmd.header.dst); SST_FILL_DEFAULT_DESTINATION(drv->ssp_cmd.header.dst);
cmd.header.command_id = SBA_HW_SET_SSP; drv->ssp_cmd.header.command_id = SBA_HW_SET_SSP;
cmd.header.length = sizeof(struct sst_cmd_sba_hw_set_ssp) drv->ssp_cmd.header.length = sizeof(struct sst_cmd_sba_hw_set_ssp)
- sizeof(struct sst_dsp_header); - sizeof(struct sst_dsp_header);
config = &sst_ssp_configs; config = &sst_ssp_configs;
dev_dbg(dai->dev, "ssp_id: %u\n", config->ssp_id); dev_dbg(dai->dev, "ssp_id: %u\n", config->ssp_id);
if (enable) if (enable)
cmd.switch_state = SST_SWITCH_ON; drv->ssp_cmd.switch_state = SST_SWITCH_ON;
else else
cmd.switch_state = SST_SWITCH_OFF; drv->ssp_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;
return sst_fill_and_send_cmd(drv, SST_IPC_IA_CMD, SST_FLAG_BLOCKED, return sst_fill_and_send_cmd(drv, SST_IPC_IA_CMD, SST_FLAG_BLOCKED,
SST_TASK_SBA, 0, &cmd, SST_TASK_SBA, 0, &drv->ssp_cmd,
sizeof(cmd.header) + cmd.header.length); sizeof(drv->ssp_cmd.header) + drv->ssp_cmd.header.length);
} }
static int sst_set_be_modules(struct snd_soc_dapm_widget *w, static int sst_set_be_modules(struct snd_soc_dapm_widget *w,
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#define __SST_PLATFORMDRV_H__ #define __SST_PLATFORMDRV_H__
#include "sst-mfld-dsp.h" #include "sst-mfld-dsp.h"
#include "sst-atom-controls.h"
extern struct sst_device *sst; extern struct sst_device *sst;
...@@ -175,6 +176,7 @@ struct sst_data { ...@@ -175,6 +176,7 @@ struct sst_data {
struct snd_sst_bytes_v2 *byte_stream; struct snd_sst_bytes_v2 *byte_stream;
struct mutex lock; struct mutex lock;
struct snd_soc_card *soc_card; 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_register_dsp(struct sst_device *sst);
int sst_unregister_dsp(struct sst_device *sst); int sst_unregister_dsp(struct sst_device *sst);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment