This diff changes the i2c bus walking code such that we try to
configure all children of the i2c controller as devices.  This is
necessary to attach bgw(4) for example.

The diff deliberately marks the node as attached even if we don't have
a matching driver to prevent the unconfigured entryq from showing up
twice.

ok?

dwiic0 at acpi0: I2C7 addr 0x91927000/0x1000 irq 38
iic0 at dwiic0
"INT33F4" at iic0 addr 0x34 not configured
dwiic1 at acpi0: I2C1 addr 0x91933000/0x1000 irq 32
iic1 at dwiic1
"OVTI5670" at iic1 addr 0xc not configured
"OVTI2680" at iic1 addr 0x10 not configured
dwiic2 at acpi0: I2C2 addr 0x91931000/0x1000 irq 33
iic2 at dwiic2
"10EC5645" at iic2 addr 0x1a not configured
dwiic3 at acpi0: I2C3 addr 0x9192f000/0x1000 irq 34
iic3 at dwiic3
bgw0 at iic3 addr 0x18: BMA250E


Index: dwiic_acpi.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/dwiic_acpi.c,v
retrieving revision 1.1
diff -u -p -r1.1 dwiic_acpi.c
--- dwiic_acpi.c        16 Nov 2017 18:12:27 -0000      1.1
+++ dwiic_acpi.c        30 Nov 2017 01:54:20 -0000
@@ -359,6 +359,11 @@ dwiic_acpi_found_hid(struct aml_node *no
        struct aml_value res;
        int64_t sta;
        char cdev[16], dev[16];
+       struct i2c_attach_args ia;
+
+       /* Skip our own _HID. */
+       if (node->parent == sc->sc_devnode)
+               return 0;
 
        if (acpi_parsehid(node, arg, cdev, dev, 16) != 0)
                return 0;
@@ -394,6 +399,14 @@ dwiic_acpi_found_hid(struct aml_node *no
                return dwiic_acpi_found_ihidev(sc, node, dev, crs);
        else if (dwiic_matchhids(dev, iatp_hids))
                return dwiic_acpi_found_iatp(sc, node, dev, crs);
+
+       memset(&ia, 0, sizeof(ia));
+       ia.ia_tag = sc->sc_iba.iba_tag;
+       ia.ia_name = dev;
+       ia.ia_addr = crs.i2c_addr;
+
+       config_found(sc->sc_iic, &ia, dwiic_i2c_print);
+       node->parent->attached = 1;
 
        return 0;
 }

Reply via email to