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/dev/spi Use spi_compatible_match().



details:   https://anonhg.NetBSD.org/src/rev/591cb310e5ce
branches:  thorpej-i2c-spi-conf
changeset: 378798:591cb310e5ce
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Wed May 19 03:32:27 2021 +0000

description:
Use spi_compatible_match().

XXX More work to do for proper FDT integration.

diffstat:

 sys/dev/spi/mcp23s17.c |   42 +++++-
 sys/dev/spi/mcp3k.c    |  274 ++++++++++++++++++++++++++++++------------------
 2 files changed, 204 insertions(+), 112 deletions(-)

diffs (truncated from 415 to 300 lines):

diff -r fbcd23ca9759 -r 591cb310e5ce sys/dev/spi/mcp23s17.c
--- a/sys/dev/spi/mcp23s17.c    Wed May 19 03:14:24 2021 +0000
+++ b/sys/dev/spi/mcp23s17.c    Wed May 19 03:32:27 2021 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: mcp23s17.c,v 1.2 2021/04/24 23:36:59 thorpej Exp $ */
+/*      $NetBSD: mcp23s17.c,v 1.2.2.1 2021/05/19 03:32:27 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mcp23s17.c,v 1.2 2021/04/24 23:36:59 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mcp23s17.c,v 1.2.2.1 2021/05/19 03:32:27 thorpej Exp $");
 
 /* 
  * Driver for Microchip MCP23S17 GPIO
@@ -87,18 +87,34 @@ static void     mcp23s17gpio_gpio_pin_ct
 CFATTACH_DECL_NEW(mcp23s17gpio, sizeof(struct mcp23s17gpio_softc),
                  mcp23s17gpio_match, mcp23s17gpio_attach, NULL, NULL);
 
+static const struct device_compatible_entry compat_data[] = {
+       { .compat = "mcp,mcp23s17" },
+       { .compat = "microchip,mcp23s17" },
+
+#if 0  /* We should also add support for these: */
+       { .compat = "mcp,mcp23s08" },
+       { .compat = "microchip,mcp23s08" },
+
+       { .compat = "microchip,mcp23s18" },
+#endif
+
+       DEVICE_COMPAT_EOL
+};
+
 static int
 mcp23s17gpio_match(device_t parent, cfdata_t cf, void *aux)
 {
        struct spi_attach_args *sa = aux;
-
-       /* MCP23S17 has no way to detect it! */
+       int rv;
 
-       /* run at 10MHz */
-       if (spi_configure(sa->sa_handle, SPI_MODE_0, 10000000))
-               return 0;
+       rv = spi_compatible_match(sa, cf, compat_data);
+       if (rv != 0) {
+               /* run at 10MHz */
+               if (spi_configure(sa->sa_handle, SPI_MODE_0, 10000000))
+                       return 0;
+       }
 
-       return 1;
+       return rv;
 }
 
 static void
@@ -116,6 +132,11 @@ mcp23s17gpio_attach(device_t parent, dev
        sc->sc_dev = self;
        sc->sc_sh = sa->sa_handle;
        sc->sc_bank = 0;
+
+       /*
+        * XXX Initialize sc_ha from microchip,spi-present-mask
+        * XXX property for FDT.  Only consult cf_flags for indirect.
+        */
        sc->sc_ha = device_cfdata(sc->sc_dev)->cf_flags & 0x7;
 
        aprint_naive(": GPIO\n");       
@@ -124,7 +145,10 @@ mcp23s17gpio_attach(device_t parent, dev
        DPRINTF(1, ("%s: initialize (HAEN|SEQOP)\n", device_xname(sc->sc_dev)));
 
        /* basic setup */
-       mcp23s17gpio_write(sc, MCP23x17_IOCONA(sc->sc_bank), MCP23x17_IOCON_HAEN|MCP23x17_IOCON_SEQOP);
+       mcp23s17gpio_write(sc, MCP23x17_IOCONA(sc->sc_bank),
+           MCP23x17_IOCON_HAEN|MCP23x17_IOCON_SEQOP);
+
+       /* XXX Hook up to FDT GPIO. */
 
 #if NGPIO > 0
        for (i = 0; i < MCP23x17_GPIO_NPINS; i++) {
diff -r fbcd23ca9759 -r 591cb310e5ce sys/dev/spi/mcp3k.c
--- a/sys/dev/spi/mcp3k.c       Wed May 19 03:14:24 2021 +0000
+++ b/sys/dev/spi/mcp3k.c       Wed May 19 03:32:27 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mcp3k.c,v 1.2 2016/11/20 12:38:04 phx Exp $ */
+/*     $NetBSD: mcp3k.c,v 1.2.36.1 2021/05/19 03:33:05 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -72,14 +72,14 @@ struct mcp3kadc_model {
 };
 
 struct mcp3kadc_softc {
-       device_t                sc_dev;
-       struct spi_handle       *sc_sh;
-       int                     sc_model;
-       uint32_t                sc_adc_max;
-       int32_t                 sc_vref_mv;
+       device_t                        sc_dev;
+       struct spi_handle               *sc_sh;
+       const struct mcp3kadc_model     *sc_model;
+       uint32_t                        sc_adc_max;
+       int32_t                         sc_vref_mv;
 
-       struct sysmon_envsys    *sc_sme;
-       envsys_data_t           sc_sensors[M3K_MAX_SENSORS];
+       struct sysmon_envsys            *sc_sme;
+       envsys_data_t                   sc_sensors[M3K_MAX_SENSORS];
 };
 
 static int     mcp3kadc_match(device_t, cfdata_t, void *);
@@ -91,124 +91,192 @@ static int        sysctl_mcp3kadc_vref(SYSCTLFN
 CFATTACH_DECL_NEW(mcp3kadc, sizeof(struct mcp3kadc_softc),
     mcp3kadc_match,  mcp3kadc_attach, NULL, NULL);
 
-static struct mcp3kadc_model mcp3k_models[] = {
-       {
-               .name = 3001,
-               .bits = 10,
-               .channels = 1,
-               .lead = 3,
-               .flags = 0
-       },
-       {
-               .name = 3002,
-               .bits = 10,
-               .channels = 2,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_MSBF
-       },
-       {
-               .name = 3004,
-               .bits = 10,
-               .channels = 4,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_D2D1D0
-       },
-       {
-               .name = 3008,
-               .bits = 10,
-               .channels = 8,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_D2D1D0
-       },
-       {
-               .name = 3201,
-               .bits = 12,
-               .channels = 1,
-               .lead = 3,
-               .flags = 0
-       },
-       {
-               .name = 3202,
-               .bits = 12,
-               .channels = 2,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_MSBF
-       },
-       {
-               .name = 3204,
-               .bits = 12,
-               .channels = 4,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_D2D1D0
-       },
-       {
-               .name = 3208,
-               .bits = 12,
-               .channels = 8,
-               .lead = 2,
-               .flags = M3K_SGLDIFF | M3K_D2D1D0
-       },
-       {
-               .name = 3301,
-               .bits = 13,
-               .channels = 1,
-               .lead = 3,
-               .flags = M3K_SIGNED
-       },
-       {
-               .name = 3302,
-               .bits = 13,
-               .channels = 4,
-               .lead = 2,
-               .flags = M3K_SIGNED | M3K_SGLDIFF | M3K_D2D1D0
-       },
-       {
-               .name = 3304,
-               .bits = 13,
-               .channels = 8,
-               .lead = 2,
-               .flags = M3K_SIGNED | M3K_SGLDIFF | M3K_D2D1D0
-       },
+static const struct mcp3kadc_model mcp3001 = {
+       .name = 3001,
+       .bits = 10,
+       .channels = 1,
+       .lead = 3,
+       .flags = 0
+};
+
+static const struct mcp3kadc_model mcp3002 = {
+       .name = 3002,
+       .bits = 10,
+       .channels = 2,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_MSBF
+};
+
+static const struct mcp3kadc_model mcp3004 = {
+       .name = 3004,
+       .bits = 10,
+       .channels = 4,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_D2D1D0
+};
+
+static const struct mcp3kadc_model mcp3008 = {
+       .name = 3008,
+       .bits = 10,
+       .channels = 8,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_D2D1D0
+};
+
+static const struct mcp3kadc_model mcp3201 = {
+       .name = 3201,
+       .bits = 12,
+       .channels = 1,
+       .lead = 3,
+       .flags = 0
+};
+
+static const struct mcp3kadc_model mcp3202 = {
+       .name = 3202,
+       .bits = 12,
+       .channels = 2,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_MSBF
+};
+
+static const struct mcp3kadc_model mcp3204 = {
+       .name = 3204,
+       .bits = 12,
+       .channels = 4,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_D2D1D0
+};
+
+static const struct mcp3kadc_model mcp3208 = {
+       .name = 3208,
+       .bits = 12,
+       .channels = 8,
+       .lead = 2,
+       .flags = M3K_SGLDIFF | M3K_D2D1D0
 };
 
+static const struct mcp3kadc_model mcp3301 = {
+       .name = 3301,
+       .bits = 13,
+       .channels = 1,
+       .lead = 3,
+       .flags = M3K_SIGNED
+};
+
+static const struct mcp3kadc_model mcp3302 = {
+       .name = 3302,
+       .bits = 13,
+       .channels = 4,
+       .lead = 2,
+       .flags = M3K_SIGNED | M3K_SGLDIFF | M3K_D2D1D0
+};
+
+static const struct mcp3kadc_model mcp3304 = {
+       .name = 3304,
+       .bits = 13,
+       .channels = 8,
+       .lead = 2,
+       .flags = M3K_SIGNED | M3K_SGLDIFF | M3K_D2D1D0
+};
+
+static const struct device_compatible_entry compat_data[] = {
+       { .compat = "microchip,mcp3001",        .data = &mcp3001 },
+       { .compat = "microchip,mcp3002",        .data = &mcp3002 },
+       { .compat = "microchip,mcp3004",        .data = &mcp3004 },
+       { .compat = "microchip,mcp3008",        .data = &mcp3008 },
+       { .compat = "microchip,mcp3201",        .data = &mcp3201 },
+       { .compat = "microchip,mcp3202",        .data = &mcp3202 },
+       { .compat = "microchip,mcp3204",        .data = &mcp3204 },
+       { .compat = "microchip,mcp3208",        .data = &mcp3208 },
+       { .compat = "microchip,mcp3301",        .data = &mcp3301 },
+       { .compat = "microchip,mcp3302",        .data = &mcp3302 },
+       { .compat = "microchip,mcp3304",        .data = &mcp3304 },
+
+#if 0  /* We should also add support for these: */
+       { .compat = "microchip,mcp3550-50" },
+       { .compat = "microchip,mcp3550-60" },



Home | Main Index | Thread Index | Old Index