Bluetooth: hci_bcm: Add broken-irq dmi blacklist and add Meegopad T08 to it
The Meegopad T08 hdmi-stick (think Intel computestick) has a brcm43430 wifi/bt combo chip. The BCM2E90 ACPI device describing the BT part does contain a valid ActiveLow GpioInt entry, but the GPIO it points to never goes low, so either the IRQ pin is not connected, or the ACPI resource- table points to the wrong GPIO. Eitherway things will not work if we try to use the specified IRQ, this commits adds a DMI based broken-irq blacklist and disables use of the IRQ and thus also runtime-pm for devices on this list. This blacklist starts with the the Meegopad T08, fixing bluetooth not working on this hdmi-stick. Since this is not a battery powered device the loss of runtime-pm is not really an issue. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
538e2de104
commit
2b05393b06
|
@ -794,6 +794,20 @@ static const struct acpi_gpio_mapping acpi_bcm_int_first_gpios[] = {
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Some firmware reports an IRQ which does not work (wrong pin in fw table?) */
|
||||||
|
static const struct dmi_system_id bcm_broken_irq_dmi_table[] = {
|
||||||
|
{
|
||||||
|
.ident = "Meegopad T08",
|
||||||
|
.matches = {
|
||||||
|
DMI_EXACT_MATCH(DMI_BOARD_VENDOR,
|
||||||
|
"To be filled by OEM."),
|
||||||
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "T3 MRD"),
|
||||||
|
DMI_EXACT_MATCH(DMI_BOARD_VERSION, "V1.1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
/* IRQ polarity of some chipsets are not defined correctly in ACPI table. */
|
/* IRQ polarity of some chipsets are not defined correctly in ACPI table. */
|
||||||
static const struct dmi_system_id bcm_active_low_irq_dmi_table[] = {
|
static const struct dmi_system_id bcm_active_low_irq_dmi_table[] = {
|
||||||
|
@ -904,6 +918,8 @@ static int bcm_gpio_set_shutdown(struct bcm_device *dev, bool powered)
|
||||||
|
|
||||||
static int bcm_get_resources(struct bcm_device *dev)
|
static int bcm_get_resources(struct bcm_device *dev)
|
||||||
{
|
{
|
||||||
|
const struct dmi_system_id *dmi_id;
|
||||||
|
|
||||||
dev->name = dev_name(dev->dev);
|
dev->name = dev_name(dev->dev);
|
||||||
|
|
||||||
if (x86_apple_machine && !bcm_apple_get_resources(dev))
|
if (x86_apple_machine && !bcm_apple_get_resources(dev))
|
||||||
|
@ -936,6 +952,13 @@ static int bcm_get_resources(struct bcm_device *dev)
|
||||||
dev->irq = gpiod_to_irq(gpio);
|
dev->irq = gpiod_to_irq(gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dmi_id = dmi_first_match(bcm_broken_irq_dmi_table);
|
||||||
|
if (dmi_id) {
|
||||||
|
dev_info(dev->dev, "%s: Has a broken IRQ config, disabling IRQ support / runtime-pm\n",
|
||||||
|
dmi_id->ident);
|
||||||
|
dev->irq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
dev_dbg(dev->dev, "BCM irq: %d\n", dev->irq);
|
dev_dbg(dev->dev, "BCM irq: %d\n", dev->irq);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue