Tue Jan 26 00:19:53 2021 UTC ()
Add a device_t parameter to acpi_enter_i2c_devs. If non-NULL, all child
acpi_devnodes will be claimed by that device so we don't later try to
attach a duplicate device to that node at acpinodebus.


(jmcneill)
diff -r1.1 -r1.2 src/sys/arch/arm/broadcom/bcm2835_bsc_acpi.c
diff -r1.2 -r1.3 src/sys/arch/x86/pci/dwiic_pci.c
diff -r1.9 -r1.10 src/sys/dev/acpi/acpi_i2c.c
diff -r1.9 -r1.10 src/sys/dev/acpi/acpi_util.h
diff -r1.1 -r1.2 src/sys/dev/acpi/acpi_i2c.h
diff -r1.20 -r1.21 src/sys/dev/acpi/acpi_util.c
diff -r1.5 -r1.6 src/sys/dev/acpi/dwiic_acpi.c
diff -r1.2 -r1.3 src/sys/dev/acpi/nxpiic_acpi.c
diff -r1.3 -r1.4 src/sys/dev/i2c/i2cmux.c

cvs diff -r1.1 -r1.2 src/sys/arch/arm/broadcom/bcm2835_bsc_acpi.c (expand / switch to context diff)
--- src/sys/arch/arm/broadcom/bcm2835_bsc_acpi.c 2020/03/31 12:23:17 1.1
+++ src/sys/arch/arm/broadcom/bcm2835_bsc_acpi.c 2021/01/26 00:19:52 1.2
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_bsc_acpi.c,v 1.1 2020/03/31 12:23:17 jmcneill Exp $ */
+/* $NetBSD: bcm2835_bsc_acpi.c,v 1.2 2021/01/26 00:19:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2020 Jared McNeill <jmcneill@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_bsc_acpi.c,v 1.1 2020/03/31 12:23:17 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_bsc_acpi.c,v 1.2 2021/01/26 00:19:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -160,7 +160,7 @@
 
 	memset(&iba, 0, sizeof(iba));
 	iba.iba_tag = &sc->sc_i2c;
-	iba.iba_child_devices = acpi_enter_i2c_devs(aa->aa_node);
+	iba.iba_child_devices = acpi_enter_i2c_devs(self, aa->aa_node);
 	config_found_ia(self, "i2cbus", &iba, iicbus_print);
 
 done:

cvs diff -r1.2 -r1.3 src/sys/arch/x86/pci/dwiic_pci.c (expand / switch to context diff)
--- src/sys/arch/x86/pci/dwiic_pci.c 2018/09/26 19:06:33 1.2
+++ src/sys/arch/x86/pci/dwiic_pci.c 2021/01/26 00:19:52 1.3
@@ -1,4 +1,4 @@
-/* $NetBSD: dwiic_pci.c,v 1.2 2018/09/26 19:06:33 jakllsch Exp $ */
+/* $NetBSD: dwiic_pci.c,v 1.3 2021/01/26 00:19:52 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwiic_pci.c,v 1.2 2018/09/26 19:06:33 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwiic_pci.c,v 1.3 2021/01/26 00:19:52 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -170,7 +170,7 @@
 
 	if (sc->sc_acpinode) {
 		sc->sc_dwiic.sc_iba.iba_child_devices = 
-		    acpi_enter_i2c_devs(sc->sc_acpinode);
+		    acpi_enter_i2c_devs(NULL, sc->sc_acpinode);
 	} else {
 		aprint_verbose_dev(self, "no matching ACPI node\n");
 	}

cvs diff -r1.9 -r1.10 src/sys/dev/acpi/acpi_i2c.c (expand / switch to context diff)
--- src/sys/dev/acpi/acpi_i2c.c 2021/01/25 12:15:32 1.9
+++ src/sys/dev/acpi/acpi_i2c.c 2021/01/26 00:19:53 1.10
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_i2c.c,v 1.9 2021/01/25 12:15:32 jmcneill Exp $ */
+/* $NetBSD: acpi_i2c.c,v 1.10 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.9 2021/01/25 12:15:32 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.10 2021/01/26 00:19:53 jmcneill Exp $");
 
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
@@ -225,7 +225,7 @@
 
 
 prop_array_t
-acpi_enter_i2c_devs(struct acpi_devnode *devnode)
+acpi_enter_i2c_devs(device_t dev, struct acpi_devnode *devnode)
 {
 	struct acpi_devnode *ad;
 	prop_array_t array = prop_array_create();
@@ -240,5 +240,10 @@
 			continue;
 		acpi_enter_i2c_device(ad, array);
 	}
+
+	if (dev != NULL) {
+		acpi_claim_childdevs(dev, devnode);
+	}
+
 	return array;
 }

cvs diff -r1.9 -r1.10 src/sys/dev/acpi/acpi_util.h (expand / switch to context diff)
--- src/sys/dev/acpi/acpi_util.h 2021/01/14 14:35:53 1.9
+++ src/sys/dev/acpi/acpi_util.h 2021/01/26 00:19:53 1.10
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_util.h,v 1.9 2021/01/14 14:35:53 thorpej Exp $ */
+/*	$NetBSD: acpi_util.h,v 1.10 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -101,5 +101,7 @@
 ACPI_STATUS	 acpi_dsm_integer(ACPI_HANDLE, uint8_t *, ACPI_INTEGER,
 			ACPI_INTEGER, const ACPI_OBJECT *,
 			ACPI_INTEGER *);
+
+ACPI_STATUS	 acpi_claim_childdevs(device_t, struct acpi_devnode *);
 
 #endif	/* !_SYS_DEV_ACPI_ACPI_UTIL_H */

cvs diff -r1.1 -r1.2 src/sys/dev/acpi/acpi_i2c.h (expand / switch to context diff)
--- src/sys/dev/acpi/acpi_i2c.h 2017/12/10 16:51:30 1.1
+++ src/sys/dev/acpi/acpi_i2c.h 2021/01/26 00:19:53 1.2
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_i2c.h,v 1.1 2017/12/10 16:51:30 bouyer Exp $ */
+/* $NetBSD: acpi_i2c.h,v 1.2 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -34,5 +34,5 @@
 #define _SYS_DEV_ACPI_ACPI_I2C_H
 #include <prop/proplib.h>
 
-prop_array_t acpi_enter_i2c_devs(struct acpi_devnode *);
+prop_array_t acpi_enter_i2c_devs(device_t, struct acpi_devnode *);
 #endif /*  _SYS_DEV_ACPI_ACPI_I2C_H */

cvs diff -r1.20 -r1.21 src/sys/dev/acpi/acpi_util.c (expand / switch to context diff)
--- src/sys/dev/acpi/acpi_util.c 2021/01/14 14:35:53 1.20
+++ src/sys/dev/acpi/acpi_util.c 2021/01/26 00:19:53 1.21
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_util.c,v 1.20 2021/01/14 14:35:53 thorpej Exp $ */
+/*	$NetBSD: acpi_util.c,v 1.21 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007, 2021 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.20 2021/01/14 14:35:53 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.21 2021/01/26 00:19:53 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -863,4 +863,20 @@
 {
 	return acpi_dsm_typed(handle, uuid, rev, func, arg3, ACPI_TYPE_ANY,
 	    return_obj);
+}
+
+ACPI_STATUS
+acpi_claim_childdevs(device_t dev, struct acpi_devnode *devnode)
+{
+	struct acpi_devnode *ad;
+
+	SIMPLEQ_FOREACH(ad, &devnode->ad_child_head, ad_child_list) {
+		if (ad->ad_device != NULL)
+			continue;
+		aprint_debug(dev, "claiming %s\n", acpi_name(ad->ad_handle));
+		ad->ad_device = dev;
+		acpi_claim_childdevs(dev, ad);
+	}
+
+	return AE_OK;
 }

cvs diff -r1.5 -r1.6 src/sys/dev/acpi/dwiic_acpi.c (expand / switch to context diff)
--- src/sys/dev/acpi/dwiic_acpi.c 2021/01/24 16:33:48 1.5
+++ src/sys/dev/acpi/dwiic_acpi.c 2021/01/26 00:19:53 1.6
@@ -1,4 +1,4 @@
-/* $NetBSD: dwiic_acpi.c,v 1.5 2021/01/24 16:33:48 jmcneill Exp $ */
+/* $NetBSD: dwiic_acpi.c,v 1.6 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwiic_acpi.c,v 1.5 2021/01/24 16:33:48 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwiic_acpi.c,v 1.6 2021/01/26 00:19:53 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -128,7 +128,7 @@
 
 	dwiic_acpi_configure(sc, aa->aa_node->ad_handle);
 
-	sc->sc_iba.iba_child_devices = acpi_enter_i2c_devs(aa->aa_node);
+	sc->sc_iba.iba_child_devices = acpi_enter_i2c_devs(self, aa->aa_node);
 
 	dwiic_attach(sc);
 

cvs diff -r1.2 -r1.3 src/sys/dev/acpi/nxpiic_acpi.c (expand / switch to context diff)
--- src/sys/dev/acpi/nxpiic_acpi.c 2021/01/25 12:09:58 1.2
+++ src/sys/dev/acpi/nxpiic_acpi.c 2021/01/26 00:19:53 1.3
@@ -1,4 +1,4 @@
-/* $NetBSD: nxpiic_acpi.c,v 1.2 2021/01/25 12:09:58 jmcneill Exp $ */
+/* $NetBSD: nxpiic_acpi.c,v 1.3 2021/01/26 00:19:53 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nxpiic_acpi.c,v 1.2 2021/01/25 12:09:58 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nxpiic_acpi.c,v 1.3 2021/01/26 00:19:53 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -151,7 +151,7 @@
 	msc->sc_flags |= MOTOI2C_F_ENABLE_INV | MOTOI2C_F_STATUS_W1C;
 	msc->sc_iord = nxpiic_acpi_iord;
 	msc->sc_iowr = nxpiic_acpi_iowr;
-	msc->sc_child_devices = acpi_enter_i2c_devs(aa->aa_node);
+	msc->sc_child_devices = acpi_enter_i2c_devs(self, aa->aa_node);
 
 	motoi2c_attach_common(self, msc, &settings);
 

cvs diff -r1.3 -r1.4 src/sys/dev/i2c/i2cmux.c (expand / switch to context diff)
--- src/sys/dev/i2c/i2cmux.c 2021/01/25 12:18:18 1.3
+++ src/sys/dev/i2c/i2cmux.c 2021/01/26 00:19:53 1.4
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2cmux.c,v 1.3 2021/01/25 12:18:18 jmcneill Exp $	*/
+/*	$NetBSD: i2cmux.c,v 1.4 2021/01/26 00:19:53 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i2cmux.c,v 1.3 2021/01/25 12:18:18 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i2cmux.c,v 1.4 2021/01/26 00:19:53 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/device.h>
@@ -199,7 +199,7 @@
 		KASSERT(ad != NULL);
 		struct i2cbus_attach_args iba = {
 			.iba_tag = &bus->controller,
-			.iba_child_devices = acpi_enter_i2c_devs(ad)
+			.iba_child_devices = acpi_enter_i2c_devs(NULL, ad)
 		};
 		config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print);
 	}	break;