Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* sst-atom-controls.c - Intel MID Platform driver DPCM ALSA controls for Mrfld
|
||||
*
|
||||
* Copyright (C) 2013-14 Intel Corp
|
||||
@@ -534,6 +534,7 @@ static const DECLARE_TLV_DB_SCALE(sst_gain_tlv_common, SST_GAIN_MIN_VALUE * 10,
|
||||
|
||||
/* Look up table to convert MIXER SW bit regs to SWM inputs */
|
||||
static const uint swm_mixer_input_ids[SST_SWM_INPUT_COUNT] = {
|
||||
[SST_IP_MODEM] = SST_SWM_IN_MODEM,
|
||||
[SST_IP_CODEC0] = SST_SWM_IN_CODEC0,
|
||||
[SST_IP_CODEC1] = SST_SWM_IN_CODEC1,
|
||||
[SST_IP_LOOP0] = SST_SWM_IN_SPROT_LOOP,
|
||||
@@ -674,6 +675,7 @@ static int sst_swm_mixer_event(struct snd_soc_dapm_widget *w,
|
||||
/* SBA mixers - 16 inputs */
|
||||
#define SST_SBA_DECLARE_MIX_CONTROLS(kctl_name) \
|
||||
static const struct snd_kcontrol_new kctl_name[] = { \
|
||||
SOC_DAPM_SINGLE("modem_in Switch", SND_SOC_NOPM, SST_IP_MODEM, 1, 0), \
|
||||
SOC_DAPM_SINGLE("codec_in0 Switch", SND_SOC_NOPM, SST_IP_CODEC0, 1, 0), \
|
||||
SOC_DAPM_SINGLE("codec_in1 Switch", SND_SOC_NOPM, SST_IP_CODEC1, 1, 0), \
|
||||
SOC_DAPM_SINGLE("sprot_loop_in Switch", SND_SOC_NOPM, SST_IP_LOOP0, 1, 0), \
|
||||
@@ -684,6 +686,7 @@ static int sst_swm_mixer_event(struct snd_soc_dapm_widget *w,
|
||||
}
|
||||
|
||||
#define SST_SBA_MIXER_GRAPH_MAP(mix_name) \
|
||||
{ mix_name, "modem_in Switch", "modem_in" }, \
|
||||
{ mix_name, "codec_in0 Switch", "codec_in0" }, \
|
||||
{ mix_name, "codec_in1 Switch", "codec_in1" }, \
|
||||
{ mix_name, "sprot_loop_in Switch", "sprot_loop_in" }, \
|
||||
@@ -713,6 +716,7 @@ SST_SBA_DECLARE_MIX_CONTROLS(sst_mix_media_l2_controls);
|
||||
SST_SBA_DECLARE_MIX_CONTROLS(sst_mix_voip_controls);
|
||||
SST_SBA_DECLARE_MIX_CONTROLS(sst_mix_codec0_controls);
|
||||
SST_SBA_DECLARE_MIX_CONTROLS(sst_mix_codec1_controls);
|
||||
SST_SBA_DECLARE_MIX_CONTROLS(sst_mix_modem_controls);
|
||||
|
||||
/*
|
||||
* sst_handle_vb_timer - Start/Stop the DSP scheduler
|
||||
@@ -931,17 +935,26 @@ void sst_fill_ssp_defaults(struct snd_soc_dai *dai)
|
||||
int send_ssp_cmd(struct snd_soc_dai *dai, const char *id, bool enable)
|
||||
{
|
||||
struct sst_data *drv = snd_soc_dai_get_drvdata(dai);
|
||||
const struct sst_ssp_config *config;
|
||||
int ssp_id;
|
||||
|
||||
dev_info(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id);
|
||||
|
||||
if (strcmp(id, "ssp0-port") == 0)
|
||||
ssp_id = SSP_MODEM;
|
||||
else if (strcmp(id, "ssp2-port") == 0)
|
||||
ssp_id = SSP_CODEC;
|
||||
else {
|
||||
dev_dbg(dai->dev, "port %s is not supported\n", id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
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);
|
||||
drv->ssp_cmd.selection = ssp_id;
|
||||
dev_dbg(dai->dev, "ssp_id: %u\n", ssp_id);
|
||||
|
||||
if (enable)
|
||||
drv->ssp_cmd.switch_state = SST_SWITCH_ON;
|
||||
@@ -1047,8 +1060,10 @@ static int sst_set_media_loop(struct snd_soc_dapm_widget *w,
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget sst_dapm_widgets[] = {
|
||||
SST_AIF_IN("modem_in", sst_set_be_modules),
|
||||
SST_AIF_IN("codec_in0", sst_set_be_modules),
|
||||
SST_AIF_IN("codec_in1", sst_set_be_modules),
|
||||
SST_AIF_OUT("modem_out", sst_set_be_modules),
|
||||
SST_AIF_OUT("codec_out0", sst_set_be_modules),
|
||||
SST_AIF_OUT("codec_out1", sst_set_be_modules),
|
||||
|
||||
@@ -1103,6 +1118,9 @@ static const struct snd_soc_dapm_widget sst_dapm_widgets[] = {
|
||||
sst_mix_codec0_controls, sst_swm_mixer_event),
|
||||
SST_SWM_MIXER("codec_out1 mix 0", SND_SOC_NOPM, SST_TASK_SBA, SST_SWM_OUT_CODEC1,
|
||||
sst_mix_codec1_controls, sst_swm_mixer_event),
|
||||
SST_SWM_MIXER("modem_out mix 0", SND_SOC_NOPM, SST_TASK_SBA, SST_SWM_OUT_MODEM,
|
||||
sst_mix_modem_controls, sst_swm_mixer_event),
|
||||
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route intercon[] = {
|
||||
@@ -1148,6 +1166,9 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
SST_SBA_MIXER_GRAPH_MAP("codec_out0 mix 0"),
|
||||
{"codec_out1", NULL, "codec_out1 mix 0"},
|
||||
SST_SBA_MIXER_GRAPH_MAP("codec_out1 mix 0"),
|
||||
{"modem_out", NULL, "modem_out mix 0"},
|
||||
SST_SBA_MIXER_GRAPH_MAP("modem_out mix 0"),
|
||||
|
||||
|
||||
};
|
||||
static const char * const slot_names[] = {
|
||||
@@ -1217,6 +1238,9 @@ static const struct snd_kcontrol_new sst_gain_controls[] = {
|
||||
SST_GAIN("media_loop2_out", SST_PATH_INDEX_MEDIA_LOOP2_OUT, SST_TASK_SBA, 0, &sst_gains[13]),
|
||||
SST_GAIN("sprot_loop_out", SST_PATH_INDEX_SPROT_LOOP_OUT, SST_TASK_SBA, 0, &sst_gains[14]),
|
||||
SST_VOLUME("media0_in", SST_PATH_INDEX_MEDIA0_IN, SST_TASK_MMX, 0, &sst_gains[15]),
|
||||
SST_GAIN("modem_in", SST_PATH_INDEX_MODEM_IN, SST_TASK_SBA, 0, &sst_gains[16]),
|
||||
SST_GAIN("modem_out", SST_PATH_INDEX_MODEM_OUT, SST_TASK_SBA, 0, &sst_gains[17]),
|
||||
|
||||
};
|
||||
|
||||
#define SST_GAIN_NUM_CONTROLS 3
|
||||
|
@@ -35,6 +35,8 @@ enum {
|
||||
/* define a bit for each mixer input */
|
||||
#define SST_MIX_IP(x) (x)
|
||||
|
||||
#define SST_IP_MODEM SST_MIX_IP(0)
|
||||
#define SST_IP_BT SST_MIX_IP(1)
|
||||
#define SST_IP_CODEC0 SST_MIX_IP(2)
|
||||
#define SST_IP_CODEC1 SST_MIX_IP(3)
|
||||
#define SST_IP_LOOP0 SST_MIX_IP(4)
|
||||
@@ -63,6 +65,7 @@ enum {
|
||||
* Audio DSP Path Ids. Specified by the audio DSP FW
|
||||
*/
|
||||
enum sst_path_index {
|
||||
SST_PATH_INDEX_MODEM_OUT = (0x00 << SST_PATH_ID_SHIFT),
|
||||
SST_PATH_INDEX_CODEC_OUT0 = (0x02 << SST_PATH_ID_SHIFT),
|
||||
SST_PATH_INDEX_CODEC_OUT1 = (0x03 << SST_PATH_ID_SHIFT),
|
||||
|
||||
@@ -80,6 +83,7 @@ enum sst_path_index {
|
||||
|
||||
|
||||
/* Start of input paths */
|
||||
SST_PATH_INDEX_MODEM_IN = (0x80 << SST_PATH_ID_SHIFT),
|
||||
SST_PATH_INDEX_CODEC_IN0 = (0x82 << SST_PATH_ID_SHIFT),
|
||||
SST_PATH_INDEX_CODEC_IN1 = (0x83 << SST_PATH_ID_SHIFT),
|
||||
|
||||
@@ -105,6 +109,7 @@ enum sst_path_index {
|
||||
* path IDs
|
||||
*/
|
||||
enum sst_swm_inputs {
|
||||
SST_SWM_IN_MODEM = (SST_PATH_INDEX_MODEM_IN | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_IN_CODEC0 = (SST_PATH_INDEX_CODEC_IN0 | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_IN_CODEC1 = (SST_PATH_INDEX_CODEC_IN1 | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_IN_SPROT_LOOP = (SST_PATH_INDEX_SPROT_LOOP_IN | SST_DEFAULT_CELL_NBR),
|
||||
@@ -124,6 +129,7 @@ enum sst_swm_inputs {
|
||||
* path IDs
|
||||
*/
|
||||
enum sst_swm_outputs {
|
||||
SST_SWM_OUT_MODEM = (SST_PATH_INDEX_MODEM_OUT | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_OUT_CODEC0 = (SST_PATH_INDEX_CODEC_OUT0 | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_OUT_CODEC1 = (SST_PATH_INDEX_CODEC_OUT1 | SST_DEFAULT_CELL_NBR),
|
||||
SST_SWM_OUT_SPROT_LOOP = (SST_PATH_INDEX_SPROT_LOOP_OUT | SST_DEFAULT_CELL_NBR),
|
||||
|
@@ -190,7 +190,8 @@ int sst_driver_ops(struct intel_sst_drv *sst)
|
||||
|
||||
default:
|
||||
dev_err(sst->dev,
|
||||
"SST Driver capablities missing for dev_id: %x", sst->dev_id);
|
||||
"SST Driver capabilities missing for dev_id: %x",
|
||||
sst->dev_id);
|
||||
return -EINVAL;
|
||||
};
|
||||
}
|
||||
@@ -441,7 +442,7 @@ static int intel_sst_suspend(struct device *dev)
|
||||
struct stream_info *stream = &ctx->streams[i];
|
||||
|
||||
if (stream->status == STREAM_RUNNING) {
|
||||
dev_err(dev, "stream %d is running, cant susupend, abort\n", i);
|
||||
dev_err(dev, "stream %d is running, can't suspend, abort\n", i);
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,8 @@
|
||||
#include <acpi/platform/aclinux.h>
|
||||
#include <acpi/actypes.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <asm/cpu_device_id.h>
|
||||
#include <asm/iosf_mbi.h>
|
||||
#include "../sst-mfld-platform.h"
|
||||
#include "../../common/sst-dsp.h"
|
||||
#include "../../common/sst-acpi.h"
|
||||
@@ -113,6 +115,28 @@ static const struct sst_res_info byt_rvp_res_info = {
|
||||
.acpi_ipc_irq_index = 5,
|
||||
};
|
||||
|
||||
/* BYTCR has different BIOS from BYT */
|
||||
static const struct sst_res_info bytcr_res_info = {
|
||||
.shim_offset = 0x140000,
|
||||
.shim_size = 0x000100,
|
||||
.shim_phy_addr = SST_BYT_SHIM_PHY_ADDR,
|
||||
.ssp0_offset = 0xa0000,
|
||||
.ssp0_size = 0x1000,
|
||||
.dma0_offset = 0x98000,
|
||||
.dma0_size = 0x4000,
|
||||
.dma1_offset = 0x9c000,
|
||||
.dma1_size = 0x4000,
|
||||
.iram_offset = 0x0c0000,
|
||||
.iram_size = 0x14000,
|
||||
.dram_offset = 0x100000,
|
||||
.dram_size = 0x28000,
|
||||
.mbox_offset = 0x144000,
|
||||
.mbox_size = 0x1000,
|
||||
.acpi_lpe_res_index = 0,
|
||||
.acpi_ddr_index = 2,
|
||||
.acpi_ipc_irq_index = 0
|
||||
};
|
||||
|
||||
static struct sst_platform_info byt_rvp_platform_data = {
|
||||
.probe_data = &byt_fwparse_info,
|
||||
.ipc_info = &byt_ipc_info,
|
||||
@@ -142,7 +166,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
rsrc = platform_get_resource(pdev, IORESOURCE_MEM,
|
||||
ctx->pdata->res_info->acpi_lpe_res_index);
|
||||
if (!rsrc) {
|
||||
dev_err(ctx->dev, "Invalid SHIM base from IFWI");
|
||||
dev_err(ctx->dev, "Invalid SHIM base from IFWI\n");
|
||||
return -EIO;
|
||||
}
|
||||
dev_info(ctx->dev, "LPE base: %#x size:%#x", (unsigned int) rsrc->start,
|
||||
@@ -154,7 +178,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
ctx->iram = devm_ioremap_nocache(ctx->dev, ctx->iram_base,
|
||||
ctx->pdata->res_info->iram_size);
|
||||
if (!ctx->iram) {
|
||||
dev_err(ctx->dev, "unable to map IRAM");
|
||||
dev_err(ctx->dev, "unable to map IRAM\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -164,7 +188,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
ctx->dram = devm_ioremap_nocache(ctx->dev, ctx->dram_base,
|
||||
ctx->pdata->res_info->dram_size);
|
||||
if (!ctx->dram) {
|
||||
dev_err(ctx->dev, "unable to map DRAM");
|
||||
dev_err(ctx->dev, "unable to map DRAM\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -173,7 +197,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
ctx->shim = devm_ioremap_nocache(ctx->dev, ctx->shim_phy_add,
|
||||
ctx->pdata->res_info->shim_size);
|
||||
if (!ctx->shim) {
|
||||
dev_err(ctx->dev, "unable to map SHIM");
|
||||
dev_err(ctx->dev, "unable to map SHIM\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -186,7 +210,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
ctx->mailbox = devm_ioremap_nocache(ctx->dev, ctx->mailbox_add,
|
||||
ctx->pdata->res_info->mbox_size);
|
||||
if (!ctx->mailbox) {
|
||||
dev_err(ctx->dev, "unable to map mailbox");
|
||||
dev_err(ctx->dev, "unable to map mailbox\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -196,7 +220,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
rsrc = platform_get_resource(pdev, IORESOURCE_MEM,
|
||||
ctx->pdata->res_info->acpi_ddr_index);
|
||||
if (!rsrc) {
|
||||
dev_err(ctx->dev, "Invalid DDR base from IFWI");
|
||||
dev_err(ctx->dev, "Invalid DDR base from IFWI\n");
|
||||
return -EIO;
|
||||
}
|
||||
ctx->ddr_base = rsrc->start;
|
||||
@@ -205,7 +229,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
ctx->ddr = devm_ioremap_nocache(ctx->dev, ctx->ddr_base,
|
||||
resource_size(rsrc));
|
||||
if (!ctx->ddr) {
|
||||
dev_err(ctx->dev, "unable to map DDR");
|
||||
dev_err(ctx->dev, "unable to map DDR\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -215,6 +239,46 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int is_byt_cr(struct device *dev, bool *bytcr)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_IOSF_MBI)) {
|
||||
static const struct x86_cpu_id cpu_ids[] = {
|
||||
{ X86_VENDOR_INTEL, 6, 55 }, /* Valleyview, Bay Trail */
|
||||
{}
|
||||
};
|
||||
u32 bios_status;
|
||||
|
||||
if (!x86_match_cpu(cpu_ids) || !iosf_mbi_available()) {
|
||||
/* bail silently */
|
||||
return status;
|
||||
}
|
||||
|
||||
status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */
|
||||
MBI_REG_READ, /* 0x10 */
|
||||
0x006, /* BIOS_CONFIG */
|
||||
&bios_status);
|
||||
|
||||
if (status) {
|
||||
dev_err(dev, "could not read PUNIT BIOS_CONFIG\n");
|
||||
} else {
|
||||
/* bits 26:27 mirror PMIC options */
|
||||
bios_status = (bios_status >> 26) & 3;
|
||||
|
||||
if ((bios_status == 1) || (bios_status == 3))
|
||||
*bytcr = true;
|
||||
else
|
||||
dev_info(dev, "BYT-CR not detected\n");
|
||||
}
|
||||
} else {
|
||||
dev_info(dev, "IOSF_MBI not enabled, no BYT-CR detection\n");
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static int sst_acpi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
@@ -226,11 +290,12 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
||||
struct platform_device *plat_dev;
|
||||
struct sst_platform_info *pdata;
|
||||
unsigned int dev_id;
|
||||
bool bytcr = false;
|
||||
|
||||
id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||
if (!id)
|
||||
return -ENODEV;
|
||||
dev_dbg(dev, "for %s", id->id);
|
||||
dev_dbg(dev, "for %s\n", id->id);
|
||||
|
||||
mach = (struct sst_acpi_mach *)id->driver_data;
|
||||
mach = sst_acpi_find_machine(mach);
|
||||
@@ -251,6 +316,18 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
||||
|
||||
dev_dbg(dev, "ACPI device id: %x\n", dev_id);
|
||||
|
||||
ret = sst_alloc_drv_context(&ctx, dev, dev_id);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = is_byt_cr(dev, &bytcr);
|
||||
if (!((ret < 0) || (bytcr == false))) {
|
||||
dev_info(dev, "Detected Baytrail-CR platform\n");
|
||||
|
||||
/* override resource info */
|
||||
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
||||
}
|
||||
|
||||
plat_dev = platform_device_register_data(dev, pdata->platform, -1,
|
||||
NULL, 0);
|
||||
if (IS_ERR(plat_dev)) {
|
||||
@@ -271,10 +348,6 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(mdev);
|
||||
}
|
||||
|
||||
ret = sst_alloc_drv_context(&ctx, dev, dev_id);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Fill sst platform data */
|
||||
ctx->pdata = pdata;
|
||||
strcpy(ctx->firmware_name, mach->fw_filename);
|
||||
|
Reference in New Issue
Block a user