Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/thorpej-i2c-spi-conf]: src/sys/arch/macppc Adapt the smu driver to the n...



details:   https://anonhg.NetBSD.org/src/rev/e66bacc7fd2f
branches:  thorpej-i2c-spi-conf
changeset: 1020793:e66bacc7fd2f
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun May 09 21:37:04 2021 +0000

description:
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.

diffstat:

 sys/arch/macppc/conf/POWERMAC_G5      |    3 +-
 sys/arch/macppc/conf/POWERMAC_G5_11_2 |    3 +-
 sys/arch/macppc/conf/files.macppc     |    9 +-
 sys/arch/macppc/dev/smu.c             |  121 +++++++++++++++++++++---------
 sys/arch/macppc/dev/smuiic.c          |  135 ----------------------------------
 sys/arch/macppc/dev/smuiicvar.h       |   38 ---------
 6 files changed, 88 insertions(+), 221 deletions(-)

diffs (truncated from 430 to 300 lines):

diff -r 531a2fee000f -r e66bacc7fd2f sys/arch/macppc/conf/POWERMAC_G5
--- a/sys/arch/macppc/conf/POWERMAC_G5  Sat May 08 22:39:41 2021 +0000
+++ b/sys/arch/macppc/conf/POWERMAC_G5  Sun May 09 21:37:04 2021 +0000
@@ -131,8 +131,7 @@
 uninorth*      at mainbus?
 smu*           at mainbus?
 #options       SMU_DEBUG
-smuiic*        at smu?
-iic*           at smuiic?
+iic*           at smu?
 
 
 pci*   at ibmcpc? bus ?
diff -r 531a2fee000f -r e66bacc7fd2f sys/arch/macppc/conf/POWERMAC_G5_11_2
--- a/sys/arch/macppc/conf/POWERMAC_G5_11_2     Sat May 08 22:39:41 2021 +0000
+++ b/sys/arch/macppc/conf/POWERMAC_G5_11_2     Sun May 09 21:37:04 2021 +0000
@@ -117,8 +117,7 @@
 
 smu*           at mainbus?
 #options       SMU_DEBUG
-smuiic*        at smu?
-iic*           at smuiic?
+iic*           at smu?
 
 pci*   at ibmcpc? bus ?
 pci*   at uninorth? bus ?
diff -r 531a2fee000f -r e66bacc7fd2f sys/arch/macppc/conf/files.macppc
--- a/sys/arch/macppc/conf/files.macppc Sat May 08 22:39:41 2021 +0000
+++ b/sys/arch/macppc/conf/files.macppc Sun May 09 21:37:04 2021 +0000
@@ -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 @@
 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
diff -r 531a2fee000f -r e66bacc7fd2f sys/arch/macppc/dev/smu.c
--- a/sys/arch/macppc/dev/smu.c Sat May 08 22:39:41 2021 +0000
+++ b/sys/arch/macppc/dev/smu.c Sun May 09 21:37:04 2021 +0000
@@ -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_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 @@
        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 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 @@
        }
 }
 
+static bool
+smu_i2c_get_address(int node, uint32_t *addrp)
+{
+       uint32_t reg;
+
+       if (of_getprop_uint32(node, "reg", &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;
+               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;
 
-               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),
+               memset(&iba, 0, sizeof(iba));
+               iba.iba_tag = &iicbus->i2c;
+               iba.iba_bus = iicbus->reg;
+
+               config_found(sc->sc_dev, &iba, iicbus_print_multi,
+                   CFARG_DEVHANDLE, devhandle,
                    CFARG_EOL);
-
-               sc->sc_num_iicbus++;
        }
 }
 
@@ -540,17 +598,6 @@
        }
 }
 
-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)
 {
diff -r 531a2fee000f -r e66bacc7fd2f sys/arch/macppc/dev/smuiic.c
--- a/sys/arch/macppc/dev/smuiic.c      Sat May 08 22:39:41 2021 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-/*     $NetBSD: smuiic.c,v 1.7 2021/04/24 23:36:41 thorpej Exp $ */
-
-/*-
- * Copyright (c) 2013 Phileas Fogg
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/device.h>
-#include <sys/proc.h>
-#include <sys/mutex.h>
-#include <sys/sysctl.h>
-
-#include <machine/autoconf.h>
-
-#include <dev/ofw/openfirm.h>
-#include <dev/i2c/i2cvar.h>
-
-#include <macppc/dev/smuvar.h>
-#include <macppc/dev/smuiicvar.h>
-
-struct smuiic_softc {
-       device_t sc_dev;



Home | Main Index | Thread Index | Old Index