mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
ASoC: Intel: sst: Support LPE0F28 ACPI HID
Some old Bay Trail tablets which shipped with Android as factory OS have the SST/LPE audio engine described by an ACPI device with a HID (Hardware-ID) of LPE0F28 instead of 80860F28. Add support for this. Note this uses a new sst_res_info for just the LPE0F28 case because it has a different layout for the IO-mem ACPI resources then the 80860F28. An example of a tablet which needs this is the Vexia EDU ATLA 10 tablet, which has been distributed to schools in the Spanish Andalucía region. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Link: https://patch.msgid.link/20241025090221.52198-1-hdegoede@redhat.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
0107f28f13
commit
6668610b4d
@ -721,6 +721,10 @@ static const struct config_entry acpi_config_table[] = {
|
|||||||
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
|
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
|
||||||
IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
/* BayTrail */
|
/* BayTrail */
|
||||||
|
{
|
||||||
|
.flags = FLAG_SST_OR_SOF_BYT,
|
||||||
|
.acpi_hid = "LPE0F28",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.flags = FLAG_SST_OR_SOF_BYT,
|
.flags = FLAG_SST_OR_SOF_BYT,
|
||||||
.acpi_hid = "80860F28",
|
.acpi_hid = "80860F28",
|
||||||
|
@ -125,6 +125,28 @@ static const struct sst_res_info bytcr_res_info = {
|
|||||||
.acpi_ipc_irq_index = 0
|
.acpi_ipc_irq_index = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* For "LPE0F28" ACPI device found on some Android factory OS models */
|
||||||
|
static const struct sst_res_info lpe8086_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 = 1,
|
||||||
|
.acpi_ddr_index = 0,
|
||||||
|
.acpi_ipc_irq_index = 0
|
||||||
|
};
|
||||||
|
|
||||||
static struct sst_platform_info byt_rvp_platform_data = {
|
static struct sst_platform_info byt_rvp_platform_data = {
|
||||||
.probe_data = &byt_fwparse_info,
|
.probe_data = &byt_fwparse_info,
|
||||||
.ipc_info = &byt_ipc_info,
|
.ipc_info = &byt_ipc_info,
|
||||||
@ -268,10 +290,38 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
|||||||
mach->pdata = &chv_platform_data;
|
mach->pdata = &chv_platform_data;
|
||||||
pdata = mach->pdata;
|
pdata = mach->pdata;
|
||||||
|
|
||||||
ret = kstrtouint(id->id, 16, &dev_id);
|
if (!strcmp(id->id, "LPE0F28")) {
|
||||||
if (ret < 0) {
|
struct resource *rsrc;
|
||||||
dev_err(dev, "Unique device id conversion error: %d\n", ret);
|
|
||||||
return ret;
|
/* Use regular BYT SST PCI VID:PID */
|
||||||
|
dev_id = 0x80860F28;
|
||||||
|
byt_rvp_platform_data.res_info = &lpe8086_res_info;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The "LPE0F28" ACPI device has separate IO-mem resources for:
|
||||||
|
* DDR, SHIM, MBOX, IRAM, DRAM, CFG
|
||||||
|
* None of which covers the entire LPE base address range.
|
||||||
|
* lpe8086_res_info.acpi_lpe_res_index points to the SHIM.
|
||||||
|
* Patch this to cover the entire base address range as expected
|
||||||
|
* by sst_platform_get_resources().
|
||||||
|
*/
|
||||||
|
rsrc = platform_get_resource(pdev, IORESOURCE_MEM,
|
||||||
|
pdata->res_info->acpi_lpe_res_index);
|
||||||
|
if (!rsrc) {
|
||||||
|
dev_err(ctx->dev, "Invalid SHIM base\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
rsrc->start -= pdata->res_info->shim_offset;
|
||||||
|
rsrc->end = rsrc->start + 0x200000 - 1;
|
||||||
|
} else {
|
||||||
|
ret = kstrtouint(id->id, 16, &dev_id);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "Unique device id conversion error: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (soc_intel_is_byt_cr(pdev))
|
||||||
|
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(dev, "ACPI device id: %x\n", dev_id);
|
dev_dbg(dev, "ACPI device id: %x\n", dev_id);
|
||||||
@ -280,11 +330,6 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (soc_intel_is_byt_cr(pdev)) {
|
|
||||||
/* override resource info */
|
|
||||||
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update machine parameters */
|
/* update machine parameters */
|
||||||
mach->mach_params.acpi_ipc_irq_index =
|
mach->mach_params.acpi_ipc_irq_index =
|
||||||
pdata->res_info->acpi_ipc_irq_index;
|
pdata->res_info->acpi_ipc_irq_index;
|
||||||
@ -344,6 +389,7 @@ static void sst_acpi_remove(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct acpi_device_id sst_acpi_ids[] = {
|
static const struct acpi_device_id sst_acpi_ids[] = {
|
||||||
|
{ "LPE0F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
|
||||||
{ "80860F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
|
{ "80860F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
|
||||||
{ "808622A8", (unsigned long)&snd_soc_acpi_intel_cherrytrail_machines},
|
{ "808622A8", (unsigned long)&snd_soc_acpi_intel_cherrytrail_machines},
|
||||||
{ },
|
{ },
|
||||||
|
Loading…
Reference in New Issue
Block a user