diff options
author | 2020-09-10 16:40:40 +0000 | |
---|---|---|
committer | 2020-09-10 16:40:40 +0000 | |
commit | b5cfc103a18bff689fb58913d155da55d7c9c66b (patch) | |
tree | a57fa30772200cc8e17ad78218d5c58b62049c59 | |
parent | Register octiic(4) with the I2C framework (diff) | |
download | wireguard-openbsd-b5cfc103a18bff689fb58913d155da55d7c9c66b.tar.xz wireguard-openbsd-b5cfc103a18bff689fb58913d155da55d7c9c66b.zip |
Add I2C bus scan routine for octiic(4)
Unfortunately, machines tend to come with underpopulated device trees,
and consequently this change is not very useful as is. The lack of good
data is troublesome especially with things like I2C bus switches.
-rw-r--r-- | sys/arch/octeon/dev/octiic.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/sys/arch/octeon/dev/octiic.c b/sys/arch/octeon/dev/octiic.c index 61a5de673c7..6369ee65b3d 100644 --- a/sys/arch/octeon/dev/octiic.c +++ b/sys/arch/octeon/dev/octiic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: octiic.c,v 1.2 2020/09/10 16:29:04 visa Exp $ */ +/* $OpenBSD: octiic.c,v 1.3 2020/09/10 16:40:40 visa Exp $ */ /* * Copyright (c) 2019 Visa Hankala @@ -29,6 +29,7 @@ #include <machine/fdt.h> #include <machine/octeonvar.h> +#define _I2C_PRIVATE #include <dev/i2c/i2cvar.h> #include <dev/ofw/fdt.h> @@ -190,6 +191,8 @@ octiic_attach(struct device *parent, struct device *self, void *aux) memset(&iba, 0, sizeof(iba)); iba.iba_name = "iic"; iba.iba_tag = &sc->sc_i2c_tag; + iba.iba_bus_scan = octiic_i2c_scan; + iba.iba_bus_scan_arg = sc; config_found(self, &iba, iicbus_print); sc->sc_i2c_bus.ib_node = sc->sc_node; @@ -334,6 +337,36 @@ octiic_i2c_write_byte(void *cookie, uint8_t data, int flags) return error; } +void +octiic_i2c_scan(struct device *self, struct i2cbus_attach_args *iba, void *arg) +{ + struct i2c_attach_args ia; + char name[32]; + uint32_t reg[1]; + struct octiic_softc *sc = arg; + int node; + + for (node = OF_child(sc->sc_node); node != 0; node = OF_peer(node)) { + memset(name, 0, sizeof(name)); + memset(reg, 0, sizeof(reg)); + + if (OF_getprop(node, "compatible", name, sizeof(name)) == -1) + continue; + if (name[0] == '\0') + continue; + + if (OF_getprop(node, "reg", ®, sizeof(reg)) != sizeof(reg)) + continue; + + memset(&ia, 0, sizeof(ia)); + ia.ia_tag = iba->iba_tag; + ia.ia_addr = reg[0]; + ia.ia_name = name; + ia.ia_cookie = &node; + config_found(self, &ia, iic_print); + } +} + int octiic_reg_read(struct octiic_softc *sc, uint8_t reg, uint8_t *pval) { |