soundwire: Intel: introduce DMI quirks for HP Spectre x360 Convertible
HP Spectre x360 Convertible devices expose invalid _ADR fields in the DSDT, which prevents codec drivers from probing. A possible solution is to override the DSDT, but that's just too painful for users. This patch suggests a simple DMI-based quirk to remap the existing invalid ADR information into valid ones. BugLink: https://github.com/thesofproject/linux/issues/2700 Co-developed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Rander Wang <rander.wang@intel.com> Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> Link: https://lore.kernel.org/r/20210302075105.11515-3-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
6558b667a7
commit
f6594cdfec
|
@ -20,7 +20,7 @@ soundwire-cadence-y := cadence_master.o
|
|||
obj-$(CONFIG_SOUNDWIRE_CADENCE) += soundwire-cadence.o
|
||||
|
||||
#Intel driver
|
||||
soundwire-intel-y := intel.o intel_init.o
|
||||
soundwire-intel-y := intel.o intel_init.o dmi-quirks.o
|
||||
obj-$(CONFIG_SOUNDWIRE_INTEL) += soundwire-intel.o
|
||||
|
||||
#Qualcomm driver
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#define DEFAULT_BANK_SWITCH_TIMEOUT 3000
|
||||
#define DEFAULT_PROBE_TIMEOUT 2000
|
||||
|
||||
u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr);
|
||||
|
||||
#if IS_ENABLED(CONFIG_ACPI)
|
||||
int sdw_acpi_find_slaves(struct sdw_bus *bus);
|
||||
#else
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
|
||||
// Copyright(c) 2021 Intel Corporation.
|
||||
|
||||
/*
|
||||
* Soundwire DMI quirks
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/soundwire/sdw.h>
|
||||
#include "bus.h"
|
||||
|
||||
struct adr_remap {
|
||||
u64 adr;
|
||||
u64 remapped_adr;
|
||||
};
|
||||
|
||||
/*
|
||||
* HP Spectre 360 Convertible devices do not expose the correct _ADR
|
||||
* in the DSDT.
|
||||
* Remap the bad _ADR values to the ones reported by hardware
|
||||
*/
|
||||
static const struct adr_remap hp_spectre_360[] = {
|
||||
{
|
||||
0x000010025D070100,
|
||||
0x000020025D071100
|
||||
},
|
||||
{
|
||||
0x000110025d070100,
|
||||
0x000120025D130800
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct dmi_system_id adr_remap_quirk_table[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Spectre x360 Convertible"),
|
||||
},
|
||||
.driver_data = (void *)hp_spectre_360,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
u64 sdw_dmi_override_adr(struct sdw_bus *bus, u64 addr)
|
||||
{
|
||||
const struct dmi_system_id *dmi_id;
|
||||
|
||||
/* check if any address remap quirk applies */
|
||||
dmi_id = dmi_first_match(adr_remap_quirk_table);
|
||||
if (dmi_id) {
|
||||
struct adr_remap *map = dmi_id->driver_data;
|
||||
|
||||
for (map = dmi_id->driver_data; map->adr; map++) {
|
||||
if (map->adr == addr) {
|
||||
dev_dbg(bus->dev, "remapped _ADR 0x%llx as 0x%llx\n",
|
||||
addr, map->remapped_adr);
|
||||
addr = map->remapped_adr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
|
@ -1302,6 +1302,7 @@ static int intel_prop_read(struct sdw_bus *bus)
|
|||
|
||||
static struct sdw_master_ops sdw_intel_ops = {
|
||||
.read_prop = sdw_master_read_prop,
|
||||
.override_adr = sdw_dmi_override_adr,
|
||||
.xfer_msg = cdns_xfer_msg,
|
||||
.xfer_msg_defer = cdns_xfer_msg_defer,
|
||||
.reset_page_addr = cdns_reset_page_addr,
|
||||
|
|
Loading…
Reference in New Issue