Module Name: src
Committed By: jmcneill
Date: Fri Oct 23 10:59:37 UTC 2020
Modified Files:
src/sys/dev/acpi: acpi_intr.h acpi_util.c
Log Message:
Add acpi_intr_establish_irq, which is like acpi_intr_establish except
it takes a struct acpi_irq * instead of ACPI_HANDLE. Useful if a device
has more than one IRQ resource (acpi_intr_establish always picks the
first).
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/acpi/acpi_intr.h
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/acpi/acpi_util.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/acpi/acpi_intr.h
diff -u src/sys/dev/acpi/acpi_intr.h:1.4 src/sys/dev/acpi/acpi_intr.h:1.5
--- src/sys/dev/acpi/acpi_intr.h:1.4 Sun Dec 22 15:57:07 2019
+++ src/sys/dev/acpi/acpi_intr.h Fri Oct 23 10:59:37 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_intr.h,v 1.4 2019/12/22 15:57:07 thorpej Exp $ */
+/* $NetBSD: acpi_intr.h,v 1.5 2020/10/23 10:59:37 jmcneill Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -34,6 +34,8 @@
void * acpi_intr_establish(device_t, uint64_t, int, bool,
int (*intr)(void *), void *, const char *);
+void * acpi_intr_establish_irq(device_t, struct acpi_irq *, int,
+ bool, int (*intr)(void *), void *, const char *);
void acpi_intr_mask(void *);
void acpi_intr_unmask(void *);
void acpi_intr_disestablish(void *);
Index: src/sys/dev/acpi/acpi_util.c
diff -u src/sys/dev/acpi/acpi_util.c:1.18 src/sys/dev/acpi/acpi_util.c:1.19
--- src/sys/dev/acpi/acpi_util.c:1.18 Tue Dec 31 09:10:15 2019
+++ src/sys/dev/acpi/acpi_util.c Fri Oct 23 10:59:37 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_util.c,v 1.18 2019/12/31 09:10:15 mlelstv Exp $ */
+/* $NetBSD: acpi_util.c,v 1.19 2020/10/23 10:59:37 jmcneill Exp $ */
/*-
* Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.18 2019/12/31 09:10:15 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.19 2020/10/23 10:59:37 jmcneill Exp $");
#include <sys/param.h>
#include <sys/kmem.h>
@@ -550,7 +550,6 @@ out:
}
struct acpi_irq_handler {
- ACPI_HANDLE aih_hdl;
uint32_t aih_irq;
void *aih_ih;
};
@@ -563,8 +562,7 @@ acpi_intr_establish(device_t dev, uint64
ACPI_HANDLE hdl = (void *)(uintptr_t)c;
struct acpi_resources res;
struct acpi_irq *irq;
- struct acpi_irq_handler *aih = NULL;
- void *ih;
+ void *aih = NULL;
rv = acpi_resource_parse(dev, hdl, "_CRS", &res,
&acpi_resource_parse_ops_quiet);
@@ -575,18 +573,31 @@ acpi_intr_establish(device_t dev, uint64
if (irq == NULL)
goto end;
+ aih = acpi_intr_establish_irq(dev, irq, ipl, mpsafe,
+ intr, iarg, xname);
+
+end:
+ acpi_resource_cleanup(&res);
+
+ return aih;
+}
+
+void *
+acpi_intr_establish_irq(device_t dev, struct acpi_irq *irq, int ipl,
+ bool mpsafe, int (*intr)(void *), void *iarg, const char *xname)
+{
+ struct acpi_irq_handler *aih;
+ void *ih;
+
const int type = (irq->ar_type == ACPI_EDGE_SENSITIVE) ? IST_EDGE : IST_LEVEL;
ih = acpi_md_intr_establish(irq->ar_irq, ipl, type, intr, iarg, mpsafe, xname);
if (ih == NULL)
- goto end;
+ return NULL;
aih = kmem_alloc(sizeof(struct acpi_irq_handler), KM_SLEEP);
- aih->aih_hdl = hdl;
aih->aih_irq = irq->ar_irq;
aih->aih_ih = ih;
-end:
- acpi_resource_cleanup(&res);
return aih;
}