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.
This commit is contained in:
thorpej 2018-06-16 21:22:13 +00:00
parent b3019d4b3d
commit aa41e9922c
60 changed files with 571 additions and 538 deletions

View File

@ -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, void *aux)
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

View File

@ -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 match, void *aux)
!platid_match(&platid, &platid_mask_MACH_PSIONTEKLOGIX_NETBOOK_PRO))
return 0;
return 1;
return I2C_MATCH_ADDRESS_AND_PROBE;
}
/* ARGSUSED */

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 match, void *aux)
*/
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

View File

@ -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;
}

View File

@ -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, int reg, int val)
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;
}

View File

@ -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, int reg, int val)
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;
}

View File

@ -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 <jmcneill@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 ac100_softc),
static int
ac100_match(device_t parent, cfdata_t match, void *aux)
{
return 1;
return I2C_MATCH_ADDRESS_ONLY; /* XXX */
}
static void

View File

@ -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 <jmcneill@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 match, void *aux)
struct i2c_attach_args *ia = aux;
if (ia->ia_addr == 0x5a)
return 1;
return I2C_MATCH_ADDRESS_ONLY;
return 0;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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 cf, void *aux)
{
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;
}

View File

@ -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 <brad@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 addr, const char *name, bool debug)
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;
}
/* indirect config - check for standard address */
if (ia->ia_addr == AM2315_TYPICAL_ADDR)
return I2C_MATCH_ADDRESS_ONLY;
/*
* 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;
}
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

View File

@ -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 <jmcneill@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.12 2017/05/28 15:55:11 jmcneill Exp $")
#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 match, void *aux)
{
struct i2c_attach_args *ia = aux;
uint8_t reg, id1;
int error;
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 (error == 0 && id1 == 0x0c)
return 1;
int error, match_result;
if (iic_use_direct_match(ia, match, as3722_compats, &match_result))
return match_result;
if (ia->ia_addr != AS3722_I2C_ADDR)
return 0;
} else {
return iic_compat_match(ia, as3722_compats);
}
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 I2C_MATCH_ADDRESS_AND_PROBE;
return 0;
}
static void

View File

@ -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

View File

@ -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 <jmcneill@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.10 2017/10/22 11:00:28 jmcneill Exp $")
#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 (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

View File

@ -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 <jmcneill@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

View File

@ -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 <jmcneill@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(struct axp809_softc),
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

View File

@ -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 <jmcneill@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 match, void *aux)
{
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

View File

@ -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 cf, void *aux)
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;
}

View File

@ -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, void *aux)
struct i2c_attach_args *ia = aux;
if (ia->ia_addr == DDC_ADDR)
return 1;
return I2C_MATCH_ADDRESS_ONLY;
return 0;
}

View File

@ -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

View File

@ -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_t cf, void *aux)
if (error)
return 0;
return 1;
return I2C_MATCH_ADDRESS_AND_PROBE;
}

View File

@ -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

View File

@ -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 cfdata* cf, void* arg)
/*
* TODO: set up minimal speed?
*/
return 1;
return I2C_MATCH_ADDRESS_ONLY;
}
return 0;

View File

@ -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 *pnp)
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 self, void *aux)
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 self, void *aux)
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, const char *compat, size_t len,
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

View File

@ -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_args*, const char **);
#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
/*

View File

@ -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 match, void *aux)
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

View File

@ -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;
}

View File

@ -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;
int i, match_result;
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;
if (iic_use_direct_match(ia, cf, lmtemp_compats, &match_result))
return 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;
}
}
/*
* 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;
}

View File

@ -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 match, void *aux)
{
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;
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);
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;
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;
}
}
for (i = 0; lmenv_ids[i].id != 0; i++)
if (lmenv_ids[i].id == val)
return I2C_MATCH_ADDRESS_AND_PROBE;
return 0;
}

View File

@ -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 match, void *aux)
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 match, void *aux)
sc.sc_addr = ia->ia_addr;
rv = lm_match(&sc.sc_lmsc);
return rv;
return rv ? I2C_MATCH_ADDRESS_AND_PROBE : 0;
}

View File

@ -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;
}

View File

@ -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 cf, void *aux)
struct i2c_attach_args *ia = aux;
if (ia->ia_addr == M41T00_ADDR) {
return 1;
return I2C_MATCH_ADDRESS_ONLY;
}
return 0;

View File

@ -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 cf, void *aux)
struct i2c_attach_args *ia = aux;
if ((ia->ia_addr & MAX6900_ADDRMASK) == MAX6900_ADDR)
return (1);
return (I2C_MATCH_ADDRESS_ONLY);
return (0);
}

View File

@ -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 <jmcneill@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

View File

@ -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 (struct mcp980x_softc),
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

View File

@ -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 cf, void *aux)
struct i2c_attach_args *ia = aux;
if (ia->ia_addr == MPL115A_ADDR)
return 1;
return I2C_MATCH_ADDRESS_ONLY;
return 0;
}

View File

@ -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;
}

View File

@ -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 cf, void *aux)
struct i2c_attach_args *ia = aux;
if ((ia->ia_addr & PCF8583_ADDRMASK) == PCF8583_ADDR)
return (1);
return (I2C_MATCH_ADDRESS_ONLY);
return (0);
}

View File

@ -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 cf, void *arg)
/* match only R2025 RTC devices */
if (ia->ia_addr == R2025_ADDR)
return 1;
return I2C_MATCH_ADDRESS_ONLY;
return 0;
}

View File

@ -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 <nonaka@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;
}

View File

@ -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;
}

View File

@ -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 cf, void *aux)
if ((cap & SDTEMP_CAP_HAS_ALARM) == 0)
return 0;
return 1;
return I2C_MATCH_ADDRESS_AND_PROBE;
}
static void

View File

@ -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 cf, void *aux)
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

View File

@ -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 <brad@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 match, void *aux)
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

View File

@ -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 match, void *aux)
}
iic_release_bus(ia->ia_tag, 0);
return 1;
return I2C_MATCH_ADDRESS_AND_PROBE;
}
static void

View File

@ -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_t match, void *aux)
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_t match, void *aux)
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

View File

@ -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 <jmcneill@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

View File

@ -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 <jmcneill@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

View File

@ -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 <jmcneill@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

View File

@ -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 <jmcneill@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 match, void *aux)
{
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_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 (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

View File

@ -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, cfdata_t cf, void *aux)
/* 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, device_t self, void *aux)
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;

View File

@ -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 <jmcneill@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 match, void *aux)
case TPS65950_ADDR_ID3:
case TPS65950_ADDR_ID4:
case TPS65950_ADDR_ID5:
return 1;
return I2C_MATCH_ADDRESS_ONLY;
default:
return 0;
}

View File

@ -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 match, void *aux)
{
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);
if (error)
return (0);
/*
* XXX This loses if we have a 2560 rev. 0.
*/
if (id_reg == 0)
return (0);
return (1);
} else {
return iic_compat_match(ia, tsllux_compats);
default:
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);
if (error)
return (0);
/* 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

View File

@ -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 match, void *aux)
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;
}

View File

@ -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, void *arg)
/* match only this RTC devices */
if (ia->ia_addr == X1226_ADDR)
return (1);
return (I2C_MATCH_ADDRESS_ONLY);
return (0);
}