mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +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) || \
|
||||
IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||
/* BayTrail */
|
||||
{
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "LPE0F28",
|
||||
},
|
||||
{
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "80860F28",
|
||||
|
@ -125,6 +125,28 @@ static const struct sst_res_info bytcr_res_info = {
|
||||
.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 = {
|
||||
.probe_data = &byt_fwparse_info,
|
||||
.ipc_info = &byt_ipc_info,
|
||||
@ -268,10 +290,38 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
||||
mach->pdata = &chv_platform_data;
|
||||
pdata = mach->pdata;
|
||||
|
||||
ret = kstrtouint(id->id, 16, &dev_id);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Unique device id conversion error: %d\n", ret);
|
||||
return ret;
|
||||
if (!strcmp(id->id, "LPE0F28")) {
|
||||
struct resource *rsrc;
|
||||
|
||||
/* 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);
|
||||
@ -280,11 +330,6 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (soc_intel_is_byt_cr(pdev)) {
|
||||
/* override resource info */
|
||||
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
||||
}
|
||||
|
||||
/* update machine parameters */
|
||||
mach->mach_params.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[] = {
|
||||
{ "LPE0F28", (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},
|
||||
{ },
|
||||
|
Loading…
Reference in New Issue
Block a user