mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 05:46:47 +07:00
Bluetooth: hci_bcm: Fix setting of irq trigger type
This commit fixes 2 issues with host-wake irq trigger type handling in hci_bcm: 1) bcm_setup_sleep sets sleep_params.host_wake_active based on bcm_device.irq_polarity, but bcm_request_irq was always requesting IRQF_TRIGGER_RISING as trigger type independent of irq_polarity. This was a problem when the irq is described as a GpioInt rather then an Interrupt in the DSDT as for GpioInt-s the value passed to request_irq is honored. This commit fixes this by requesting the correct trigger type depending on bcm_device.irq_polarity. 2) bcm_device.irq_polarity was used to directly store an ACPI polarity value (ACPI_ACTIVE_*). This is undesirable because hci_bcm is also used with device-tree and checking for something like ACPI_ACTIVE_LOW in a non ACPI specific function like bcm_request_irq feels wrong. This commit fixes this by renaming irq_polarity to irq_active_low and changing its type to a bool. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
7841d55480
commit
227630cccd
@ -68,7 +68,7 @@ struct bcm_device {
|
|||||||
u32 init_speed;
|
u32 init_speed;
|
||||||
u32 oper_speed;
|
u32 oper_speed;
|
||||||
int irq;
|
int irq;
|
||||||
u8 irq_polarity;
|
bool irq_active_low;
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
struct hci_uart *hu;
|
struct hci_uart *hu;
|
||||||
@ -213,7 +213,9 @@ static int bcm_request_irq(struct bcm_data *bcm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
|
err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
|
||||||
IRQF_TRIGGER_RISING, "host_wake", bdev);
|
bdev->irq_active_low ? IRQF_TRIGGER_FALLING :
|
||||||
|
IRQF_TRIGGER_RISING,
|
||||||
|
"host_wake", bdev);
|
||||||
if (err)
|
if (err)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
@ -253,7 +255,7 @@ static int bcm_setup_sleep(struct hci_uart *hu)
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct bcm_set_sleep_mode sleep_params = default_sleep_params;
|
struct bcm_set_sleep_mode sleep_params = default_sleep_params;
|
||||||
|
|
||||||
sleep_params.host_wake_active = !bcm->dev->irq_polarity;
|
sleep_params.host_wake_active = !bcm->dev->irq_active_low;
|
||||||
|
|
||||||
skb = __hci_cmd_sync(hu->hdev, 0xfc27, sizeof(sleep_params),
|
skb = __hci_cmd_sync(hu->hdev, 0xfc27, sizeof(sleep_params),
|
||||||
&sleep_params, HCI_INIT_TIMEOUT);
|
&sleep_params, HCI_INIT_TIMEOUT);
|
||||||
@ -690,10 +692,8 @@ static const struct acpi_gpio_mapping acpi_bcm_int_first_gpios[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
static u8 acpi_active_low = ACPI_ACTIVE_LOW;
|
|
||||||
|
|
||||||
/* 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_wrong_irq_dmi_table[] = {
|
static const struct dmi_system_id bcm_active_low_irq_dmi_table[] = {
|
||||||
{
|
{
|
||||||
.ident = "Asus T100TA",
|
.ident = "Asus T100TA",
|
||||||
.matches = {
|
.matches = {
|
||||||
@ -701,7 +701,6 @@ static const struct dmi_system_id bcm_wrong_irq_dmi_table[] = {
|
|||||||
"ASUSTeK COMPUTER INC."),
|
"ASUSTeK COMPUTER INC."),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100TA"),
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100TA"),
|
||||||
},
|
},
|
||||||
.driver_data = &acpi_active_low,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.ident = "Asus T100CHI",
|
.ident = "Asus T100CHI",
|
||||||
@ -710,7 +709,6 @@ static const struct dmi_system_id bcm_wrong_irq_dmi_table[] = {
|
|||||||
"ASUSTeK COMPUTER INC."),
|
"ASUSTeK COMPUTER INC."),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100CHI"),
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100CHI"),
|
||||||
},
|
},
|
||||||
.driver_data = &acpi_active_low,
|
|
||||||
},
|
},
|
||||||
{ /* Handle ThinkPad 8 tablets with BCM2E55 chipset ACPI ID */
|
{ /* Handle ThinkPad 8 tablets with BCM2E55 chipset ACPI ID */
|
||||||
.ident = "Lenovo ThinkPad 8",
|
.ident = "Lenovo ThinkPad 8",
|
||||||
@ -718,7 +716,6 @@ static const struct dmi_system_id bcm_wrong_irq_dmi_table[] = {
|
|||||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"),
|
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"),
|
||||||
},
|
},
|
||||||
.driver_data = &acpi_active_low,
|
|
||||||
},
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
@ -733,13 +730,13 @@ static int bcm_resource(struct acpi_resource *ares, void *data)
|
|||||||
switch (ares->type) {
|
switch (ares->type) {
|
||||||
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
|
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
|
||||||
irq = &ares->data.extended_irq;
|
irq = &ares->data.extended_irq;
|
||||||
dev->irq_polarity = irq->polarity;
|
dev->irq_active_low = irq->polarity == ACPI_ACTIVE_LOW;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_RESOURCE_TYPE_GPIO:
|
case ACPI_RESOURCE_TYPE_GPIO:
|
||||||
gpio = &ares->data.gpio;
|
gpio = &ares->data.gpio;
|
||||||
if (gpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT)
|
if (gpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT)
|
||||||
dev->irq_polarity = gpio->polarity;
|
dev->irq_active_low = gpio->polarity == ACPI_ACTIVE_LOW;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_RESOURCE_TYPE_SERIAL_BUS:
|
case ACPI_RESOURCE_TYPE_SERIAL_BUS:
|
||||||
@ -834,11 +831,11 @@ static int bcm_acpi_probe(struct bcm_device *dev)
|
|||||||
return ret;
|
return ret;
|
||||||
acpi_dev_free_resource_list(&resources);
|
acpi_dev_free_resource_list(&resources);
|
||||||
|
|
||||||
dmi_id = dmi_first_match(bcm_wrong_irq_dmi_table);
|
dmi_id = dmi_first_match(bcm_active_low_irq_dmi_table);
|
||||||
if (dmi_id) {
|
if (dmi_id) {
|
||||||
bt_dev_warn(dev, "%s: Overwriting IRQ polarity to active low",
|
bt_dev_warn(dev, "%s: Overwriting IRQ polarity to active low",
|
||||||
dmi_id->ident);
|
dmi_id->ident);
|
||||||
dev->irq_polarity = *(u8 *)dmi_id->driver_data;
|
dev->irq_active_low = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user