Module Name:    src
Committed By:   thorpej
Date:           Sat Jun 16 21:22:14 UTC 2018

Modified Files:
        src/sys/arch/evbmips/loongson/dev: stvii.c
        src/sys/arch/hpcarm/dev: nbppcon.c
        src/sys/arch/macppc/dev: deq.c smusat.c videopll.c
        src/sys/arch/sparc64/dev: pcf8591_envctrl.c tda.c
        src/sys/arch/zaurus/dev: ioexp.c wm8731_zaudio.c wm8750_zaudio.c
        src/sys/dev/i2c: ac100.c act8846.c adadc.c adm1021.c adm1026.c am2315.c
            as3722.c at24cxx.c axp20x.c axp22x.c axp809.c axppmic.c dbcool.c
            ddc.c dstemp.c em3027.c fcu.c g760a.c i2c.c i2cvar.h ibmhawk.c
            ihidev.c lm75.c lm87.c lm_i2c.c m41st84.c m41t00.c max6900.c
            max77620.c mcp980x.c mpl115a.c pcf8563.c pcf8583.c r2025.c
            rs5c372.c s390.c sdtemp.c sgsmix.c si70xx.c smscmon.c spdmem_i2c.c
            sy8106a.c tcagpio.c tcakp.c titemp.c tps65217pmic.c tps65950.c
            tsl256x.c w83795g.c x1226.c

Log Message:
More cleanup to i2c autoconfiguration:

- Get all of the drivers onto the new match quality constants.
- Introduce a new helper function, iic_use_direct_match(), that has
  all of the logic for direct-config matching.  If it returns true,
  the driver returns the match result (which may be 0).  If it returns
  false, the driver does indirect-config matching.
- iic_compat_match() now returns a weighted match quality; matches to
  lower-indexed "compatible" device property are more-specific matches,
  and return a better match quality accordingly.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbmips/loongson/dev/stvii.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/hpcarm/dev/nbppcon.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/macppc/dev/deq.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/macppc/dev/smusat.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/macppc/dev/videopll.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sparc64/dev/pcf8591_envctrl.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/sparc64/dev/tda.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/zaurus/dev/ioexp.c \
    src/sys/arch/zaurus/dev/wm8731_zaudio.c \
    src/sys/arch/zaurus/dev/wm8750_zaudio.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/i2c/ac100.c src/sys/dev/i2c/axp809.c \
    src/sys/dev/i2c/dstemp.c src/sys/dev/i2c/em3027.c \
    src/sys/dev/i2c/mpl115a.c src/sys/dev/i2c/sy8106a.c \
    src/sys/dev/i2c/tcagpio.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/i2c/act8846.c src/sys/dev/i2c/g760a.c \
    src/sys/dev/i2c/lm_i2c.c src/sys/dev/i2c/titemp.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/i2c/adadc.c src/sys/dev/i2c/axp22x.c \
    src/sys/dev/i2c/fcu.c src/sys/dev/i2c/s390.c src/sys/dev/i2c/si70xx.c \
    src/sys/dev/i2c/tsl256x.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/i2c/adm1021.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/adm1026.c src/sys/dev/i2c/am2315.c \
    src/sys/dev/i2c/ihidev.c src/sys/dev/i2c/max77620.c \
    src/sys/dev/i2c/smscmon.c src/sys/dev/i2c/w83795g.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/i2c/as3722.c
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/i2c/at24cxx.c
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/i2c/axp20x.c src/sys/dev/i2c/axppmic.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/i2c/dbcool.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/i2c/ddc.c src/sys/dev/i2c/ibmhawk.c \
    src/sys/dev/i2c/tcakp.c
cvs rdiff -u -r1.61 -r1.62 src/sys/dev/i2c/i2c.c
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/i2c/i2cvar.h
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/i2c/lm75.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/i2c/lm87.c src/sys/dev/i2c/r2025.c
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/i2c/m41st84.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/i2c/m41t00.c src/sys/dev/i2c/x1226.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/i2c/max6900.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/i2c/mcp980x.c src/sys/dev/i2c/tps65950.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/i2c/pcf8563.c src/sys/dev/i2c/sgsmix.c
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/i2c/pcf8583.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/i2c/rs5c372.c \
    src/sys/dev/i2c/spdmem_i2c.c
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/i2c/sdtemp.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/i2c/tps65217pmic.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/arch/evbmips/loongson/dev/stvii.c
diff -u src/sys/arch/evbmips/loongson/dev/stvii.c:1.5 src/sys/arch/evbmips/loongson/dev/stvii.c:1.6
--- src/sys/arch/evbmips/loongson/dev/stvii.c:1.5	Mon Feb 29 18:24:31 2016
+++ src/sys/arch/evbmips/loongson/dev/stvii.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: stvii.c,v 1.5 2016/02/29 18:24:31 christos Exp $	*/
+/*	$NetBSD: stvii.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2011 Michael Lorenz.
@@ -30,7 +30,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: stvii.c,v 1.5 2016/02/29 18:24:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: stvii.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -136,7 +136,7 @@ stvii_match(device_t parent, cfdata_t cf
 		DPRINTF("%02x\n", in);
 		iic_release_bus(args->ia_tag, 0);
 	}
-	return (ret >= 0);
+	return (ret >= 0) ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
 }
 
 static void

Index: src/sys/arch/hpcarm/dev/nbppcon.c
diff -u src/sys/arch/hpcarm/dev/nbppcon.c:1.2 src/sys/arch/hpcarm/dev/nbppcon.c:1.3
--- src/sys/arch/hpcarm/dev/nbppcon.c:1.2	Sat Jun 16 05:58:03 2012
+++ src/sys/arch/hpcarm/dev/nbppcon.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nbppcon.c,v 1.2 2012/06/16 05:58:03 kiyohara Exp $ */
+/*	$NetBSD: nbppcon.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $ */
 /*
  * Copyright (c) 2011 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nbppcon.c,v 1.2 2012/06/16 05:58:03 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nbppcon.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -78,7 +78,7 @@ nbppcon_match(device_t parent, cfdata_t 
 	    !platid_match(&platid, &platid_mask_MACH_PSIONTEKLOGIX_NETBOOK_PRO))
 		 return 0;
 
-	return 1;
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 /* ARGSUSED */

Index: src/sys/arch/macppc/dev/deq.c
diff -u src/sys/arch/macppc/dev/deq.c:1.13 src/sys/arch/macppc/dev/deq.c:1.14
--- src/sys/arch/macppc/dev/deq.c:1.13	Fri May  4 17:15:23 2018
+++ src/sys/arch/macppc/dev/deq.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: deq.c,v 1.13 2018/05/04 17:15:23 macallan Exp $	*/
+/*	$NetBSD: deq.c,v 1.14 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2005 Michael Lorenz
@@ -32,7 +32,7 @@
  */
  
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: deq.c,v 1.13 2018/05/04 17:15:23 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: deq.c,v 1.14 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -65,15 +65,13 @@ int
 deq_match(device_t parent, struct cfdata *cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
-	
-	if (ia->ia_name) {
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, deq_compats))
-				return 1;
-		}
-		if (strcmp(ia->ia_name, "deq") == 0)
-			return 1;
-	}
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, deq_compats, &match_result))
+		return match_result;
+
+	/* This driver is direct-config only. */
+
 	return 0;
 }
 

Index: src/sys/arch/macppc/dev/smusat.c
diff -u src/sys/arch/macppc/dev/smusat.c:1.3 src/sys/arch/macppc/dev/smusat.c:1.4
--- src/sys/arch/macppc/dev/smusat.c:1.3	Fri Apr 20 18:22:50 2018
+++ src/sys/arch/macppc/dev/smusat.c	Sat Jun 16 21:22:13 2018
@@ -115,15 +115,15 @@ static int
 smusat_match(device_t parent, struct cfdata *cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		/* no ID registers on this chip */
-		if (ia->ia_addr == 0x58)
-			return 1;
-		return 0;
-	} else {
-		return iic_compat_match(ia, smusat_compats);
-	}
+	if (iic_use_direct_match(ia, cf, smusat_compats, &match_result))
+		return match_result;
+
+	if (ia->ia_addr == 0x58)
+		return I2C_MATCH_ADDRESS_ONLY;
+
+	return 0;
 }
 
 static void

Index: src/sys/arch/macppc/dev/videopll.c
diff -u src/sys/arch/macppc/dev/videopll.c:1.2 src/sys/arch/macppc/dev/videopll.c:1.3
--- src/sys/arch/macppc/dev/videopll.c:1.2	Fri Sep 22 04:01:41 2017
+++ src/sys/arch/macppc/dev/videopll.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: videopll.c,v 1.2 2017/09/22 04:01:41 macallan Exp $	*/
+/*	$NetBSD: videopll.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2012 Michael Lorenz
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: videopll.c,v 1.2 2017/09/22 04:01:41 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: videopll.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -70,9 +70,12 @@ static int
 videopll_match(device_t parent, cfdata_t cfdata, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (strcmp(ia->ia_name, "videopll") == 0)
-		return 100;
+	if (iic_use_direct_match(ia, cfdata, NULL, &match_result))
+		return match_result;
+	
+	/* This driver is direct-config only. */
 
 	return 0;
 }

Index: src/sys/arch/sparc64/dev/pcf8591_envctrl.c
diff -u src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.6 src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.7
--- src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.6	Sun Mar 18 05:26:58 2012
+++ src/sys/arch/sparc64/dev/pcf8591_envctrl.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8591_envctrl.c,v 1.6 2012/03/18 05:26:58 mrg Exp $	*/
+/*	$NetBSD: pcf8591_envctrl.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $	*/
 /*	$OpenBSD: pcf8591_envctrl.c,v 1.6 2007/10/25 21:17:20 kettenis Exp $ */
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcf8591_envctrl.c,v 1.6 2012/03/18 05:26:58 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8591_envctrl.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -78,9 +78,12 @@ static int
 ecadc_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (iic_compat_match(ia, ecadc_compats))
-		return 1;
+	if (iic_use_direct_match(ia, cf, ecadc_compats, &match_result))
+		return match_result;
+
+	/* This driver is direct-config only. */
 
 	return 0;
 }

Index: src/sys/arch/sparc64/dev/tda.c
diff -u src/sys/arch/sparc64/dev/tda.c:1.11 src/sys/arch/sparc64/dev/tda.c:1.12
--- src/sys/arch/sparc64/dev/tda.c:1.11	Thu Jul  7 06:55:38 2016
+++ src/sys/arch/sparc64/dev/tda.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: tda.c,v 1.11 2016/07/07 06:55:38 msaitoh Exp $	*/
+/*	$NetBSD: tda.c,v 1.12 2018/06/16 21:22:13 thorpej Exp $	*/
 /*	$OpenBSD: tda.c,v 1.4 2008/02/27 17:25:00 robert Exp $ */
 
 /*
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tda.c,v 1.11 2016/07/07 06:55:38 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tda.c,v 1.12 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -100,7 +100,9 @@ tda_match(device_t parent, cfdata_t matc
 	 */
 	if (ia->ia_name == NULL)
 		return(0);
-	return strcmp(ia->ia_name, "fan-control") == 0;
+
+	return strcmp(ia->ia_name, "fan-control") == 0 ?
+	    I2C_MATCH_DIRECT_SPECIFIC : 0;
 }
 
 void

Index: src/sys/arch/zaurus/dev/ioexp.c
diff -u src/sys/arch/zaurus/dev/ioexp.c:1.1 src/sys/arch/zaurus/dev/ioexp.c:1.2
--- src/sys/arch/zaurus/dev/ioexp.c:1.1	Sun Jun 19 16:20:09 2011
+++ src/sys/arch/zaurus/dev/ioexp.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ioexp.c,v 1.1 2011/06/19 16:20:09 nonaka Exp $	*/
+/*	$NetBSD: ioexp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ioexp.c,v 1.1 2011/06/19 16:20:09 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ioexp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -86,20 +86,19 @@ static int
 ioexp_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
 	/* only for SL-C1000 */
 	if (!ZAURUS_ISC1000)
 		return 0;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "ioexp") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == IOEXP_ADDRESS)
-			return 1;
-	}
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+	
+	/* indirect config - check typical address */
+	if (ia->ia_addr == IOEXP_ADDRESS)
+		return I2C_MATCH_ADDRESS_ONLY;
+
 	return 0;
 }
 
Index: src/sys/arch/zaurus/dev/wm8731_zaudio.c
diff -u src/sys/arch/zaurus/dev/wm8731_zaudio.c:1.1 src/sys/arch/zaurus/dev/wm8731_zaudio.c:1.2
--- src/sys/arch/zaurus/dev/wm8731_zaudio.c:1.1	Tue Sep 23 14:49:46 2014
+++ src/sys/arch/zaurus/dev/wm8731_zaudio.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: wm8731_zaudio.c,v 1.1 2014/09/23 14:49:46 nonaka Exp $	*/
+/*	$NetBSD: wm8731_zaudio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
 #include "opt_zaudio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wm8731_zaudio.c,v 1.1 2014/09/23 14:49:46 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wm8731_zaudio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -211,19 +211,18 @@ wm8731_write(struct zaudio_softc *sc, in
 int
 wm8731_match(device_t parent, cfdata_t cf, struct i2c_attach_args *ia)
 {
+	int match_result;
 
 	if (ZAURUS_ISC1000 || ZAURUS_ISC3000)
 		return 0;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "zaudio") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == WM8731_ADDRESS)
-			return 1;
-	}
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+
+	/* indirect config - check typical address */
+	if (ia->ia_addr == WM8731_ADDRESS)
+		return I2C_MATCH_ADDRESS_ONLY;
+
 	return 0;
 }
 
Index: src/sys/arch/zaurus/dev/wm8750_zaudio.c
diff -u src/sys/arch/zaurus/dev/wm8750_zaudio.c:1.1 src/sys/arch/zaurus/dev/wm8750_zaudio.c:1.2
--- src/sys/arch/zaurus/dev/wm8750_zaudio.c:1.1	Tue Sep 23 14:49:46 2014
+++ src/sys/arch/zaurus/dev/wm8750_zaudio.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: wm8750_zaudio.c,v 1.1 2014/09/23 14:49:46 nonaka Exp $	*/
+/*	$NetBSD: wm8750_zaudio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $	*/
 /*	$OpenBSD: zaurus_audio.c,v 1.8 2005/08/18 13:23:02 robert Exp $	*/
 
 /*
@@ -51,7 +51,7 @@
 #include "opt_zaudio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wm8750_zaudio.c,v 1.1 2014/09/23 14:49:46 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wm8750_zaudio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -276,19 +276,18 @@ wm8750_write(struct zaudio_softc *sc, in
 int
 wm8750_match(device_t parent, cfdata_t cf, struct i2c_attach_args *ia)
 {
+	int match_result;
 
 	if (ZAURUS_ISC860)
 		return 0;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "zaudio") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == WM8750_ADDRESS)
-			return 1;
-	}
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+	
+	/* indirect config - check typical address */
+	if (ia->ia_addr == WM8750_ADDRESS)
+		return I2C_MATCH_ADDRESS_ONLY;
+
 	return 0;
 }
 

Index: src/sys/dev/i2c/ac100.c
diff -u src/sys/dev/i2c/ac100.c:1.1 src/sys/dev/i2c/ac100.c:1.2
--- src/sys/dev/i2c/ac100.c:1.1	Sun Dec  7 14:24:11 2014
+++ src/sys/dev/i2c/ac100.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ac100.c,v 1.1 2014/12/07 14:24:11 jmcneill Exp $ */
+/* $NetBSD: ac100.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ac100.c,v 1.1 2014/12/07 14:24:11 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ac100.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -109,7 +109,7 @@ CFATTACH_DECL_NEW(ac100ic, sizeof(struct
 static int
 ac100_match(device_t parent, cfdata_t match, void *aux)
 {
-	return 1;
+	return I2C_MATCH_ADDRESS_ONLY;	/* XXX */
 }
 
 static void
Index: src/sys/dev/i2c/axp809.c
diff -u src/sys/dev/i2c/axp809.c:1.1 src/sys/dev/i2c/axp809.c:1.2
--- src/sys/dev/i2c/axp809.c:1.1	Sun Dec  7 00:33:26 2014
+++ src/sys/dev/i2c/axp809.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axp809.c,v 1.1 2014/12/07 00:33:26 jmcneill Exp $ */
+/* $NetBSD: axp809.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #define AXP_DEBUG
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axp809.c,v 1.1 2014/12/07 00:33:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp809.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -105,7 +105,15 @@ CFATTACH_DECL_NEW(axp809pm, sizeof(struc
 static int
 axp809_match(device_t parent, cfdata_t match, void *aux)
 {
-	return 1;
+	struct i2c_attach_args *ia = aux;
+	int match_result;
+
+	if (iic_use_direct_match(ia, match, NULL, &match_result))
+		return match_result;
+	
+	/* This device is direct-config only. */
+
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/dstemp.c
diff -u src/sys/dev/i2c/dstemp.c:1.1 src/sys/dev/i2c/dstemp.c:1.2
--- src/sys/dev/i2c/dstemp.c:1.1	Thu Feb  1 21:44:17 2018
+++ src/sys/dev/i2c/dstemp.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: dstemp.c,v 1.1 2018/02/01 21:44:17 macallan Exp $ */
+/* $NetBSD: dstemp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dstemp.c,v 1.1 2018/02/01 21:44:17 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dstemp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -81,15 +81,15 @@ static int
 dstemp_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		/* no ID registers on this chip */
-		if ((ia->ia_addr & 0xf8) == 0x48)
-			return 1;
-		return 0;
-	} else {
-		return iic_compat_match(ia, dstemp_compats);
-	}
+	if (iic_use_direct_match(ia, match, dstemp_compats, &match_result))
+		return match_result;
+	
+	if ((ia->ia_addr & 0xf8) == 0x48)
+		return I2C_MATCH_ADDRESS_ONLY;
+
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/em3027.c
diff -u src/sys/dev/i2c/em3027.c:1.1 src/sys/dev/i2c/em3027.c:1.2
--- src/sys/dev/i2c/em3027.c:1.1	Fri Jan  5 03:07:15 2018
+++ src/sys/dev/i2c/em3027.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: em3027.c,v 1.1 2018/01/05 03:07:15 uwe Exp $ */
+/*	$NetBSD: em3027.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 /*
  * Copyright (c) 2018 Valery Ushakov
  * All rights reserved.
@@ -28,7 +28,7 @@
  * EM Microelectronic EM3027 RTC
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: em3027.c,v 1.1 2018/01/05 03:07:15 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: em3027.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -128,7 +128,7 @@ em3027rtc_match(device_t parent, cfdata_
 	if (error)
 		return 0;
 
-	return 1;
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 
Index: src/sys/dev/i2c/mpl115a.c
diff -u src/sys/dev/i2c/mpl115a.c:1.1 src/sys/dev/i2c/mpl115a.c:1.2
--- src/sys/dev/i2c/mpl115a.c:1.1	Sun Sep  8 14:59:42 2013
+++ src/sys/dev/i2c/mpl115a.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpl115a.c,v 1.1 2013/09/08 14:59:42 rkujawa Exp $ */
+/*	$NetBSD: mpl115a.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpl115a.c,v 1.1 2013/09/08 14:59:42 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpl115a.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -97,7 +97,7 @@ mpl115a_match(device_t parent, cfdata_t 
 	struct i2c_attach_args *ia = aux;
 
 	if (ia->ia_addr == MPL115A_ADDR) 
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	return 0;
 }
 
Index: src/sys/dev/i2c/sy8106a.c
diff -u src/sys/dev/i2c/sy8106a.c:1.1 src/sys/dev/i2c/sy8106a.c:1.2
--- src/sys/dev/i2c/sy8106a.c:1.1	Mon Oct  2 22:48:02 2017
+++ src/sys/dev/i2c/sy8106a.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: sy8106a.c,v 1.1 2017/10/02 22:48:02 jmcneill Exp $ */
+/* $NetBSD: sy8106a.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sy8106a.c,v 1.1 2017/10/02 22:48:02 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sy8106a.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -185,11 +185,12 @@ static int
 sy8106a_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL)
-		return 0;
-
-	return iic_compat_match(ia, compatible);
+	if (iic_use_direct_match(ia, match, compatible, &match_result))
+		return match_result;
+	
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/tcagpio.c
diff -u src/sys/dev/i2c/tcagpio.c:1.1 src/sys/dev/i2c/tcagpio.c:1.2
--- src/sys/dev/i2c/tcagpio.c:1.1	Fri Sep 22 18:12:31 2017
+++ src/sys/dev/i2c/tcagpio.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tcagpio.c,v 1.1 2017/09/22 18:12:31 jmcneill Exp $ */
+/* $NetBSD: tcagpio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcagpio.c,v 1.1 2017/09/22 18:12:31 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcagpio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -246,11 +246,12 @@ static int
 tcagpio_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL)
-		return 0;
+	if (iic_use_direct_match(ia, match, compatible, &match_result))
+		return match_result;
 
-	return iic_compat_match(ia, compatible);
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/act8846.c
diff -u src/sys/dev/i2c/act8846.c:1.4 src/sys/dev/i2c/act8846.c:1.5
--- src/sys/dev/i2c/act8846.c:1.4	Mon Apr 30 20:26:09 2018
+++ src/sys/dev/i2c/act8846.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: act8846.c,v 1.4 2018/04/30 20:26:09 jmcneill Exp $ */
+/* $NetBSD: act8846.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 //#define ACT_DEBUG
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: act8846.c,v 1.4 2018/04/30 20:26:09 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: act8846.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -151,7 +151,7 @@ act8846_match(device_t parent, cfdata_t 
 	struct i2c_attach_args *ia = aux;
 
 	if (ia->ia_addr == 0x5a)
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 
 	return 0;
 }
Index: src/sys/dev/i2c/g760a.c
diff -u src/sys/dev/i2c/g760a.c:1.4 src/sys/dev/i2c/g760a.c:1.5
--- src/sys/dev/i2c/g760a.c:1.4	Sun Jul 29 07:04:09 2012
+++ src/sys/dev/i2c/g760a.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: g760a.c,v 1.4 2012/07/29 07:04:09 mlelstv Exp $	*/
+/*	$NetBSD: g760a.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2008 A.Leo.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: g760a.c,v 1.4 2012/07/29 07:04:09 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: g760a.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -79,7 +79,7 @@ g760a_match(device_t parent, struct cfda
 		/*
 		 * TODO: set up minimal speed? 
 		 */
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	}
 
 	return 0;
Index: src/sys/dev/i2c/lm_i2c.c
diff -u src/sys/dev/i2c/lm_i2c.c:1.4 src/sys/dev/i2c/lm_i2c.c:1.5
--- src/sys/dev/i2c/lm_i2c.c:1.4	Fri Aug 18 04:07:51 2017
+++ src/sys/dev/i2c/lm_i2c.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: lm_i2c.c,v 1.4 2017/08/18 04:07:51 msaitoh Exp $	*/
+/*	$NetBSD: lm_i2c.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lm_i2c.c,v 1.4 2017/08/18 04:07:51 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm_i2c.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -71,6 +71,8 @@ lm_i2c_match(device_t parent, cfdata_t m
 	if (ia->ia_addr < 1)
 		return 0;
 
+	/* XXXJRT filter addresses //at all// please? */
+
 	/* Bus independent probe */
 	sc.sc_lmsc.lm_writereg = lm_i2c_writereg;
 	sc.sc_lmsc.lm_readreg = lm_i2c_readreg;
@@ -78,7 +80,7 @@ lm_i2c_match(device_t parent, cfdata_t m
 	sc.sc_addr = ia->ia_addr;
 	rv = lm_match(&sc.sc_lmsc);
 
-	return rv;
+	return rv ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
 }
 
 
Index: src/sys/dev/i2c/titemp.c
diff -u src/sys/dev/i2c/titemp.c:1.4 src/sys/dev/i2c/titemp.c:1.5
--- src/sys/dev/i2c/titemp.c:1.4	Mon Apr 30 20:37:01 2018
+++ src/sys/dev/i2c/titemp.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: titemp.c,v 1.4 2018/04/30 20:37:01 jmcneill Exp $ */
+/* $NetBSD: titemp.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: titemp.c,v 1.4 2018/04/30 20:37:01 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: titemp.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -94,25 +94,24 @@ titemp_match(device_t parent, cfdata_t m
 {
 	struct i2c_attach_args *ia = aux;
 	uint8_t mfid;
-	int error;
+	int error, match_result;
 
-	if (ia->ia_name == NULL) {
-		if (ia->ia_addr != 0x4c)
-			return 0;
-
-		if (iic_acquire_bus(ia->ia_tag, I2C_F_POLL) != 0)
-			return 0;
-		error = iic_smbus_read_byte(ia->ia_tag, ia->ia_addr,
-		    TITEMP_MFID_REG, &mfid, I2C_F_POLL);
-		iic_release_bus(ia->ia_tag, I2C_F_POLL);
+	if (iic_use_direct_match(ia, match, titemp_compats, &match_result))
+		return match_result;
+	
+	if (ia->ia_addr != 0x4c)
+		return 0;
+
+	if (iic_acquire_bus(ia->ia_tag, I2C_F_POLL) != 0)
+		return 0;
+	error = iic_smbus_read_byte(ia->ia_tag, ia->ia_addr,
+	    TITEMP_MFID_REG, &mfid, I2C_F_POLL);
+	iic_release_bus(ia->ia_tag, I2C_F_POLL);
 
-		if (error || mfid != TITEMP_MFID_TMP451)
-			return 0;
+	if (error || mfid != TITEMP_MFID_TMP451)
+		return 0;
 
-		return 1;
-	} else {
-		return iic_compat_match(ia, titemp_compats);
-	}
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 static void

Index: src/sys/dev/i2c/adadc.c
diff -u src/sys/dev/i2c/adadc.c:1.3 src/sys/dev/i2c/adadc.c:1.4
--- src/sys/dev/i2c/adadc.c:1.3	Fri Mar 16 22:10:31 2018
+++ src/sys/dev/i2c/adadc.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: adadc.c,v 1.3 2018/03/16 22:10:31 macallan Exp $ */
+/* $NetBSD: adadc.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adadc.c,v 1.3 2018/03/16 22:10:31 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adadc.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -105,19 +105,20 @@ static int
 adadc_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		/*
-		 * XXX
-		 * this driver is pretty much useless without OF, should
-		 * probably remove this
-		 */
-		if ((ia->ia_addr & 0x2b) == 0x2b)
-			return 1;
-		return 0;
-	} else {
-		return iic_compat_match(ia, dstemp_compats);
-	}
+	if (iic_use_direct_match(ia, match, dstemp_compats, &match_result))
+		return match_result;
+
+	/*
+	 * XXX
+	 * this driver is pretty much useless without OF, should
+	 * probably remove this
+	 */
+	if ((ia->ia_addr & 0x2b) == 0x2b)
+		return I2C_MATCH_ADDRESS_ONLY;
+
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/axp22x.c
diff -u src/sys/dev/i2c/axp22x.c:1.3 src/sys/dev/i2c/axp22x.c:1.4
--- src/sys/dev/i2c/axp22x.c:1.3	Sat Oct  7 20:31:48 2017
+++ src/sys/dev/i2c/axp22x.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axp22x.c,v 1.3 2017/10/07 20:31:48 jmcneill Exp $ */
+/* $NetBSD: axp22x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axp22x.c,v 1.3 2017/10/07 20:31:48 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp22x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -69,11 +69,14 @@ static int
 axp22x_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name != NULL)
-		return iic_compat_match(ia, compatible);
+	if (iic_use_direct_match(ia, match, compatible, &match_result))
+		return match_result;
 
-	return 1;
+	/* This device is direct-config only. */
+
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/fcu.c
diff -u src/sys/dev/i2c/fcu.c:1.3 src/sys/dev/i2c/fcu.c:1.4
--- src/sys/dev/i2c/fcu.c:1.3	Wed Mar 21 15:41:34 2018
+++ src/sys/dev/i2c/fcu.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: fcu.c,v 1.3 2018/03/21 15:41:34 macallan Exp $ */
+/* $NetBSD: fcu.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fcu.c,v 1.3 2018/03/21 15:41:34 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fcu.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -124,15 +124,15 @@ static int
 fcu_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		/* no ID registers on this chip */
-		if (ia->ia_addr == 0x2f)
-			return 1;
-		return 0;
-	} else {
-		return iic_compat_match(ia, fcu_compats);
-	}
+	if (iic_use_direct_match(ia, match, fcu_compats, &match_result))
+		return match_result;
+	
+	if (ia->ia_addr == 0x2f)
+		return I2C_MATCH_ADDRESS_ONLY;
+	
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/s390.c
diff -u src/sys/dev/i2c/s390.c:1.3 src/sys/dev/i2c/s390.c:1.4
--- src/sys/dev/i2c/s390.c:1.3	Thu Nov 20 16:34:26 2014
+++ src/sys/dev/i2c/s390.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: s390.c,v 1.3 2014/11/20 16:34:26 christos Exp $	*/
+/*	$NetBSD: s390.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2011 Frank Wille.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: s390.c,v 1.3 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: s390.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -66,16 +66,15 @@ static int
 s390rtc_match(device_t parent, cfdata_t cf, void *arg)
 {
 	struct i2c_attach_args *ia = arg;
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+	
+	/* indirect config - check typical address */
+	if (ia->ia_addr == S390_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "s390rtc") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == S390_ADDR)
-			return 1;
-	}
 	return 0;
 }
 
Index: src/sys/dev/i2c/si70xx.c
diff -u src/sys/dev/i2c/si70xx.c:1.3 src/sys/dev/i2c/si70xx.c:1.4
--- src/sys/dev/i2c/si70xx.c:1.3	Sat Dec 30 03:18:26 2017
+++ src/sys/dev/i2c/si70xx.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: si70xx.c,v 1.3 2017/12/30 03:18:26 christos Exp $	*/
+/*	$NetBSD: si70xx.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2017 Brad Spencer <b...@anduin.eldar.org>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: si70xx.c,v 1.3 2017/12/30 03:18:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: si70xx.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 /*
   Driver for the Silicon Labs SI7013/SI7020/SI7021
@@ -563,21 +563,16 @@ si70xx_sysctl_init(struct si70xx_sc *sc)
 static int
 si70xx_match(device_t parent, cfdata_t match, void *aux)
 {
-	struct i2c_attach_args *ia;
-	int error;
+	struct i2c_attach_args *ia = aux;
+	int error, match_result;
 	const bool matchdebug = false;
 
-	ia = aux;
+	if (iic_use_direct_match(ia, match, NULL, &match_result))
+		return match_result;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "si70xxtemp") != 0)
-			return 0;
-	} else {
-		/* indirect config - check for configured address */
-		if (ia->ia_addr != SI70XX_TYPICAL_ADDR)
-			return 0;
-	}
+	/* indirect config - check for configured address */
+	if (ia->ia_addr != SI70XX_TYPICAL_ADDR)
+		return 0;
 
 	/*
 	 * Check to see if something is really at this i2c address. This will
@@ -592,7 +587,7 @@ si70xx_match(device_t parent, cfdata_t m
 	error = si70xx_poke(ia->ia_tag, ia->ia_addr, matchdebug);
 	iic_release_bus(ia->ia_tag, 0);
 
-	return error == 0;
+	return error == 0 ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
 }
 
 static void
Index: src/sys/dev/i2c/tsl256x.c
diff -u src/sys/dev/i2c/tsl256x.c:1.3 src/sys/dev/i2c/tsl256x.c:1.4
--- src/sys/dev/i2c/tsl256x.c:1.3	Thu Jun  7 05:54:23 2018
+++ src/sys/dev/i2c/tsl256x.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tsl256x.c,v 1.3 2018/06/07 05:54:23 thorpej Exp $ */
+/* $NetBSD: tsl256x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Jason R. Thorpe
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tsl256x.c,v 1.3 2018/06/07 05:54:23 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tsl256x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -110,38 +110,35 @@ tsllux_match(device_t parent, cfdata_t m
 {
 	struct i2c_attach_args *ia = aux;
 	uint8_t id_reg;
-	int error;
+	int error, match_result;
 
-	if (ia->ia_name == NULL) {
-		switch (ia->ia_addr) {
-		case TSL256x_SLAVEADDR_GND:
-		case TSL256x_SLAVEADDR_FLOAT:
-		case TSL256x_SLAVEADDR_VDD:
-			break;
+	if (iic_use_direct_match(ia, match, tsllux_compats, &match_result))
+		return (match_result);
 
-		default:
-			return (0);
-		}
+	switch (ia->ia_addr) {
+	case TSL256x_SLAVEADDR_GND:
+	case TSL256x_SLAVEADDR_FLOAT:
+	case TSL256x_SLAVEADDR_VDD:
+		break;
 
-		if (iic_acquire_bus(ia->ia_tag, I2C_F_POLL) != 0)
-			return (0);
-		error = iic_smbus_read_byte(ia->ia_tag, ia->ia_addr,
-		    TSL256x_REG_ID | COMMAND_CMD, &id_reg, I2C_F_POLL);
-		iic_release_bus(ia->ia_tag, I2C_F_POLL);
+	default:
+		return (0);
+	}
 
-		if (error)
-			return (0);
+	if (iic_acquire_bus(ia->ia_tag, I2C_F_POLL) != 0)
+		return (0);
+	error = iic_smbus_read_byte(ia->ia_tag, ia->ia_addr,
+	    TSL256x_REG_ID | COMMAND_CMD, &id_reg, I2C_F_POLL);
+	iic_release_bus(ia->ia_tag, I2C_F_POLL);
 
-		/*
-		 * XXX This loses if we have a 2560 rev. 0.
-		 */
-		if (id_reg == 0)
-			return (0);
+	if (error)
+		return (0);
 
-		return (1);
-	} else {
-		return iic_compat_match(ia, tsllux_compats);
-	}
+	/* XXX This loses if we have a 2560 rev. 0. */
+	if (id_reg == 0)
+		return (I2C_MATCH_ADDRESS_ONLY);
+
+	return (I2C_MATCH_ADDRESS_AND_PROBE);
 }
 
 static void
@@ -517,7 +514,7 @@ static int
 tsllux_write2(struct tsllux_softc *sc, uint8_t reg, uint16_t val)
 {
 	reg = (reg & REGMASK) | COMMAND_CMD | COMMAND_WORD;
-	return (iic_smbus_write_byte(sc->sc_i2c, sc->sc_addr, reg, val,
+	return (iic_smbus_write_word(sc->sc_i2c, sc->sc_addr, reg, val,
 				     sc->sc_i2c_flags));
 }
 #endif

Index: src/sys/dev/i2c/adm1021.c
diff -u src/sys/dev/i2c/adm1021.c:1.16 src/sys/dev/i2c/adm1021.c:1.17
--- src/sys/dev/i2c/adm1021.c:1.16	Fri Sep 29 14:17:47 2017
+++ src/sys/dev/i2c/adm1021.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: adm1021.c,v 1.16 2017/09/29 14:17:47 macallan Exp $ */
+/*	$NetBSD: adm1021.c,v 1.17 2018/06/16 21:22:13 thorpej Exp $ */
 /*	$OpenBSD: adm1021.c,v 1.27 2007/06/24 05:34:35 dlg Exp $	*/
 
 /*
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adm1021.c,v 1.16 2017/09/29 14:17:47 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adm1021.c,v 1.17 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -162,29 +162,19 @@ int
 admtemp_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		/*
-		 * Indirect config - not much we can do!
-		 * Check typical addresses.
-		 */
-		if (((ia->ia_addr >= 0x18) && (ia->ia_addr <= 0x1a)) ||
-		    ((ia->ia_addr >= 0x29) && (ia->ia_addr <= 0x2b)) ||
-		    ((ia->ia_addr >= 0x48) && (ia->ia_addr <= 0x4e)))
-			return (1);
-	} else {
-		/*
-		 * Direct config - match via the list of compatible
-		 * hardware or simply match the device name.
-		 */
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, admtemp_compats))
-				return 1;
-		} else {
-			if (strcmp(ia->ia_name, "admtemp") == 0)
-				return 1;
-		}
-	}
+	if (iic_use_direct_match(ia, match, admtemp_compats, &match_result))
+		return match_result;
+	
+	/*
+	 * Indirect config - not much we can do!
+	 * Check typical addresses.
+	 */
+	if (((ia->ia_addr >= 0x18) && (ia->ia_addr <= 0x1a)) ||
+	    ((ia->ia_addr >= 0x29) && (ia->ia_addr <= 0x2b)) ||
+	    ((ia->ia_addr >= 0x48) && (ia->ia_addr <= 0x4e)))
+		return I2C_MATCH_ADDRESS_ONLY;
 
 	return 0;
 }

Index: src/sys/dev/i2c/adm1026.c
diff -u src/sys/dev/i2c/adm1026.c:1.2 src/sys/dev/i2c/adm1026.c:1.3
--- src/sys/dev/i2c/adm1026.c:1.2	Mon Jan 11 18:23:52 2016
+++ src/sys/dev/i2c/adm1026.c	Sat Jun 16 21:22:13 2018
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adm1026.c,v 1.2 2016/01/11 18:23:52 jdc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adm1026.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -132,22 +132,18 @@ adm1026_match(device_t parent, cfdata_t 
 {
 	struct i2c_attach_args *ia = aux;
 	struct adm1026_softc sc;	/* For chip ident */
+	int match_result;
+
 	sc.sc_tag = ia->ia_tag;
 	sc.sc_address = ia->ia_addr;
 	sc.sc_iic_flags = 0;
 
-	/* Direct config - match compats */
-	if (ia->ia_name) {
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, adm1026_compats))
-				return 1;
-		}
-	/* Indirect config - check address and chip ID/rev. */
-	} else {
-		if ((ia->ia_addr & ADM1026_ADDRMASK) == ADM1026_ADDR &&
-		    adm1026_ident(&sc))
-			return 1;
-	}
+	if (iic_use_direct_match(ia, cf, adm1026_compats, &match_result))
+		return match_result;
+
+	if ((ia->ia_addr & ADM1026_ADDRMASK) == ADM1026_ADDR &&
+	    adm1026_ident(&sc))
+		return I2C_MATCH_ADDRESS_AND_PROBE;
 
 	return 0;
 }
Index: src/sys/dev/i2c/am2315.c
diff -u src/sys/dev/i2c/am2315.c:1.2 src/sys/dev/i2c/am2315.c:1.3
--- src/sys/dev/i2c/am2315.c:1.2	Sat Dec 30 03:18:26 2017
+++ src/sys/dev/i2c/am2315.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: am2315.c,v 1.2 2017/12/30 03:18:26 christos Exp $	*/
+/*	$NetBSD: am2315.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2017 Brad Spencer <b...@anduin.eldar.org>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: am2315.c,v 1.2 2017/12/30 03:18:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: am2315.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 /*
  * Driver for the Aosong AM2315
@@ -170,42 +170,19 @@ am2315_poke_m(i2c_tag_t tag, i2c_addr_t 
 static int
 am2315_match(device_t parent, cfdata_t match, void *aux)
 {
-	struct i2c_attach_args *ia;
+	struct i2c_attach_args *ia = aux;
 	int rv;
 	const bool matchdebug = false;
+	int match_result;
 
-	ia = aux;
+	if (iic_use_direct_match(ia, match, NULL, &match_result))
+		return match_result;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "am2315temp") != 0)
-			return 0;
-	} else {
-		/* indirect config - check for configured address */
-		if (ia->ia_addr != AM2315_TYPICAL_ADDR)
-			return 0;
-	}
-
-	/*
-	 * Check to see if something is really at this i2c address. This will
-	 * keep phantom devices from appearing
-	 */
-	if (iic_acquire_bus(ia->ia_tag, 0) != 0) {
-		if (matchdebug)
-			printf("in match acquire bus failed\n");
-		return 0;
-	}
+	/* indirect config - check for standard address */
+	if (ia->ia_addr == AM2315_TYPICAL_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
 
-	if ((rv = am2315_poke_m(ia->ia_tag, ia->ia_addr, __func__, matchdebug))
-	    != 0) {
-		if (matchdebug)
-			printf("match rv poke %d\n", rv);
-		iic_release_bus(ia->ia_tag, 0);
-		return 0;
-	}
-
-	iic_release_bus(ia->ia_tag, 0);
-	return 1;
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/ihidev.c
diff -u src/sys/dev/i2c/ihidev.c:1.2 src/sys/dev/i2c/ihidev.c:1.3
--- src/sys/dev/i2c/ihidev.c:1.2	Tue Mar 20 12:14:52 2018
+++ src/sys/dev/i2c/ihidev.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ihidev.c,v 1.2 2018/03/20 12:14:52 bouyer Exp $ */
+/* $NetBSD: ihidev.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $ */
 /* $OpenBSD ihidev.c,v 1.13 2017/04/08 02:57:23 deraadt Exp $ */
 
 /*-
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.2 2018/03/20 12:14:52 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -129,11 +129,11 @@ static int
 ihidev_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args * const ia = aux;
+	int match_result;
+
+	if (iic_use_direct_match(ia, match, ihidev_compats, &match_result))
+		return I2C_MATCH_DIRECT_COMPATIBLE;
 
-	if (ia->ia_ncompat > 0) {
-		if (iic_compat_match(ia, ihidev_compats))
-			return 1;
-	}
 	return 0;
 }
 
Index: src/sys/dev/i2c/max77620.c
diff -u src/sys/dev/i2c/max77620.c:1.2 src/sys/dev/i2c/max77620.c:1.3
--- src/sys/dev/i2c/max77620.c:1.2	Thu Sep 28 13:08:00 2017
+++ src/sys/dev/i2c/max77620.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: max77620.c,v 1.2 2017/09/28 13:08:00 jmcneill Exp $ */
+/* $NetBSD: max77620.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: max77620.c,v 1.2 2017/09/28 13:08:00 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: max77620.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -258,11 +258,12 @@ static int
 max77620_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL)
-		return 0;
+	if (iic_use_direct_match(ia, match, max77620_compats, match_result))
+		return match_result;
 
-	return iic_compat_match(ia, max77620_compats);
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/smscmon.c
diff -u src/sys/dev/i2c/smscmon.c:1.2 src/sys/dev/i2c/smscmon.c:1.3
--- src/sys/dev/i2c/smscmon.c:1.2	Mon Jun 20 20:16:19 2011
+++ src/sys/dev/i2c/smscmon.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: smscmon.c,v 1.2 2011/06/20 20:16:19 pgoyette Exp $ */
+/* $NetBSD: smscmon.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*
  * Copyright (c) 2009 Takahiro Hayashi
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smscmon.c,v 1.2 2011/06/20 20:16:19 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smscmon.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -183,7 +183,7 @@ smscmon_match(device_t parent, cfdata_t 
 	}
 
 	iic_release_bus(ia->ia_tag, 0);
-	return 1;
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 static void
Index: src/sys/dev/i2c/w83795g.c
diff -u src/sys/dev/i2c/w83795g.c:1.2 src/sys/dev/i2c/w83795g.c:1.3
--- src/sys/dev/i2c/w83795g.c:1.2	Sun Apr 13 12:42:47 2014
+++ src/sys/dev/i2c/w83795g.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: w83795g.c,v 1.2 2014/04/13 12:42:47 christos Exp $	*/
+/*	$NetBSD: w83795g.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2013 Soren S. Jorvang.  All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: w83795g.c,v 1.2 2014/04/13 12:42:47 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: w83795g.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -155,7 +155,7 @@ w83795g_match(device_t parent, cfdata_t 
 	if ((bank & BANKSEL_HBACS && vend == VENDOR_NUVOTON_ID_HI) ||
 	   (~bank & BANKSEL_HBACS && vend == VENDOR_NUVOTON_ID_LO))
 		if (chip == CHIP_W83795G && deva == DEVICEA_A)
-			return 1;
+			return I2C_MATCH_ADDRESS_AND_PROBE;
 
 	return 0;
 }

Index: src/sys/dev/i2c/as3722.c
diff -u src/sys/dev/i2c/as3722.c:1.12 src/sys/dev/i2c/as3722.c:1.13
--- src/sys/dev/i2c/as3722.c:1.12	Sun May 28 15:55:11 2017
+++ src/sys/dev/i2c/as3722.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: as3722.c,v 1.12 2017/05/28 15:55:11 jmcneill Exp $ */
+/* $NetBSD: as3722.c,v 1.13 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_fdt.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: as3722.c,v 1.12 2017/05/28 15:55:11 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: as3722.c,v 1.13 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -51,6 +51,8 @@ __KERNEL_RCSID(0, "$NetBSD: as3722.c,v 1
 #include <dev/fdt/fdtvar.h>
 #endif
 
+#define	AS3722_I2C_ADDR			0x40
+
 #define AS3722_START_YEAR		2000
 
 #define AS3722_SD0_VOLTAGE_REG		0x00
@@ -230,22 +232,24 @@ as3722_match(device_t parent, cfdata_t m
 {
 	struct i2c_attach_args *ia = aux;
 	uint8_t reg, id1;
-	int error;
+	int error, match_result;
 
-	if (ia->ia_name == NULL) {
-		iic_acquire_bus(ia->ia_tag, I2C_F_POLL);
-		reg = AS3722_ASIC_ID1_REG;
-		error = iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
-		    &reg, 1, &id1, 1, I2C_F_POLL);
-		iic_release_bus(ia->ia_tag, I2C_F_POLL);
+	if (iic_use_direct_match(ia, match, as3722_compats, &match_result))
+		return match_result;
+	
+	if (ia->ia_addr != AS3722_I2C_ADDR)
+		return 0;
+	
+	iic_acquire_bus(ia->ia_tag, I2C_F_POLL);
+	reg = AS3722_ASIC_ID1_REG;
+	error = iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
+	    &reg, 1, &id1, 1, I2C_F_POLL);
+	iic_release_bus(ia->ia_tag, I2C_F_POLL);
 
-		if (error == 0 && id1 == 0x0c)
-			return 1;
+	if (error == 0 && id1 == 0x0c)
+		return I2C_MATCH_ADDRESS_AND_PROBE;
 
-		return 0;
-	} else {
-		return iic_compat_match(ia, as3722_compats);
-	}
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/at24cxx.c
diff -u src/sys/dev/i2c/at24cxx.c:1.25 src/sys/dev/i2c/at24cxx.c:1.26
--- src/sys/dev/i2c/at24cxx.c:1.25	Sat Oct 28 04:53:55 2017
+++ src/sys/dev/i2c/at24cxx.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: at24cxx.c,v 1.25 2017/10/28 04:53:55 riastradh Exp $	*/
+/*	$NetBSD: at24cxx.c,v 1.26 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at24cxx.c,v 1.25 2017/10/28 04:53:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at24cxx.c,v 1.26 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,21 +131,15 @@ static int
 seeprom_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name) {
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, seeprom_compats))
-				return (1);
-		} else {
-			if (strcmp(ia->ia_name, "seeprom") == 0)
-				return (1);
-		}
-	} else {
-		if ((ia->ia_addr & AT24CXX_ADDRMASK) == AT24CXX_ADDR)
-			return (1);
-	}
+	if (iic_use_direct_match(ia, cf, seeprom_compats, &match_result))
+		return match_result;
 
-	return (0);
+	if ((ia->ia_addr & AT24CXX_ADDRMASK) == AT24CXX_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
+
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/axp20x.c
diff -u src/sys/dev/i2c/axp20x.c:1.10 src/sys/dev/i2c/axp20x.c:1.11
--- src/sys/dev/i2c/axp20x.c:1.10	Sun Oct 22 11:00:28 2017
+++ src/sys/dev/i2c/axp20x.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axp20x.c,v 1.10 2017/10/22 11:00:28 jmcneill Exp $ */
+/* $NetBSD: axp20x.c,v 1.11 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_fdt.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axp20x.c,v 1.10 2017/10/22 11:00:28 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp20x.c,v 1.11 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,6 +47,8 @@ __KERNEL_RCSID(0, "$NetBSD: axp20x.c,v 1
 #include <dev/fdt/fdtvar.h>
 #endif
 
+#define	AXP209_I2C_ADDR		0x34
+
 #define AXP_INPUT_STATUS	0x00
 #define AXP_INPUT_STATUS_AC_PRESENT	__BIT(7)
 #define AXP_INPUT_STATUS_AC_OK		__BIT(6)
@@ -221,11 +223,14 @@ static int
 axp20x_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args * const ia = aux;
+	int match_result;
+
+	if (iic_use_direct_match(ia, match, compatible, &match_result))
+		return match_result;
 
-	if (ia->ia_name != NULL)
-		return iic_compat_match(ia, compatible);
+	/* This device is direct-config only. */
 
-	return 1;
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/axppmic.c
diff -u src/sys/dev/i2c/axppmic.c:1.10 src/sys/dev/i2c/axppmic.c:1.11
--- src/sys/dev/i2c/axppmic.c:1.10	Sat May 26 14:39:20 2018
+++ src/sys/dev/i2c/axppmic.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axppmic.c,v 1.10 2018/05/26 14:39:20 jmcneill Exp $ */
+/* $NetBSD: axppmic.c,v 1.11 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014-2018 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.10 2018/05/26 14:39:20 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.11 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -679,14 +679,25 @@ axppmic_match(device_t parent, cfdata_t 
 {
 	struct i2c_attach_args *ia = aux;
 
+	/* XXXJRT Gross. */
 	if (ia->ia_name != NULL) {
-		if (ia->ia_cookie)
-			return of_match_compat_data(ia->ia_cookie, compat_data);
-		else
+		if (ia->ia_cookie) {
+			int match_result =
+			    of_match_compat_data(ia->ia_cookie, compat_data);
+			if (match_result) {
+				match_result = match_result - 1 +
+				    I2C_MATCH_DIRECT_COMPATIBLE;
+				match_result = MIN(match_result,
+				    I2C_MATCH_DIRECT_COMPATIBLE_MAX);
+			}
+			return match_result;
+		} else
 			return 0;
 	}
 
-	return 1;
+	/* This device is direct-config only. */
+
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/dbcool.c
diff -u src/sys/dev/i2c/dbcool.c:1.48 src/sys/dev/i2c/dbcool.c:1.49
--- src/sys/dev/i2c/dbcool.c:1.48	Tue Feb  6 10:02:09 2018
+++ src/sys/dev/i2c/dbcool.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: dbcool.c,v 1.48 2018/02/06 10:02:09 mrg Exp $ */
+/*	$NetBSD: dbcool.c,v 1.49 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dbcool.c,v 1.48 2018/02/06 10:02:09 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dbcool.c,v 1.49 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -748,20 +748,16 @@ dbcool_match(device_t parent, cfdata_t c
 	dc.dc_chip = NULL;
 	dc.dc_readreg = dbcool_readreg;
 	dc.dc_writereg = dbcool_writereg;
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, dbcool_compats, &match_result))
+		return match_result;
+
+	if ((ia->ia_addr & DBCOOL_ADDRMASK) != DBCOOL_ADDR)
+		return 0;
+	if (dbcool_chip_ident(&dc) >= 0)
+		return I2C_MATCH_ADDRESS_AND_PROBE;
 
-	/* Direct config - match compats */
-	if (ia->ia_name) {
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, dbcool_compats))
-				return 1;
-		}
-	/* Indirect config - check address and chip ID */
-	} else {
-		if ((ia->ia_addr & DBCOOL_ADDRMASK) != DBCOOL_ADDR)
-			return 0;
-		if (dbcool_chip_ident(&dc) >= 0)
-			return 1;
-	}
 	return 0;
 }
 

Index: src/sys/dev/i2c/ddc.c
diff -u src/sys/dev/i2c/ddc.c:1.6 src/sys/dev/i2c/ddc.c:1.7
--- src/sys/dev/i2c/ddc.c:1.6	Sat Jul 25 15:20:49 2015
+++ src/sys/dev/i2c/ddc.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ddc.c,v 1.6 2015/07/25 15:20:49 jmcneill Exp $ */
+/* $NetBSD: ddc.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */ 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddc.c,v 1.6 2015/07/25 15:20:49 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddc.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -70,7 +70,7 @@ ddc_match(device_t parent, cfdata_t cf, 
 	struct i2c_attach_args *ia = aux;
 
 	if (ia->ia_addr == DDC_ADDR)
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	return 0;
 }
 
Index: src/sys/dev/i2c/ibmhawk.c
diff -u src/sys/dev/i2c/ibmhawk.c:1.6 src/sys/dev/i2c/ibmhawk.c:1.7
--- src/sys/dev/i2c/ibmhawk.c:1.6	Wed Jun  6 01:49:08 2018
+++ src/sys/dev/i2c/ibmhawk.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ibmhawk.c,v 1.6 2018/06/06 01:49:08 maya Exp $ */
+/* $NetBSD: ibmhawk.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -109,7 +109,8 @@ ibmhawk_match(device_t parent, cfdata_t 
 	sc.sc_addr = ia->ia_addr;
 	if (ibmhawk_request(&sc, IHR_EQUIP, &resp))
 		return 0;
-	return 1;
+
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 static void
Index: src/sys/dev/i2c/tcakp.c
diff -u src/sys/dev/i2c/tcakp.c:1.6 src/sys/dev/i2c/tcakp.c:1.7
--- src/sys/dev/i2c/tcakp.c:1.6	Mon Apr 30 20:33:09 2018
+++ src/sys/dev/i2c/tcakp.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tcakp.c,v 1.6 2018/04/30 20:33:09 jmcneill Exp $ */
+/* $NetBSD: tcakp.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_fdt.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcakp.c,v 1.6 2018/04/30 20:33:09 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcakp.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -316,13 +316,15 @@ static int
 tcakp_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
 
-	if (ia->ia_name == NULL) {
-		if (ia->ia_addr == 0x34)
-			return 1;
-		return 0;
-	} else
-		return iic_compat_match(ia, tcakp_compats);
+	if (iic_use_direct_match(ia, match, tcakp_compats, &match_result))
+		return match_result;
+
+	if (ia->ia_addr == 0x34)
+		return I2C_MATCH_ADDRESS_ONLY;
+	
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/i2c.c
diff -u src/sys/dev/i2c/i2c.c:1.61 src/sys/dev/i2c/i2c.c:1.62
--- src/sys/dev/i2c/i2c.c:1.61	Thu Jun  7 13:30:49 2018
+++ src/sys/dev/i2c/i2c.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2c.c,v 1.61 2018/06/07 13:30:49 thorpej Exp $	*/
+/*	$NetBSD: i2c.c,v 1.62 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.61 2018/06/07 13:30:49 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.62 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -109,8 +109,9 @@ iic_print_direct(void *aux, const char *
 	struct i2c_attach_args *ia = aux;
 
 	if (pnp != NULL)
-		aprint_normal("%s at %s addr 0x%02x", ia->ia_name, pnp,
-			ia->ia_addr);
+		aprint_normal("%s at %s addr 0x%02x",
+			      ia->ia_name ? ia->ia_name : "(unknown)",
+			      pnp, ia->ia_addr);
 	else
 		aprint_normal(" addr 0x%02x", ia->ia_addr);
 
@@ -452,8 +453,10 @@ iic_attach(device_t parent, device_t sel
 			dev = prop_array_get(child_devices, i);
 			if (!dev) continue;
  			if (!prop_dictionary_get_cstring_nocopy(
-			    dev, "name", &name))
-				continue;
+			    dev, "name", &name)) {
+				/* "name" property is optional. */
+				name = NULL;
+			}
 			if (!prop_dictionary_get_uint32(dev, "addr", &addr))
 				continue;
 			if (!prop_dictionary_get_uint64(dev, "cookie", &cookie))
@@ -480,14 +483,21 @@ iic_attach(device_t parent, device_t sel
 				    prop_data_data_nocopy(cdata),
 				    prop_data_size(cdata), &buf);
 
-			if (addr > I2C_MAX_ADDR) {
+			if (name == NULL && cdata == NULL) {
 				aprint_error_dev(self,
-				    "WARNING: ignoring bad device address "
-				    "@ 0x%02x\n", addr);
-			} else if (sc->sc_devices[addr] == NULL) {
-				sc->sc_devices[addr] =
-				    config_found_sm_loc(self, "iic", loc, &ia,
-					iic_print_direct, NULL);
+				    "WARNING: ignoring bad child device entry "
+				    "for address 0x%02x\n", addr);
+			} else {
+				if (addr > I2C_MAX_ADDR) {
+					aprint_error_dev(self,
+					    "WARNING: ignoring bad device "
+					    "address @ 0x%02x\n", addr);
+				} else if (sc->sc_devices[addr] == NULL) {
+					sc->sc_devices[addr] =
+					    config_found_sm_loc(self, "iic",
+					        loc, &ia, iic_print_direct,
+						NULL);
+				}
 			}
 
 			if (ia.ia_compat)
@@ -680,18 +690,58 @@ iic_fill_compat(struct i2c_attach_args *
 	ia->ia_ncompat = count;
 }
 
+/*
+ * iic_compat_match --
+ *	Match a device's "compatible" property against the list
+ *	of compatible strings provided by the driver.  Note that
+ *	we weight the match to the reverse index of the device's
+ *	"compatible" property strings so that a driver that matches
+ *	an lower-indexed "compatible" property is given a higher
+ *	match priority than one that matches a higher-indexed
+ *	"compatible" property.
+ */
 int
-iic_compat_match(struct i2c_attach_args *ia, const char ** compats)
+iic_compat_match(const struct i2c_attach_args *ia, const char **compats)
 {
-	int i;
+	int match_result = 0, i, ri;
+
+	if (ia->ia_ncompat == 0 || ia->ia_compat == NULL)
+		return 0;
 
 	for (; compats && *compats; compats++) {
-		for (i = 0; i < ia->ia_ncompat; i++) {
-			if (strcmp(*compats, ia->ia_compat[i]) == 0)
-				return 1;
+		for (i = 0, ri = ia->ia_ncompat - 1;
+		     i < ia->ia_ncompat;
+		     i++, ri--) {
+			if (strcmp(*compats, ia->ia_compat[i]) == 0) {
+				KASSERT(ri >= 0);
+				match_result =
+				    I2C_MATCH_DIRECT_COMPATIBLE + ri;
+			}
 		}
 	}
-	return 0;
+	match_result = MIN(match_result, I2C_MATCH_DIRECT_COMPATIBLE_MAX);
+	return match_result;
+}
+
+bool
+iic_use_direct_match(const struct i2c_attach_args *ia, const cfdata_t cf,
+		     const char **compats, int *match_resultp)
+{
+
+	KASSERT(match_resultp != NULL);
+
+	if (ia->ia_name != NULL &&
+	    strcmp(ia->ia_name, cf->cf_name) == 0) {
+		*match_resultp = I2C_MATCH_DIRECT_SPECIFIC;
+		return true;
+	}
+
+	if (ia->ia_ncompat > 0 && ia->ia_compat != NULL) {
+		*match_resultp = iic_compat_match(ia, compats);
+		return true;
+	}
+
+	return false;
 }
 
 static int

Index: src/sys/dev/i2c/i2cvar.h
diff -u src/sys/dev/i2c/i2cvar.h:1.13 src/sys/dev/i2c/i2cvar.h:1.14
--- src/sys/dev/i2c/i2cvar.h:1.13	Thu Jun  7 13:30:49 2018
+++ src/sys/dev/i2c/i2cvar.h	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2cvar.h,v 1.13 2018/06/07 13:30:49 thorpej Exp $	*/
+/*	$NetBSD: i2cvar.h,v 1.14 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -38,6 +38,7 @@
 #ifndef _DEV_I2C_I2CVAR_H_
 #define	_DEV_I2C_I2CVAR_H_
 
+#include <sys/device.h>
 #include <dev/i2c/i2c_io.h>
 #include <prop/proplib.h>
 
@@ -159,7 +160,13 @@ struct i2c_attach_args {
  * API presented to i2c controllers.
  */
 int	iicbus_print(void *, const char *);
-int	iic_compat_match(struct i2c_attach_args*, const char **);
+
+/*
+ * API presented to i2c devices.
+ */
+int	iic_compat_match(const struct i2c_attach_args *, const char **);
+bool	iic_use_direct_match(const struct i2c_attach_args *,
+			     const cfdata_t, const char **, int *);
 
 /*
  * Constants to indicate the quality of a match made by a driver's
@@ -176,7 +183,8 @@ int	iic_compat_match(struct i2c_attach_a
 #define	I2C_MATCH_ADDRESS_ONLY		1
 #define	I2C_MATCH_ADDRESS_AND_PROBE	2
 #define	I2C_MATCH_DIRECT_COMPATIBLE	10
-#define	I2C_MATCH_DIRECT_SPECIFIC	50
+#define	I2C_MATCH_DIRECT_COMPATIBLE_MAX	99
+#define	I2C_MATCH_DIRECT_SPECIFIC	100
 
 #ifdef _I2C_PRIVATE
 /*

Index: src/sys/dev/i2c/lm75.c
diff -u src/sys/dev/i2c/lm75.c:1.30 src/sys/dev/i2c/lm75.c:1.31
--- src/sys/dev/i2c/lm75.c:1.30	Sun Oct  1 05:12:18 2017
+++ src/sys/dev/i2c/lm75.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: lm75.c,v 1.30 2017/10/01 05:12:18 macallan Exp $	*/
+/*	$NetBSD: lm75.c,v 1.31 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.30 2017/10/01 05:12:18 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.31 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -146,35 +146,23 @@ static int
 lmtemp_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
-	int i;
-
-	if (ia->ia_name == NULL) {
-		/*
-		 * Indirect config - not much we can do!
-		 */
-		for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
-			if (lmtemptbl[i].lmtemp_type == cf->cf_flags)
-				break;
-		if (lmtemptbl[i].lmtemp_type == -1)
-			return 0;
+	int i, match_result;
 
-		if ((ia->ia_addr & lmtemptbl[i].lmtemp_addrmask) ==
-		    lmtemptbl[i].lmtemp_addr)
-			return 1;
-	} else {
-		/*
-		 * Direct config - match via the list of compatible
-		 * hardware or simply match the device name.
-		 */
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, lmtemp_compats))
-				return 1;
-		} else {
-			if (strcmp(ia->ia_name, "lmtemp") == 0)
-				return 1;
-		}
-	}
+	if (iic_use_direct_match(ia, cf, lmtemp_compats, &match_result))
+		return match_result;
 
+	/*
+	 * Indirect config - not much we can do!
+	 */
+	for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
+		if (lmtemptbl[i].lmtemp_type == cf->cf_flags)
+			break;
+	if (lmtemptbl[i].lmtemp_type == -1)
+		return 0;
+
+	if ((ia->ia_addr & lmtemptbl[i].lmtemp_addrmask) ==
+	    lmtemptbl[i].lmtemp_addr)
+		return I2C_MATCH_ADDRESS_ONLY;
 
 	return 0;
 }

Index: src/sys/dev/i2c/lm87.c
diff -u src/sys/dev/i2c/lm87.c:1.7 src/sys/dev/i2c/lm87.c:1.8
--- src/sys/dev/i2c/lm87.c:1.7	Sun Jan 10 14:03:11 2016
+++ src/sys/dev/i2c/lm87.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: lm87.c,v 1.7 2016/01/10 14:03:11 jdc Exp $	*/
+/*	$NetBSD: lm87.c,v 1.8 2018/06/16 21:22:13 thorpej Exp $	*/
 /*	$OpenBSD: lm87.c,v 1.20 2008/11/10 05:19:48 cnst Exp $	*/
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lm87.c,v 1.7 2016/01/10 14:03:11 jdc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm87.c,v 1.8 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -149,41 +149,30 @@ lmenv_match(device_t parent, cfdata_t ma
 {
 	struct i2c_attach_args *ia = aux;
 	u_int8_t cmd, val;
-	int error, i;
+	int error, i, match_result;
 
-	if (ia->ia_name == NULL) {
-		/*
-		 * Indirect config - not much we can do!
-		 * Check typical addresses and read the Company ID register
-		 */
-		if ((ia->ia_addr < 0x2c) || (ia->ia_addr > 0x2f))
-			return 0;
-
-		cmd = LM87_COMPANY_ID;
-		iic_acquire_bus(ia->ia_tag, 0);
-		error = iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
-		    &cmd, 1, &val, 1, I2C_F_POLL);
-		iic_release_bus(ia->ia_tag, 0);
-
-		if (error)
-			return 0;
-
-		for (i = 0; lmenv_ids[i].id != 0; i++)
-			if (lmenv_ids[i].id == val)
-				return 1;
-	} else {
-		/*
-		 * Direct config - match via the list of compatible
-		 * hardware or simply match the device name.
-		 */
-		if (ia->ia_ncompat > 0) {
-			if (iic_compat_match(ia, lmenv_compats))
-				return 1;
-		} else {
-			if (strcmp(ia->ia_name, "lmenv") == 0)
-				return 1;
-		}
-	}
+	if (iic_use_direct_match(ia, match, lmenv_compats, &match_result))
+		return match_result;
+	
+	/*
+	 * Indirect config - not much we can do!
+	 * Check typical addresses and read the Company ID register
+	 */
+	if ((ia->ia_addr < 0x2c) || (ia->ia_addr > 0x2f))
+		return 0;
+
+	cmd = LM87_COMPANY_ID;
+	iic_acquire_bus(ia->ia_tag, 0);
+	error = iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
+	    &cmd, 1, &val, 1, I2C_F_POLL);
+	iic_release_bus(ia->ia_tag, 0);
+
+	if (error)
+		return 0;
+
+	for (i = 0; lmenv_ids[i].id != 0; i++)
+		if (lmenv_ids[i].id == val)
+			return I2C_MATCH_ADDRESS_AND_PROBE;
 
 	return 0;
 }
Index: src/sys/dev/i2c/r2025.c
diff -u src/sys/dev/i2c/r2025.c:1.7 src/sys/dev/i2c/r2025.c:1.8
--- src/sys/dev/i2c/r2025.c:1.7	Thu Nov 20 16:34:26 2014
+++ src/sys/dev/i2c/r2025.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: r2025.c,v 1.7 2014/11/20 16:34:26 christos Exp $ */
+/* $NetBSD: r2025.c,v 1.8 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2006 Shigeyuki Fukushima.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: r2025.c,v 1.7 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: r2025.c,v 1.8 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -76,7 +76,7 @@ r2025rtc_match(device_t parent, cfdata_t
 
 	/* match only R2025 RTC devices */
 	if (ia->ia_addr == R2025_ADDR)
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 
 	return 0;
 }

Index: src/sys/dev/i2c/m41st84.c
diff -u src/sys/dev/i2c/m41st84.c:1.23 src/sys/dev/i2c/m41st84.c:1.24
--- src/sys/dev/i2c/m41st84.c:1.23	Sat Oct 28 04:53:55 2017
+++ src/sys/dev/i2c/m41st84.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: m41st84.c,v 1.23 2017/10/28 04:53:55 riastradh Exp $	*/
+/*	$NetBSD: m41st84.c,v 1.24 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: m41st84.c,v 1.23 2017/10/28 04:53:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: m41st84.c,v 1.24 2018/06/16 21:22:13 thorpej Exp $");
 
 #include "opt_strtc.h"
 
@@ -102,16 +102,15 @@ static int
 strtc_match(device_t parent, cfdata_t cf, void *arg)
 {
 	struct i2c_attach_args *ia = arg;
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+
+	/* indirect config - check typical address */
+	if (ia->ia_addr == M41ST84_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "strtc") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == M41ST84_ADDR)
-			return 1;
-	}
 	return 0;
 }
 

Index: src/sys/dev/i2c/m41t00.c
diff -u src/sys/dev/i2c/m41t00.c:1.20 src/sys/dev/i2c/m41t00.c:1.21
--- src/sys/dev/i2c/m41t00.c:1.20	Sat Oct 28 04:53:55 2017
+++ src/sys/dev/i2c/m41t00.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: m41t00.c,v 1.20 2017/10/28 04:53:55 riastradh Exp $	*/
+/*	$NetBSD: m41t00.c,v 1.21 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: m41t00.c,v 1.20 2017/10/28 04:53:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: m41t00.c,v 1.21 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -102,7 +102,7 @@ m41t00_match(device_t parent, cfdata_t c
 	struct i2c_attach_args *ia = aux;
 
 	if (ia->ia_addr == M41T00_ADDR) {
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	}
 
 	return 0;
Index: src/sys/dev/i2c/x1226.c
diff -u src/sys/dev/i2c/x1226.c:1.20 src/sys/dev/i2c/x1226.c:1.21
--- src/sys/dev/i2c/x1226.c:1.20	Sat Oct 28 04:53:55 2017
+++ src/sys/dev/i2c/x1226.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: x1226.c,v 1.20 2017/10/28 04:53:55 riastradh Exp $	*/
+/*	$NetBSD: x1226.c,v 1.21 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Shigeyuki Fukushima.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x1226.c,v 1.20 2017/10/28 04:53:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x1226.c,v 1.21 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -103,7 +103,7 @@ xrtc_match(device_t parent, cfdata_t cf,
 
 	/* match only this RTC devices */
 	if (ia->ia_addr == X1226_ADDR)
-		return (1);
+		return (I2C_MATCH_ADDRESS_ONLY);
 
 	return (0);
 }

Index: src/sys/dev/i2c/max6900.c
diff -u src/sys/dev/i2c/max6900.c:1.15 src/sys/dev/i2c/max6900.c:1.16
--- src/sys/dev/i2c/max6900.c:1.15	Thu Nov 20 16:34:26 2014
+++ src/sys/dev/i2c/max6900.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: max6900.c,v 1.15 2014/11/20 16:34:26 christos Exp $	*/
+/*	$NetBSD: max6900.c,v 1.16 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: max6900.c,v 1.15 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: max6900.c,v 1.16 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -98,7 +98,7 @@ maxrtc_match(device_t parent, cfdata_t c
 	struct i2c_attach_args *ia = aux;
 
 	if ((ia->ia_addr & MAX6900_ADDRMASK) == MAX6900_ADDR)
-		return (1);
+		return (I2C_MATCH_ADDRESS_ONLY);
 
 	return (0);
 }

Index: src/sys/dev/i2c/mcp980x.c
diff -u src/sys/dev/i2c/mcp980x.c:1.5 src/sys/dev/i2c/mcp980x.c:1.6
--- src/sys/dev/i2c/mcp980x.c:1.5	Mon Oct 28 11:24:08 2013
+++ src/sys/dev/i2c/mcp980x.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcp980x.c,v 1.5 2013/10/28 11:24:08 rkujawa Exp $ */
+/*	$NetBSD: mcp980x.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mcp980x.c,v 1.5 2013/10/28 11:24:08 rkujawa Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mcp980x.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -106,12 +106,12 @@ CFATTACH_DECL_NEW(mcp980x, sizeof (struc
 static int
 mcp980x_match(device_t parent, cfdata_t cf, void *aux)
 {
-	/*
-	 * No sane way to probe? Perhaps at least try to match constant part
-	 * of the I2Caddress.
-	 */
 
-	return 1;
+	if (ia->ia_addr >= MCP980X_ADDR_CONST &&
+	    ia->ia_addr <= (MCP980X_ADDR_CONST + MCP980X_ADDR_VAR))
+		return I2C_MATCH_ADDRESS_ONLY;
+
+	return 0;
 }
 
 static void
Index: src/sys/dev/i2c/tps65950.c
diff -u src/sys/dev/i2c/tps65950.c:1.5 src/sys/dev/i2c/tps65950.c:1.6
--- src/sys/dev/i2c/tps65950.c:1.5	Thu Nov 20 16:34:26 2014
+++ src/sys/dev/i2c/tps65950.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tps65950.c,v 1.5 2014/11/20 16:34:26 christos Exp $ */
+/* $NetBSD: tps65950.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2012 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tps65950.c,v 1.5 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tps65950.c,v 1.6 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -131,7 +131,7 @@ tps65950_match(device_t parent, cfdata_t
 	case TPS65950_ADDR_ID3:
 	case TPS65950_ADDR_ID4:
 	case TPS65950_ADDR_ID5:
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	default:
 		return 0;
 	}

Index: src/sys/dev/i2c/pcf8563.c
diff -u src/sys/dev/i2c/pcf8563.c:1.8 src/sys/dev/i2c/pcf8563.c:1.9
--- src/sys/dev/i2c/pcf8563.c:1.8	Sat Oct  7 20:18:16 2017
+++ src/sys/dev/i2c/pcf8563.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8563.c,v 1.8 2017/10/07 20:18:16 jmcneill Exp $	*/
+/*	$NetBSD: pcf8563.c,v 1.9 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2011 Jonathan A. Kollasch
@@ -32,7 +32,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcf8563.c,v 1.8 2017/10/07 20:18:16 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8563.c,v 1.9 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -76,15 +76,15 @@ static int
 pcf8563rtc_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, compatible, &match_result))
+		return match_result;
+
+	/* indirect config - check typical address */
+	if (ia->ia_addr == PCF8563_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		return iic_compat_match(ia, compatible);
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == PCF8563_ADDR)
-			return 1;
-	}
 	return 0;
 }
 
Index: src/sys/dev/i2c/sgsmix.c
diff -u src/sys/dev/i2c/sgsmix.c:1.8 src/sys/dev/i2c/sgsmix.c:1.9
--- src/sys/dev/i2c/sgsmix.c:1.8	Fri Sep 22 04:07:34 2017
+++ src/sys/dev/i2c/sgsmix.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: sgsmix.c,v 1.8 2017/09/22 04:07:34 macallan Exp $	*/
+/*	$NetBSD: sgsmix.c,v 1.9 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2005 Michael Lorenz.
@@ -31,7 +31,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sgsmix.c,v 1.8 2017/09/22 04:07:34 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sgsmix.c,v 1.9 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -81,21 +81,21 @@ sgsmix_match(device_t parent, cfdata_t c
 	struct i2c_attach_args *args = aux;
 	int ret = -1;
 	uint8_t out[2] = {1, 0x20};
+	int match_result;
 
-	if (args->ia_name) {
-		if (strcmp(args->ia_name, "sgsmix") == 0)
-			return 1;
-	} else {
-		/* see if we can talk to something at address 0x8a */
-		if (args->ia_addr == 0x8a) {
-			iic_acquire_bus(args->ia_tag, 0);
-			ret = iic_exec(args->ia_tag, I2C_OP_WRITE, args->ia_addr,
-			    out, 2, NULL, 0, 0);
-			iic_release_bus(args->ia_tag, 0);
-		}
-		return (ret >= 0);
-	}
-	return 0;
+	if (iic_use_direct_match(args, cf, NULL, &match_result))
+		return match_result;
+
+	/* see if we can talk to something at address 0x8a */
+	if (args->ia_addr != 0x8a)
+		return 0;
+
+	iic_acquire_bus(args->ia_tag, 0);
+	ret = iic_exec(args->ia_tag, I2C_OP_WRITE, args->ia_addr,
+	    out, 2, NULL, 0, 0);
+	iic_release_bus(args->ia_tag, 0);
+
+	return (ret >= 0) ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
 }
 
 static void

Index: src/sys/dev/i2c/pcf8583.c
diff -u src/sys/dev/i2c/pcf8583.c:1.17 src/sys/dev/i2c/pcf8583.c:1.18
--- src/sys/dev/i2c/pcf8583.c:1.17	Sat Oct 28 04:53:55 2017
+++ src/sys/dev/i2c/pcf8583.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8583.c,v 1.17 2017/10/28 04:53:55 riastradh Exp $	*/
+/*	$NetBSD: pcf8583.c,v 1.18 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcf8583.c,v 1.17 2017/10/28 04:53:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8583.c,v 1.18 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -109,7 +109,7 @@ pcfrtc_match(device_t parent, cfdata_t c
 	struct i2c_attach_args *ia = aux;
 
 	if ((ia->ia_addr & PCF8583_ADDRMASK) == PCF8583_ADDR)
-		return (1);
+		return (I2C_MATCH_ADDRESS_ONLY);
 
 	return (0);
 }

Index: src/sys/dev/i2c/rs5c372.c
diff -u src/sys/dev/i2c/rs5c372.c:1.14 src/sys/dev/i2c/rs5c372.c:1.15
--- src/sys/dev/i2c/rs5c372.c:1.14	Thu Nov 20 16:34:26 2014
+++ src/sys/dev/i2c/rs5c372.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rs5c372.c,v 1.14 2014/11/20 16:34:26 christos Exp $	*/
+/*	$NetBSD: rs5c372.c,v 1.15 2018/06/16 21:22:13 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2005 NONAKA Kimihiro <non...@netbsd.org>
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rs5c372.c,v 1.14 2014/11/20 16:34:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rs5c372.c,v 1.15 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -65,16 +65,15 @@ static int
 rs5c372rtc_match(device_t parent, cfdata_t cf, void *arg)
 {
 	struct i2c_attach_args *ia = arg;
+	int match_result;
+
+	if (iic_use_direct_match(ia, cf, NULL, &match_result))
+		return match_result;
+
+	/* indirect config - check typical address */
+	if (ia->ia_addr == RS5C372_ADDR)
+		return I2C_MATCH_ADDRESS_ONLY;
 
-	if (ia->ia_name) {
-		/* direct config - check name */
-		if (strcmp(ia->ia_name, "rs5c372rtc") == 0)
-			return 1;
-	} else {
-		/* indirect config - check typical address */
-		if (ia->ia_addr == RS5C372_ADDR)
-			return 1;
-	}
 	return 0;
 }
 
Index: src/sys/dev/i2c/spdmem_i2c.c
diff -u src/sys/dev/i2c/spdmem_i2c.c:1.14 src/sys/dev/i2c/spdmem_i2c.c:1.15
--- src/sys/dev/i2c/spdmem_i2c.c:1.14	Thu Mar  1 05:47:22 2018
+++ src/sys/dev/i2c/spdmem_i2c.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: spdmem_i2c.c,v 1.14 2018/03/01 05:47:22 pgoyette Exp $ */
+/* $NetBSD: spdmem_i2c.c,v 1.15 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*
  * Copyright (c) 2007 Nicolas Joly
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spdmem_i2c.c,v 1.14 2018/03/01 05:47:22 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spdmem_i2c.c,v 1.15 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -178,6 +178,15 @@ spdmem_i2c_match(device_t parent, cfdata
 	struct i2c_attach_args *ia = aux;
 	struct spdmem_i2c_softc sc;
 
+	/*
+	 * XXXJRT
+	 * Should do this with "compatible" strings.  There are also
+	 * other problems with this "match" routine.  Specifically, if
+	 * we are doing direct-config, we know the device is already
+	 * there aren't do need to probe.  I'll leave the logic for
+	 * now and let someone who knows better clean it later.
+	 */
+
 	if (ia->ia_name) {
 		/* add other names as we find more firmware variations */
 		if (strcmp(ia->ia_name, "dimm-spd") &&
@@ -201,7 +210,11 @@ spdmem_i2c_match(device_t parent, cfdata
 	if (spdmem_reset_page(&sc) != 0)
 		return 0;
 
-	return spdmem_common_probe(&sc.sc_base);
+	if (spdmem_common_probe(&sc.sc_base)) {
+		return ia->ia_name ? I2C_MATCH_DIRECT_SPECIFIC
+				   : I2C_MATCH_ADDRESS_AND_PROBE;
+	}
+	return 0;
 }
 
 static void

Index: src/sys/dev/i2c/sdtemp.c
diff -u src/sys/dev/i2c/sdtemp.c:1.33 src/sys/dev/i2c/sdtemp.c:1.34
--- src/sys/dev/i2c/sdtemp.c:1.33	Thu Feb 22 10:09:12 2018
+++ src/sys/dev/i2c/sdtemp.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*      $NetBSD: sdtemp.c,v 1.33 2018/02/22 10:09:12 msaitoh Exp $        */
+/*      $NetBSD: sdtemp.c,v 1.34 2018/06/16 21:22:13 thorpej Exp $        */
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdtemp.c,v 1.33 2018/02/22 10:09:12 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdtemp.c,v 1.34 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -240,7 +240,7 @@ sdtemp_match(device_t parent, cfdata_t c
 	if ((cap & SDTEMP_CAP_HAS_ALARM) == 0)
 		return 0;
 
-	return 1;
+	return I2C_MATCH_ADDRESS_AND_PROBE;
 }
 
 static void

Index: src/sys/dev/i2c/tps65217pmic.c
diff -u src/sys/dev/i2c/tps65217pmic.c:1.11 src/sys/dev/i2c/tps65217pmic.c:1.12
--- src/sys/dev/i2c/tps65217pmic.c:1.11	Sat Oct 15 14:40:41 2016
+++ src/sys/dev/i2c/tps65217pmic.c	Sat Jun 16 21:22:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: tps65217pmic.c,v 1.11 2016/10/15 14:40:41 kiyohara Exp $ */
+/*	$NetBSD: tps65217pmic.c,v 1.12 2018/06/16 21:22:13 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.11 2016/10/15 14:40:41 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.12 2018/06/16 21:22:13 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -280,10 +280,8 @@ tps65217pmic_match(device_t parent, cfda
 		/* we can only have one */
 		if (matched)
 			return 0;
-		else
-			matched = true;
 
-		return 1;
+		return I2C_MATCH_ADDRESS_ONLY;
 	}
 	return 0;
 }
@@ -296,6 +294,9 @@ tps65217pmic_attach(device_t parent, dev
 	prop_dictionary_t dict;
 	int isel, fdim, brightness;
 
+	/* XXXJRT But what if you have multiple i2c busses? */
+	matched = true;
+
 	sc->sc_dev = self;
 	sc->sc_addr = ia->ia_addr;
 	sc->sc_tag = ia->ia_tag;

Reply via email to