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: Praveen Diwakar <praveen.diwakar@intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
1f2d86f1c0
commit
5749d70edc
|
@ -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 @@
|
||||||
#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 {
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue