Module Name: src Committed By: thorpej Date: Sun May 9 21:37:04 UTC 2021
Modified Files: src/sys/arch/macppc/conf [thorpej-i2c-spi-conf]: POWERMAC_G5 POWERMAC_G5_11_2 files.macppc src/sys/arch/macppc/dev [thorpej-i2c-spi-conf]: smu.c Removed Files: src/sys/arch/macppc/dev [thorpej-i2c-spi-conf]: smuiic.c smuiicvar.h Log Message: Adapt the smu driver to the new i2c device enumeration method. While here, collapse the "smuiic" driver into the base "smu" driver; it was superfluous given how the rest of the "smu" driver is structured. To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.49.2.1 src/sys/arch/macppc/conf/POWERMAC_G5 cvs rdiff -u -r1.20 -r1.20.6.1 src/sys/arch/macppc/conf/POWERMAC_G5_11_2 cvs rdiff -u -r1.116 -r1.116.2.1 src/sys/arch/macppc/conf/files.macppc cvs rdiff -u -r1.13 -r1.13.2.1 src/sys/arch/macppc/dev/smu.c cvs rdiff -u -r1.7 -r0 src/sys/arch/macppc/dev/smuiic.c cvs rdiff -u -r1.1 -r0 src/sys/arch/macppc/dev/smuiicvar.h 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/conf/POWERMAC_G5 diff -u src/sys/arch/macppc/conf/POWERMAC_G5:1.49 src/sys/arch/macppc/conf/POWERMAC_G5:1.49.2.1 --- src/sys/arch/macppc/conf/POWERMAC_G5:1.49 Fri Apr 2 09:27:32 2021 +++ src/sys/arch/macppc/conf/POWERMAC_G5 Sun May 9 21:37:04 2021 @@ -131,8 +131,7 @@ ibmcpc* at mainbus? uninorth* at mainbus? smu* at mainbus? #options SMU_DEBUG -smuiic* at smu? -iic* at smuiic? +iic* at smu? pci* at ibmcpc? bus ? Index: src/sys/arch/macppc/conf/POWERMAC_G5_11_2 diff -u src/sys/arch/macppc/conf/POWERMAC_G5_11_2:1.20 src/sys/arch/macppc/conf/POWERMAC_G5_11_2:1.20.6.1 --- src/sys/arch/macppc/conf/POWERMAC_G5_11_2:1.20 Tue Jul 7 02:39:59 2020 +++ src/sys/arch/macppc/conf/POWERMAC_G5_11_2 Sun May 9 21:37:04 2021 @@ -117,8 +117,7 @@ ki2c* at uni_n? # Keywest I2C smu* at mainbus? #options SMU_DEBUG -smuiic* at smu? -iic* at smuiic? +iic* at smu? pci* at ibmcpc? bus ? pci* at uninorth? bus ? Index: src/sys/arch/macppc/conf/files.macppc diff -u src/sys/arch/macppc/conf/files.macppc:1.116 src/sys/arch/macppc/conf/files.macppc:1.116.2.1 --- src/sys/arch/macppc/conf/files.macppc:1.116 Sat Apr 24 23:36:41 2021 +++ src/sys/arch/macppc/conf/files.macppc Sun May 9 21:37:04 2021 @@ -1,4 +1,4 @@ -# $NetBSD: files.macppc,v 1.116 2021/04/24 23:36:41 thorpej Exp $ +# $NetBSD: files.macppc,v 1.116.2.1 2021/05/09 21:37:04 thorpej Exp $ # # macppc-specific configuration info @@ -175,16 +175,11 @@ device zstty: tty attach zstty at zsc file dev/ic/z8530tty.c zstty needs-flag -define smu {} -device smu: smu, obio +device smu: i2cbus attach smu at mainbus file arch/macppc/dev/smu.c smu needs-flag defflag opt_smu.h SMU_DEBUG -device smuiic: i2cbus -attach smuiic at smu -file arch/macppc/dev/smuiic.c smuiic - device smusat attach smusat at iic file arch/macppc/dev/smusat.c smusat Index: src/sys/arch/macppc/dev/smu.c diff -u src/sys/arch/macppc/dev/smu.c:1.13 src/sys/arch/macppc/dev/smu.c:1.13.2.1 --- src/sys/arch/macppc/dev/smu.c:1.13 Sat Apr 24 23:36:41 2021 +++ src/sys/arch/macppc/dev/smu.c Sun May 9 21:37:04 2021 @@ -1,3 +1,5 @@ +/* $NetBSD: smu.c,v 1.13.2.1 2021/05/09 21:37:04 thorpej Exp $ */ + /*- * Copyright (c) 2013 Phileas Fogg * All rights reserved. @@ -30,6 +32,7 @@ #include <sys/malloc.h> #include <sys/device.h> #include <sys/proc.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/time.h> #include <sys/reboot.h> @@ -72,14 +75,15 @@ struct smu_fan { }; struct smu_iicbus { - struct smu_softc* sc; + struct smu_softc *sc; int reg; struct i2c_controller i2c; + + LIST_ENTRY(smu_iicbus) buslist; }; #define SMU_MAX_FANS 8 -#define SMU_MAX_IICBUS 3 #define SMU_MAX_SME_SENSORS (SMU_MAX_FANS + 8) struct smu_zone { @@ -113,8 +117,12 @@ struct smu_softc { int sc_num_fans; struct smu_fan sc_fans[SMU_MAX_FANS]; - int sc_num_iicbus; - struct smu_iicbus sc_iicbus[SMU_MAX_IICBUS]; + /* + * We provide our own i2c device enumeration method, so we + * need to provide our own devhandle_impl. + */ + struct devhandle_impl sc_devhandle_impl; + LIST_HEAD(, smu_iicbus) sc_iic_busses; struct todr_chip_handle sc_todr; @@ -158,7 +166,6 @@ static int smu_setup_doorbell(struct smu static void smu_setup_fans(struct smu_softc *); static void smu_setup_iicbus(struct smu_softc *); static void smu_setup_sme(struct smu_softc *); -static int smu_iicbus_print(void *, const char *); static void smu_sme_refresh(struct sysmon_envsys *, envsys_data_t *); static int smu_do_cmd(struct smu_softc *, struct smu_cmd *, int); static int smu_dbell_gpio_intr(void *); @@ -441,47 +448,98 @@ smu_setup_fans(struct smu_softc *sc) } } +static bool +smu_i2c_get_address(int node, uint32_t *addrp) +{ + uint32_t reg; + + if (of_getprop_uint32(node, "reg", ®) == -1) { + return false; + } + + *addrp = (reg & 0xff) >> 1; + return true; +} + +static int +smu_i2c_enumerate_devices(device_t dev, devhandle_t call_handle, void *v) +{ + /* + * This follows the OpenFirmware I2C binding for the most + * part, but has the address shifted left for the READ bit. + */ + return of_i2c_enumerate_devices_ext(dev, call_handle, v, + smu_i2c_get_address); +} + +static device_call_t +smu_devhandle_lookup_device_call(devhandle_t handle, const char *name, + devhandle_t *call_handlep) +{ + if (strcmp(name, "i2c-enumerate-devices") == 0) { + return smu_i2c_enumerate_devices; + } + + /* Defer everything else to the "super". */ + return NULL; +} + static void smu_setup_iicbus(struct smu_softc *sc) { struct smu_iicbus *iicbus; - struct i2c_controller *i2c; - struct smu_iicbus_confargs ca; + struct i2cbus_attach_args iba; + devhandle_t devhandle; int node; char name[32]; node = of_getnode_byname(sc->sc_node, "smu-i2c-control"); - if (node == 0) node = sc->sc_node; - for (node = OF_child(node); - (node != 0) && (sc->sc_num_iicbus < SMU_MAX_IICBUS); - node = OF_peer(node)) { + if (node == 0) + node = sc->sc_node; + + /* + * Set up our devhandle impl; we provide our own i2c device + * enumeration method. + */ + devhandle = devhandle_from_of(node); + devhandle_impl_inherit(&sc->sc_devhandle_impl, + devhandle.impl); + sc->sc_devhandle_impl.lookup_device_call = + smu_devhandle_lookup_device_call; + + for (node = OF_child(node); node != 0; node = OF_peer(node)) { + memset(name, 0, sizeof(name)); OF_getprop(node, "name", name, sizeof(name)); - if ((strcmp(name, "i2c-bus") != 0) && - (strcmp(name, "i2c") != 0)) + if (strcmp(name, "i2c-bus") != 0 && strcmp(name, "i2c") != 0) continue; - iicbus = &sc->sc_iicbus[sc->sc_num_iicbus]; + iicbus = kmem_zalloc(sizeof(*iicbus), KM_SLEEP); iicbus->sc = sc; - i2c = &iicbus->i2c; - if (OF_getprop(node, "reg", &iicbus->reg, sizeof(iicbus->reg)) <= 0) + if (OF_getprop(node, "reg", &iicbus->reg, + sizeof(iicbus->reg)) <= 0) { + kmem_free(iicbus, sizeof(*iicbus)); continue; + } + LIST_INSERT_HEAD(&sc->sc_iic_busses, iicbus, buslist); DPRINTF("iicbus: reg %x\n", iicbus->reg); - iic_tag_init(i2c); - i2c->ic_cookie = iicbus; - i2c->ic_exec = smu_iicbus_exec; - - ca.ca_name = name; - ca.ca_node = node; - ca.ca_tag = i2c; - config_found(sc->sc_dev, &ca, smu_iicbus_print, - CFARG_DEVHANDLE, devhandle_from_of(node), - CFARG_EOL); + iic_tag_init(&iicbus->i2c); + iicbus->i2c.ic_cookie = iicbus; + iicbus->i2c.ic_exec = smu_iicbus_exec; + + devhandle = devhandle_from_of(node); + devhandle.impl = &sc->sc_devhandle_impl; + + memset(&iba, 0, sizeof(iba)); + iba.iba_tag = &iicbus->i2c; + iba.iba_bus = iicbus->reg; - sc->sc_num_iicbus++; + config_found(sc->sc_dev, &iba, iicbus_print_multi, + CFARG_DEVHANDLE, devhandle, + CFARG_EOL); } } @@ -540,17 +598,6 @@ next: } } -static int -smu_iicbus_print(void *aux, const char *smu) -{ - struct smu_iicbus_confargs *ca = aux; - - if (smu) - aprint_normal("%s at %s", ca->ca_name, smu); - - return UNCONF; -} - static void smu_sme_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) {