Module Name:    src
Committed By:   thorpej
Date:           Mon Jun 18 17:07:07 UTC 2018

Modified Files:
        src/sys/arch/macppc/dev: deq.c smusat.c
        src/sys/arch/sparc64/dev: pcf8591_envctrl.c
        src/sys/dev/i2c: adadc.c adm1021.c adm1026.c as3722.c at24cxx.c
            axp20x.c axp22x.c dbcool.c ds1307.c dstemp.c fcu.c i2c.c i2cvar.h
            ihidev.c lm75.c lm87.c max77620.c pcf8563.c sy8106a.c tcagpio.c
            tcakp.c titemp.c tsl256x.c

Log Message:
- Rename iic_compat_match() to iic_compatible_match() and change it
  to use the new device_compatible_match() routine.  A pointer to
  the matching device_compatible_entry is returned if a match is
  found.
- Adjust iic_use_direct_match() accordingly.
- i2c drivers now provide device_compatible_entry tables when performing
  direct-config matching.
- In the dsrtc driver, take advantage of this new capability to greatly
  simplify model selection.

(I'm coming for you next, of_compat_data...)


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/macppc/dev/deq.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/macppc/dev/smusat.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sparc64/dev/pcf8591_envctrl.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/i2c/adadc.c src/sys/dev/i2c/axp22x.c \
    src/sys/dev/i2c/fcu.c src/sys/dev/i2c/max77620.c \
    src/sys/dev/i2c/tsl256x.c
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/i2c/adm1021.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/i2c/adm1026.c src/sys/dev/i2c/ihidev.c
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/i2c/as3722.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/i2c/at24cxx.c src/sys/dev/i2c/ds1307.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/i2c/axp20x.c
cvs rdiff -u -r1.49 -r1.50 src/sys/dev/i2c/dbcool.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/dstemp.c src/sys/dev/i2c/sy8106a.c \
    src/sys/dev/i2c/tcagpio.c
cvs rdiff -u -r1.62 -r1.63 src/sys/dev/i2c/i2c.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/i2c/i2cvar.h
cvs rdiff -u -r1.31 -r1.32 src/sys/dev/i2c/lm75.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/i2c/lm87.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/i2c/pcf8563.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/i2c/tcakp.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/i2c/titemp.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/macppc/dev/deq.c
diff -u src/sys/arch/macppc/dev/deq.c:1.14 src/sys/arch/macppc/dev/deq.c:1.15
--- src/sys/arch/macppc/dev/deq.c:1.14	Sat Jun 16 21:22:13 2018
+++ src/sys/arch/macppc/dev/deq.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: deq.c,v 1.14 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: deq.c,v 1.15 2018/06/18 17:07:07 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 2005 Michael Lorenz
@@ -32,7 +32,7 @@
  */
  
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: deq.c,v 1.14 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: deq.c,v 1.15 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -61,13 +61,18 @@ static const char * deq_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry deq_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(deq_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 int
 deq_match(device_t parent, struct cfdata *cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, cf, deq_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, deq_compat_data, &match_result))
 		return match_result;
 
 	/* This driver is direct-config only. */

Index: src/sys/arch/macppc/dev/smusat.c
diff -u src/sys/arch/macppc/dev/smusat.c:1.4 src/sys/arch/macppc/dev/smusat.c:1.5
--- src/sys/arch/macppc/dev/smusat.c:1.4	Sat Jun 16 21:22:13 2018
+++ src/sys/arch/macppc/dev/smusat.c	Mon Jun 18 17:07:07 2018
@@ -111,13 +111,18 @@ static const char * smusat_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry smusat_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(smusat_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 smusat_match(device_t parent, struct cfdata *cf, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, cf, smusat_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, smusat_compat_data, &match_result))
 		return match_result;
 
 	if (ia->ia_addr == 0x58)

Index: src/sys/arch/sparc64/dev/pcf8591_envctrl.c
diff -u src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.7 src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.8
--- src/sys/arch/sparc64/dev/pcf8591_envctrl.c:1.7	Sat Jun 16 21:22:13 2018
+++ src/sys/arch/sparc64/dev/pcf8591_envctrl.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8591_envctrl.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: pcf8591_envctrl.c,v 1.8 2018/06/18 17:07:07 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.7 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8591_envctrl.c,v 1.8 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -74,13 +74,18 @@ static const char * ecadc_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry ecadc_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(ecadc_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 ecadc_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, ecadc_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, ecadc_compat_data, &match_result))
 		return match_result;
 
 	/* This driver is direct-config only. */

Index: src/sys/dev/i2c/adadc.c
diff -u src/sys/dev/i2c/adadc.c:1.4 src/sys/dev/i2c/adadc.c:1.5
--- src/sys/dev/i2c/adadc.c:1.4	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/adadc.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: adadc.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: adadc.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adadc.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adadc.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -93,11 +93,16 @@ static void	adadc_sensors_refresh(struct
 CFATTACH_DECL_NEW(adadc, sizeof(struct adadc_softc),
     adadc_match, adadc_attach, NULL, NULL);
 
-static const char * dstemp_compats[] = {
+static const char * adadc_compats[] = {
 	"ad7417",
 	NULL
 };
 
+static const struct device_compatible_entry adadc_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(adadc_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 /* calibaration table from Darwin via Linux */
 static int slope[5] = {0, 0, 0x0320, 0x00a0, 0x1f40};
 
@@ -107,7 +112,7 @@ adadc_match(device_t parent, cfdata_t ma
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, dstemp_compats, &match_result))
+	if (iic_use_direct_match(ia, match, adadc_compat_data, &match_result))
 		return match_result;
 
 	/*
Index: src/sys/dev/i2c/axp22x.c
diff -u src/sys/dev/i2c/axp22x.c:1.4 src/sys/dev/i2c/axp22x.c:1.5
--- src/sys/dev/i2c/axp22x.c:1.4	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/axp22x.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axp22x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: axp22x.c,v 1.5 2018/06/18 17:07:07 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.4 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp22x.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -45,6 +45,11 @@ static const char *compatible[] = {
 	NULL
 };
 
+static const struct device_compatible_entry axp22x_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(compatible),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 #define AXP_TEMP_MON_REG	0x56	/* 2 bytes */
 
 struct axp22x_softc {
@@ -71,7 +76,7 @@ axp22x_match(device_t parent, cfdata_t m
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, compatible, &match_result))
+	if (iic_use_direct_match(ia, match, axp22x_compat_data, &match_result))
 		return match_result;
 
 	/* This device is direct-config only. */
Index: src/sys/dev/i2c/fcu.c
diff -u src/sys/dev/i2c/fcu.c:1.4 src/sys/dev/i2c/fcu.c:1.5
--- src/sys/dev/i2c/fcu.c:1.4	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/fcu.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: fcu.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: fcu.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fcu.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fcu.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -120,13 +120,18 @@ static const char * fcu_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry fcu_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(fcu_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 fcu_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, fcu_compats, &match_result))
+	if (iic_use_direct_match(ia, match, fcu_compat_data, &match_result))
 		return match_result;
 	
 	if (ia->ia_addr == 0x2f)
Index: src/sys/dev/i2c/max77620.c
diff -u src/sys/dev/i2c/max77620.c:1.4 src/sys/dev/i2c/max77620.c:1.5
--- src/sys/dev/i2c/max77620.c:1.4	Sun Jun 17 14:50:54 2018
+++ src/sys/dev/i2c/max77620.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: max77620.c,v 1.4 2018/06/17 14:50:54 thorpej Exp $ */
+/* $NetBSD: max77620.c,v 1.5 2018/06/18 17:07:07 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.4 2018/06/17 14:50:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: max77620.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -71,6 +71,11 @@ static const char * max77620_compats[] =
 	NULL
 };
 
+static const struct device_compatible_entry max77620_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(max77620_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static uint8_t
 max77620_read(struct max77620_softc *sc, uint8_t reg, int flags)
 {
@@ -260,7 +265,8 @@ max77620_match(device_t parent, cfdata_t
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, max77620_compats, &match_result))
+	if (iic_use_direct_match(ia, match, max77620_compat_data,
+				 &match_result))
 		return match_result;
 
 	return 0;
Index: src/sys/dev/i2c/tsl256x.c
diff -u src/sys/dev/i2c/tsl256x.c:1.4 src/sys/dev/i2c/tsl256x.c:1.5
--- src/sys/dev/i2c/tsl256x.c:1.4	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/tsl256x.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tsl256x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: tsl256x.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Jason R. Thorpe
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tsl256x.c,v 1.4 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tsl256x.c,v 1.5 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -84,6 +84,11 @@ static const char *tsllux_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry tsllux_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(tsllux_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int	tsllux_read1(struct tsllux_softc *, uint8_t, uint8_t *);
 static int	tsllux_read2(struct tsllux_softc *, uint8_t, uint16_t *);
 static int	tsllux_write1(struct tsllux_softc *, uint8_t, uint8_t);
@@ -112,7 +117,7 @@ tsllux_match(device_t parent, cfdata_t m
 	uint8_t id_reg;
 	int error, match_result;
 
-	if (iic_use_direct_match(ia, match, tsllux_compats, &match_result))
+	if (iic_use_direct_match(ia, match, tsllux_compat_data, &match_result))
 		return (match_result);
 
 	switch (ia->ia_addr) {

Index: src/sys/dev/i2c/adm1021.c
diff -u src/sys/dev/i2c/adm1021.c:1.17 src/sys/dev/i2c/adm1021.c:1.18
--- src/sys/dev/i2c/adm1021.c:1.17	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/adm1021.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: adm1021.c,v 1.17 2018/06/16 21:22:13 thorpej Exp $ */
+/*	$NetBSD: adm1021.c,v 1.18 2018/06/18 17:07:07 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.17 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adm1021.c,v 1.18 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -158,13 +158,18 @@ static const char * admtemp_compats[] = 
 	NULL
 };
 
+static const struct device_compatible_entry admtemp_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(admtemp_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 int
 admtemp_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, admtemp_compats, &match_result))
+	if (iic_use_direct_match(ia, match, admtemp_compat_data, &match_result))
 		return match_result;
 	
 	/*

Index: src/sys/dev/i2c/adm1026.c
diff -u src/sys/dev/i2c/adm1026.c:1.3 src/sys/dev/i2c/adm1026.c:1.4
--- src/sys/dev/i2c/adm1026.c:1.3	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/adm1026.c	Mon Jun 18 17:07:07 2018
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adm1026.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adm1026.c,v 1.4 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -127,6 +127,11 @@ static const char * adm1026_compats[] = 
 	NULL
 };
 
+static const struct device_compatible_entry adm1026_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(adm1026_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 adm1026_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -138,7 +143,7 @@ adm1026_match(device_t parent, cfdata_t 
 	sc.sc_address = ia->ia_addr;
 	sc.sc_iic_flags = 0;
 
-	if (iic_use_direct_match(ia, cf, adm1026_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, adm1026_compat_data, &match_result))
 		return match_result;
 
 	if ((ia->ia_addr & ADM1026_ADDRMASK) == ADM1026_ADDR &&
Index: src/sys/dev/i2c/ihidev.c
diff -u src/sys/dev/i2c/ihidev.c:1.3 src/sys/dev/i2c/ihidev.c:1.4
--- src/sys/dev/i2c/ihidev.c:1.3	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/ihidev.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ihidev.c,v 1.3 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: ihidev.c,v 1.4 2018/06/18 17:07:07 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.3 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.4 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -125,13 +125,18 @@ static const char *ihidev_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry ihidev_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(ihidev_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 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))
+	if (iic_use_direct_match(ia, match, ihidev_compat_data, &match_result))
 		return I2C_MATCH_DIRECT_COMPATIBLE;
 
 	return 0;

Index: src/sys/dev/i2c/as3722.c
diff -u src/sys/dev/i2c/as3722.c:1.13 src/sys/dev/i2c/as3722.c:1.14
--- src/sys/dev/i2c/as3722.c:1.13	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/as3722.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: as3722.c,v 1.13 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: as3722.c,v 1.14 2018/06/18 17:07:07 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.13 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: as3722.c,v 1.14 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -227,6 +227,11 @@ static const char * as3722_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry as3722_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(as3722_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 as3722_match(device_t parent, cfdata_t match, void *aux)
 {
@@ -234,7 +239,7 @@ as3722_match(device_t parent, cfdata_t m
 	uint8_t reg, id1;
 	int error, match_result;
 
-	if (iic_use_direct_match(ia, match, as3722_compats, &match_result))
+	if (iic_use_direct_match(ia, match, as3722_compat_data, &match_result))
 		return match_result;
 	
 	if (ia->ia_addr != AS3722_I2C_ADDR)

Index: src/sys/dev/i2c/at24cxx.c
diff -u src/sys/dev/i2c/at24cxx.c:1.26 src/sys/dev/i2c/at24cxx.c:1.27
--- src/sys/dev/i2c/at24cxx.c:1.26	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/at24cxx.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: at24cxx.c,v 1.26 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: at24cxx.c,v 1.27 2018/06/18 17:07:07 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at24cxx.c,v 1.26 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at24cxx.c,v 1.27 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -127,13 +127,18 @@ static const struct seeprom_size {
 	{ "atmel,24c16", 2048 },
 };
 
+static const struct device_compatible_entry seeprom_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(seeprom_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 seeprom_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, seeprom_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, seeprom_compat_data, &match_result))
 		return match_result;
 
 	if ((ia->ia_addr & AT24CXX_ADDRMASK) == AT24CXX_ADDR)
Index: src/sys/dev/i2c/ds1307.c
diff -u src/sys/dev/i2c/ds1307.c:1.26 src/sys/dev/i2c/ds1307.c:1.27
--- src/sys/dev/i2c/ds1307.c:1.26	Sat Jun 16 21:28:07 2018
+++ src/sys/dev/i2c/ds1307.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ds1307.c,v 1.26 2018/06/16 21:28:07 thorpej Exp $	*/
+/*	$NetBSD: ds1307.c,v 1.27 2018/06/18 17:07:07 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ds1307.c,v 1.26 2018/06/16 21:28:07 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ds1307.c,v 1.27 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -56,7 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: ds1307.c,v 1
 #include "ioconf.h"
 
 struct dsrtc_model {
-	const char **dm_compats;
 	const i2c_addr_t *dm_valid_addrs;
 	uint16_t dm_model;
 	uint8_t dm_ch_reg;
@@ -77,92 +76,102 @@ struct dsrtc_model {
 };
 
 static const char *ds1307_compats[] = { "dallas,ds1307", "maxim,ds1307", NULL };
+static const i2c_addr_t ds1307_valid_addrs[] = { DS1307_ADDR, 0 };
+static const struct dsrtc_model ds1307_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 1307,
+	.dm_ch_reg = DSXXXX_SECONDS,
+	.dm_ch_value = DS1307_SECONDS_CH,
+	.dm_rtc_start = DS1307_RTC_START,
+	.dm_rtc_size = DS1307_RTC_SIZE,
+	.dm_nvram_start = DS1307_NVRAM_START,
+	.dm_nvram_size = DS1307_NVRAM_SIZE,
+	.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_CLOCK_HOLD,
+};
+
 static const char *ds1339_compats[] = { "dallas,ds1339", "maxim,ds1339", NULL };
+static const struct dsrtc_model ds1339_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 1339,
+	.dm_rtc_start = DS1339_RTC_START,
+	.dm_rtc_size = DS1339_RTC_SIZE,
+	.dm_flags = DSRTC_FLAG_BCD,
+};
+
 static const char *ds1340_compats[] = { "dallas,ds1340", "maxim,ds1340", NULL };
+static const struct dsrtc_model ds1340_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 1340,
+	.dm_ch_reg = DSXXXX_SECONDS,
+	.dm_ch_value = DS1340_SECONDS_EOSC,
+	.dm_rtc_start = DS1340_RTC_START,
+	.dm_rtc_size = DS1340_RTC_SIZE,
+	.dm_flags = DSRTC_FLAG_BCD,
+};
+
 static const char *ds1672_compats[] = { "dallas,ds1672", "maxim,ds1672", NULL };
+static const struct dsrtc_model ds1672_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 1672,
+	.dm_rtc_start = DS1672_RTC_START,
+	.dm_rtc_size = DS1672_RTC_SIZE,
+	.dm_ch_reg = DS1672_CONTROL,
+	.dm_ch_value = DS1672_CONTROL_CH,
+	.dm_flags = 0,
+};
+
 static const char *ds3231_compats[] = { "dallas,ds3231", "maxim,ds3231", NULL };
+static const struct dsrtc_model ds3231_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 3231,
+	.dm_rtc_start = DS3232_RTC_START,
+	.dm_rtc_size = DS3232_RTC_SIZE,
+	.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_TEMP,
+};
+
 static const char *ds3232_compats[] = { "dallas,ds3232", "maxim,ds3232", NULL };
+static const struct dsrtc_model ds3232_model = {
+	.dm_valid_addrs = ds1307_valid_addrs,
+	.dm_model = 3232,
+	.dm_rtc_start = DS3232_RTC_START,
+	.dm_rtc_size = DS3232_RTC_SIZE,
+	.dm_nvram_start = DS3232_NVRAM_START,
+	.dm_nvram_size = DS3232_NVRAM_SIZE,
+	/*
+	 * XXX
+	 * the DS3232 likely has the temperature sensor too but I can't
+	 * easily verify or test that right now
+	 */
+	.dm_flags = DSRTC_FLAG_BCD,
+};
 
 				/* XXX vendor prefix */
 static const char *mcp7940_compats[] = { "microchip,mcp7940", NULL };
-
-static const i2c_addr_t ds1307_valid_addrs[] = { DS1307_ADDR, 0 };
 static const i2c_addr_t mcp7940_valid_addrs[] = { MCP7940_ADDR, 0 };
+static const struct dsrtc_model mcp7940_model = {
+	.dm_valid_addrs = mcp7940_valid_addrs,
+	.dm_model = 7940,
+	.dm_rtc_start = DS1307_RTC_START,
+	.dm_rtc_size = DS1307_RTC_SIZE,
+	.dm_ch_reg = DSXXXX_SECONDS,
+	.dm_ch_value = DS1307_SECONDS_CH,
+	.dm_vbaten_reg = DSXXXX_DAY,
+	.dm_vbaten_value = MCP7940_TOD_DAY_VBATEN,
+	.dm_nvram_start = MCP7940_NVRAM_START,
+	.dm_nvram_size = MCP7940_NVRAM_SIZE,
+	.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_CLOCK_HOLD |
+		DSRTC_FLAG_VBATEN | DSRTC_FLAG_CLOCK_HOLD_REVERSED,
+};
 
-static const struct dsrtc_model dsrtc_models[] = {
-	{
-		.dm_compats = ds1307_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 1307,
-		.dm_ch_reg = DSXXXX_SECONDS,
-		.dm_ch_value = DS1307_SECONDS_CH,
-		.dm_rtc_start = DS1307_RTC_START,
-		.dm_rtc_size = DS1307_RTC_SIZE,
-		.dm_nvram_start = DS1307_NVRAM_START,
-		.dm_nvram_size = DS1307_NVRAM_SIZE,
-		.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_CLOCK_HOLD,
-	}, {
-		.dm_compats = ds1339_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 1339,
-		.dm_rtc_start = DS1339_RTC_START,
-		.dm_rtc_size = DS1339_RTC_SIZE,
-		.dm_flags = DSRTC_FLAG_BCD,
-	}, {
-		.dm_compats = ds1340_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 1340,
-		.dm_ch_reg = DSXXXX_SECONDS,
-		.dm_ch_value = DS1340_SECONDS_EOSC,
-		.dm_rtc_start = DS1340_RTC_START,
-		.dm_rtc_size = DS1340_RTC_SIZE,
-		.dm_flags = DSRTC_FLAG_BCD,
-	}, {
-		.dm_compats = ds1672_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 1672,
-		.dm_rtc_start = DS1672_RTC_START,
-		.dm_rtc_size = DS1672_RTC_SIZE,
-		.dm_ch_reg = DS1672_CONTROL,
-		.dm_ch_value = DS1672_CONTROL_CH,
-		.dm_flags = 0,
-	}, {
-		.dm_compats = ds3231_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 3231,
-		.dm_rtc_start = DS3232_RTC_START,
-		.dm_rtc_size = DS3232_RTC_SIZE,
-		/*
-		 * XXX
-		 * the DS3232 likely has the temperature sensor too but I can't
-		 * easily verify or test that right now
-		 */
-		.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_TEMP,
-	}, {
-		.dm_compats = ds3232_compats,
-		.dm_valid_addrs = ds1307_valid_addrs,
-		.dm_model = 3232,
-		.dm_rtc_start = DS3232_RTC_START,
-		.dm_rtc_size = DS3232_RTC_SIZE,
-		.dm_nvram_start = DS3232_NVRAM_START,
-		.dm_nvram_size = DS3232_NVRAM_SIZE,
-		.dm_flags = DSRTC_FLAG_BCD,
-	}, {
-		/* MCP7940 */
-		.dm_compats = mcp7940_compats,
-		.dm_valid_addrs = mcp7940_valid_addrs,
-		.dm_model = 7940,
-		.dm_rtc_start = DS1307_RTC_START,
-		.dm_rtc_size = DS1307_RTC_SIZE,
-		.dm_ch_reg = DSXXXX_SECONDS,
-		.dm_ch_value = DS1307_SECONDS_CH,
-		.dm_vbaten_reg = DSXXXX_DAY,
-		.dm_vbaten_value = MCP7940_TOD_DAY_VBATEN,
-		.dm_nvram_start = MCP7940_NVRAM_START,
-		.dm_nvram_size = MCP7940_NVRAM_SIZE,
-		.dm_flags = DSRTC_FLAG_BCD | DSRTC_FLAG_CLOCK_HOLD |
-			DSRTC_FLAG_VBATEN | DSRTC_FLAG_CLOCK_HOLD_REVERSED,
-	},
+static const struct device_compatible_entry dsrtc_compat_data[] = {
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds1307_compats,  &ds1307_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds1339_compats,  &ds1339_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds1340_compats,  &ds1340_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds1672_compats,  &ds1672_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds3231_compats,  &ds3231_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(ds3232_compats,  &ds3232_model),
+	DEVICE_COMPAT_ENTRY_WITH_DATA(mcp7940_compats, &mcp7940_model),
+	DEVICE_COMPAT_TERMINATOR
 };
 
 struct dsrtc_softc {
@@ -218,12 +227,16 @@ static void dsrtc_refresh(struct sysmon_
 static const struct dsrtc_model *
 dsrtc_model_by_number(u_int model)
 {
-	/* no model given, assume it's a DS1307 (the first one) */
+	const struct device_compatible_entry *dce;
+	const struct dsrtc_model *dm;
+
+	/* no model given, assume it's a DS1307 */
 	if (model == 0)
-		return &dsrtc_models[0];
+		return &ds1307_model;
 
-	for (const struct dsrtc_model *dm = dsrtc_models;
-	     dm < dsrtc_models + __arraycount(dsrtc_models); dm++) {
+	for (dce = dsrtc_compat_data;
+	     DEVICE_COMPAT_ENTRY_IS_TERMINATOR(dce) == false; dce++) {
+		dm = DEVICE_COMPAT_ENTRY_GET_PTR(dce);
 		if (dm->dm_model == model)
 			return dm;
 	}
@@ -233,38 +246,14 @@ dsrtc_model_by_number(u_int model)
 static const struct dsrtc_model *
 dsrtc_model_by_compat(const struct i2c_attach_args *ia)
 {
-	const struct dsrtc_model *best_model = NULL, *dm;
-	int best_match = 0, match_result;
-
-	for (dm = dsrtc_models;
-	     dm < dsrtc_models + __arraycount(dsrtc_models); dm++) {
-		match_result = iic_compat_match(ia, dm->dm_compats);
-		if (match_result > best_match) {
-			best_match = match_result;
-			best_model = dm;
-		}
-	}
-	return best_model;
-}
-
-static bool
-dsrtc_direct_match(const struct i2c_attach_args *ia, const cfdata_t cf,
-		   int *best_matchp)
-{
-	const struct dsrtc_model *dm;
-	int best_match = 0, match_result;
+	const struct dsrtc_model *dm = NULL;
+	const struct device_compatible_entry *dce;
 
-	for (dm = dsrtc_models;
-	     dm < dsrtc_models + __arraycount(dsrtc_models); dm++) {
-		if (iic_use_direct_match(ia, cf, dm->dm_compats,
-					 &match_result) == false)
-			return false;
-		if (match_result > best_match)
-			best_match = match_result;
-	}
+	dce = iic_compatible_match(ia, dsrtc_compat_data, NULL);
+	if (dce != NULL)
+		dm = DEVICE_COMPAT_ENTRY_GET_PTR(dce);
 
-	*best_matchp = best_match;
-	return true;
+	return dm;
 }
 
 static bool
@@ -285,7 +274,7 @@ dsrtc_match(device_t parent, cfdata_t cf
 	const struct dsrtc_model *dm;
 	int match_result;
 
-	if (dsrtc_direct_match(ia, cf, &match_result))
+	if (iic_use_direct_match(ia, cf, dsrtc_compat_data, &match_result))
 		return match_result;
 
 	dm = dsrtc_model_by_number(cf->cf_flags & 0xffff);

Index: src/sys/dev/i2c/axp20x.c
diff -u src/sys/dev/i2c/axp20x.c:1.11 src/sys/dev/i2c/axp20x.c:1.12
--- src/sys/dev/i2c/axp20x.c:1.11	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/axp20x.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: axp20x.c,v 1.11 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: axp20x.c,v 1.12 2018/06/18 17:07:07 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.11 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp20x.c,v 1.12 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -219,13 +219,18 @@ static const char * compatible[] = {
 	NULL
 };
 
+static const struct device_compatible_entry axp20x_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(compatible),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 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))
+	if (iic_use_direct_match(ia, match, axp20x_compat_data, &match_result))
 		return match_result;
 
 	/* This device is direct-config only. */

Index: src/sys/dev/i2c/dbcool.c
diff -u src/sys/dev/i2c/dbcool.c:1.49 src/sys/dev/i2c/dbcool.c:1.50
--- src/sys/dev/i2c/dbcool.c:1.49	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/dbcool.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: dbcool.c,v 1.49 2018/06/16 21:22:13 thorpej Exp $ */
+/*	$NetBSD: dbcool.c,v 1.50 2018/06/18 17:07:07 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.49 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dbcool.c,v 1.50 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -738,6 +738,12 @@ static const char * dbcool_compats[] = {
 	"adm1030",
 	NULL
 };
+
+static const struct device_compatible_entry dbcool_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(dbcool_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 int
 dbcool_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -750,7 +756,7 @@ dbcool_match(device_t parent, cfdata_t c
 	dc.dc_writereg = dbcool_writereg;
 	int match_result;
 
-	if (iic_use_direct_match(ia, cf, dbcool_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, dbcool_compat_data, &match_result))
 		return match_result;
 
 	if ((ia->ia_addr & DBCOOL_ADDRMASK) != DBCOOL_ADDR)

Index: src/sys/dev/i2c/dstemp.c
diff -u src/sys/dev/i2c/dstemp.c:1.2 src/sys/dev/i2c/dstemp.c:1.3
--- src/sys/dev/i2c/dstemp.c:1.2	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/dstemp.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: dstemp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: dstemp.c,v 1.3 2018/06/18 17:07:07 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2018 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dstemp.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dstemp.c,v 1.3 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -77,13 +77,18 @@ static const char * dstemp_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry dstemp_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(dstemp_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 dstemp_match(device_t parent, cfdata_t match, void *aux)
 {
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, dstemp_compats, &match_result))
+	if (iic_use_direct_match(ia, match, dstemp_compat_data, &match_result))
 		return match_result;
 	
 	if ((ia->ia_addr & 0xf8) == 0x48)
Index: src/sys/dev/i2c/sy8106a.c
diff -u src/sys/dev/i2c/sy8106a.c:1.2 src/sys/dev/i2c/sy8106a.c:1.3
--- src/sys/dev/i2c/sy8106a.c:1.2	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/sy8106a.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: sy8106a.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: sy8106a.c,v 1.3 2018/06/18 17:07:07 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.2 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sy8106a.c,v 1.3 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -64,6 +64,11 @@ static const char * compatible[] = {
 	NULL
 };
 
+static const struct device_compatible_entry sy8106a_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(compatible),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static uint8_t
 sy8106a_read(struct sy8106a_softc *sc, uint8_t reg, int flags)
 {
@@ -187,7 +192,7 @@ sy8106a_match(device_t parent, cfdata_t 
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, compatible, &match_result))
+	if (iic_use_direct_match(ia, match, sy8106a_compat_data, &match_result))
 		return match_result;
 	
 	return 0;
Index: src/sys/dev/i2c/tcagpio.c
diff -u src/sys/dev/i2c/tcagpio.c:1.2 src/sys/dev/i2c/tcagpio.c:1.3
--- src/sys/dev/i2c/tcagpio.c:1.2	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/tcagpio.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tcagpio.c,v 1.2 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: tcagpio.c,v 1.3 2018/06/18 17:07:07 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.2 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcagpio.c,v 1.3 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -73,6 +73,11 @@ static const char * compatible[] = {
 	NULL
 };
 
+static const struct device_compatible_entry tcagpio_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(compatible),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static uint8_t
 tcagpio_read(struct tcagpio_softc *sc, uint8_t reg, int flags)
 {
@@ -248,7 +253,7 @@ tcagpio_match(device_t parent, cfdata_t 
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, compatible, &match_result))
+	if (iic_use_direct_match(ia, match, tcagpio_compat_data, &match_result))
 		return match_result;
 
 	return 0;

Index: src/sys/dev/i2c/i2c.c
diff -u src/sys/dev/i2c/i2c.c:1.62 src/sys/dev/i2c/i2c.c:1.63
--- src/sys/dev/i2c/i2c.c:1.62	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/i2c.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2c.c,v 1.62 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: i2c.c,v 1.63 2018/06/18 17:07:07 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.62 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i2c.c,v 1.63 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -691,41 +691,39 @@ iic_fill_compat(struct i2c_attach_args *
 }
 
 /*
- * iic_compat_match --
+ * iic_compatible_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.
+ *	of compatible strings provided by the driver.
  */
-int
-iic_compat_match(const struct i2c_attach_args *ia, const char **compats)
-{
-	int match_result = 0, i, ri;
-
-	if (ia->ia_ncompat == 0 || ia->ia_compat == NULL)
-		return 0;
-
-	for (; compats && *compats; compats++) {
-		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;
-			}
-		}
+const struct device_compatible_entry *
+iic_compatible_match(const struct i2c_attach_args *ia,
+		     const struct device_compatible_entry *compats,
+		     int *match_resultp)
+{
+	const struct device_compatible_entry *dce;
+	int match_weight;
+
+	dce = device_compatible_match(ia->ia_compat, ia->ia_ncompat,
+				      compats, &match_weight);
+	if (dce != NULL && match_resultp != NULL) {
+		*match_resultp = MIN(I2C_MATCH_DIRECT_COMPATIBLE + match_weight,
+				     I2C_MATCH_DIRECT_COMPATIBLE_MAX);
 	}
-	match_result = MIN(match_result, I2C_MATCH_DIRECT_COMPATIBLE_MAX);
-	return match_result;
+
+	return dce;
 }
 
+/*
+ * iic_use_direct_match --
+ *	Helper for direct-config of i2c.  Returns true if this is
+ *	a direct-config situation, along with with match result.
+ *	Returns false if the driver should use indirect-config
+ *	matching logic.
+ */
 bool
 iic_use_direct_match(const struct i2c_attach_args *ia, const cfdata_t cf,
-		     const char **compats, int *match_resultp)
+		     const struct device_compatible_entry *compats,
+		     int *match_resultp)
 {
 
 	KASSERT(match_resultp != NULL);
@@ -737,7 +735,7 @@ iic_use_direct_match(const struct i2c_at
 	}
 
 	if (ia->ia_ncompat > 0 && ia->ia_compat != NULL) {
-		*match_resultp = iic_compat_match(ia, compats);
+		(void) iic_compatible_match(ia, compats, match_resultp);
 		return true;
 	}
 

Index: src/sys/dev/i2c/i2cvar.h
diff -u src/sys/dev/i2c/i2cvar.h:1.14 src/sys/dev/i2c/i2cvar.h:1.15
--- src/sys/dev/i2c/i2cvar.h:1.14	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/i2cvar.h	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: i2cvar.h,v 1.14 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: i2cvar.h,v 1.15 2018/06/18 17:07:07 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -164,9 +164,11 @@ int	iicbus_print(void *, 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 *);
+const struct device_compatible_entry *
+	iic_compatible_match(const struct i2c_attach_args *,
+			     const struct device_compatible_entry *, int *);
+bool	iic_use_direct_match(const struct i2c_attach_args *, const cfdata_t,
+			     const struct device_compatible_entry *, int *);
 
 /*
  * Constants to indicate the quality of a match made by a driver's

Index: src/sys/dev/i2c/lm75.c
diff -u src/sys/dev/i2c/lm75.c:1.31 src/sys/dev/i2c/lm75.c:1.32
--- src/sys/dev/i2c/lm75.c:1.31	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/lm75.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: lm75.c,v 1.31 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: lm75.c,v 1.32 2018/06/18 17:07:07 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.31 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm75.c,v 1.32 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -111,6 +111,11 @@ static const char * lmtemp_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry lmtemp_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(lmtemp_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 enum {
 	lmtemp_lm75 = 0,
 	lmtemp_ds75,
@@ -148,7 +153,7 @@ lmtemp_match(device_t parent, cfdata_t c
 	struct i2c_attach_args *ia = aux;
 	int i, match_result;
 
-	if (iic_use_direct_match(ia, cf, lmtemp_compats, &match_result))
+	if (iic_use_direct_match(ia, cf, lmtemp_compat_data, &match_result))
 		return match_result;
 
 	/*

Index: src/sys/dev/i2c/lm87.c
diff -u src/sys/dev/i2c/lm87.c:1.8 src/sys/dev/i2c/lm87.c:1.9
--- src/sys/dev/i2c/lm87.c:1.8	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/lm87.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: lm87.c,v 1.8 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: lm87.c,v 1.9 2018/06/18 17:07:07 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.8 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lm87.c,v 1.9 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -144,6 +144,11 @@ static const char * lmenv_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry lmenv_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(lmenv_compats),
+	DEVICE_COMPAT_TERMINATOR,
+};
+
 int
 lmenv_match(device_t parent, cfdata_t match, void *aux)
 {
@@ -151,7 +156,7 @@ lmenv_match(device_t parent, cfdata_t ma
 	u_int8_t cmd, val;
 	int error, i, match_result;
 
-	if (iic_use_direct_match(ia, match, lmenv_compats, &match_result))
+	if (iic_use_direct_match(ia, match, lmenv_compat_data, &match_result))
 		return match_result;
 	
 	/*

Index: src/sys/dev/i2c/pcf8563.c
diff -u src/sys/dev/i2c/pcf8563.c:1.9 src/sys/dev/i2c/pcf8563.c:1.10
--- src/sys/dev/i2c/pcf8563.c:1.9	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/pcf8563.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pcf8563.c,v 1.9 2018/06/16 21:22:13 thorpej Exp $	*/
+/*	$NetBSD: pcf8563.c,v 1.10 2018/06/18 17:07:07 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.9 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8563.c,v 1.10 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -54,6 +54,11 @@ static const char *compatible[] = {
 	NULL
 };
 
+static const struct device_compatible_entry pcf8563rtc_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(compatible),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 struct pcf8563rtc_softc {
 	device_t sc_dev;
 	i2c_tag_t sc_tag;
@@ -78,7 +83,7 @@ pcf8563rtc_match(device_t parent, cfdata
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, cf, compatible, &match_result))
+	if (iic_use_direct_match(ia, cf, pcf8563rtc_compat_data, &match_result))
 		return match_result;
 
 	/* indirect config - check typical address */

Index: src/sys/dev/i2c/tcakp.c
diff -u src/sys/dev/i2c/tcakp.c:1.7 src/sys/dev/i2c/tcakp.c:1.8
--- src/sys/dev/i2c/tcakp.c:1.7	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/tcakp.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tcakp.c,v 1.7 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: tcakp.c,v 1.8 2018/06/18 17:07:07 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.7 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcakp.c,v 1.8 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -118,6 +118,11 @@ static const char * tcakp_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry tcakp_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(tcakp_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static u_int
 tcakp_decode(struct tcakp_softc *sc, uint8_t code)
 {
@@ -318,7 +323,7 @@ tcakp_match(device_t parent, cfdata_t ma
 	struct i2c_attach_args *ia = aux;
 	int match_result;
 
-	if (iic_use_direct_match(ia, match, tcakp_compats, &match_result))
+	if (iic_use_direct_match(ia, match, tcakp_compat_data, &match_result))
 		return match_result;
 
 	if (ia->ia_addr == 0x34)

Index: src/sys/dev/i2c/titemp.c
diff -u src/sys/dev/i2c/titemp.c:1.5 src/sys/dev/i2c/titemp.c:1.6
--- src/sys/dev/i2c/titemp.c:1.5	Sat Jun 16 21:22:13 2018
+++ src/sys/dev/i2c/titemp.c	Mon Jun 18 17:07:07 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: titemp.c,v 1.5 2018/06/16 21:22:13 thorpej Exp $ */
+/* $NetBSD: titemp.c,v 1.6 2018/06/18 17:07:07 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.5 2018/06/16 21:22:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: titemp.c,v 1.6 2018/06/18 17:07:07 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -89,6 +89,11 @@ static const char * titemp_compats[] = {
 	NULL
 };
 
+static const struct device_compatible_entry titemp_compat_data[] = {
+	DEVICE_COMPAT_ENTRY(titemp_compats),
+	DEVICE_COMPAT_TERMINATOR
+};
+
 static int
 titemp_match(device_t parent, cfdata_t match, void *aux)
 {
@@ -96,7 +101,7 @@ titemp_match(device_t parent, cfdata_t m
 	uint8_t mfid;
 	int error, match_result;
 
-	if (iic_use_direct_match(ia, match, titemp_compats, &match_result))
+	if (iic_use_direct_match(ia, match, titemp_compat_data, &match_result))
 		return match_result;
 	
 	if (ia->ia_addr != 0x4c)

Reply via email to