Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/sociox try to show 32 GPIO line usage



details:   https://anonhg.NetBSD.org/src/rev/17337c0a3f31
branches:  trunk
changeset: 970464:17337c0a3f31
user:      nisimura <nisimura%NetBSD.org@localhost>
date:      Tue Mar 24 11:40:08 2020 +0000

description:
try to show 32 GPIO line usage

diffstat:

 sys/arch/arm/sociox/sni_gpio.c |  99 ++++++++++++++++++++++++++++++-----------
 1 files changed, 72 insertions(+), 27 deletions(-)

diffs (192 lines):

diff -r 8ddf0ffd5d8a -r 17337c0a3f31 sys/arch/arm/sociox/sni_gpio.c
--- a/sys/arch/arm/sociox/sni_gpio.c    Tue Mar 24 11:26:21 2020 +0000
+++ b/sys/arch/arm/sociox/sni_gpio.c    Tue Mar 24 11:40:08 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sni_gpio.c,v 1.2 2020/03/19 20:53:53 nisimura Exp $    */
+/*     $NetBSD: sni_gpio.c,v 1.3 2020/03/24 11:40:08 nisimura Exp $    */
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sni_gpio.c,v 1.2 2020/03/19 20:53:53 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sni_gpio.c,v 1.3 2020/03/24 11:40:08 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -64,6 +64,7 @@
        bus_space_handle_t      sc_ioh;
        bus_addr_t              sc_iob;
        bus_size_t              sc_ios;
+       void                    *sc_ih;
        kmutex_t                sc_lock;
        struct gpio_chipset_tag sc_gpio_gc;
        gpio_pin_t              sc_gpio_pins[32];
@@ -77,7 +78,19 @@
 CFATTACH_DECL_NEW(snigpio_acpi, sizeof(struct snigpio_softc),
     snigpio_acpi_match, snigpio_acpi_attach, NULL, NULL);
 
+/*
+ * "DevelopmentBox" implementation
+ *    DSW3-PIN1,  DSW3-PIN2,  DSW3-PIN3,    DSW3-PIN4,
+ *    DSW3-PIN5,  DSW3-PIN6,  DSW3-PIN7,    DSW3-PIN8,
+ *    PEC-PD8,    PEC-PD9,    PEC-PD10,     PEC-PD11,
+ *    NC,         NC,         PCIE1EXTINT,  PCIE0EXTINT,
+ *    PHY_P2_2,   PHY_P1_2,   NC,           NC,
+ *    NC,         NC,         NC,           NC,
+ *    NC,         NC,         PEC-PD26,     PEC-PD27,
+ *    PEC-PD28,   PEC-PD29,   PEC-PD30,     PEC-PD31;
+ */
 static void snigpio_attach_i(struct snigpio_softc *);
+static int snigpio_intr(void *);
 
 static int
 snigpio_fdt_match(device_t parent, struct cfdata *match, void *aux)
@@ -102,8 +115,8 @@
        bus_space_handle_t ioh;
        bus_addr_t addr;
        bus_size_t size;
+       char intrstr[128];
        _Bool disable;
-       int error;
 
        prop_dictionary_get_bool(dict, "disable", &disable);
        if (disable) {
@@ -111,16 +124,25 @@
                aprint_normal(": disabled\n");
                return;
        }
-       error = fdtbus_get_reg(phandle, 0, &addr, &size);
-       if (error) {
-               aprint_error(": couldn't get registers\n");
-               return;
-       }
-       error = bus_space_map(faa->faa_bst, addr, size, 0, &ioh);
-       if (error) {
+       if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0
+           || bus_space_map(faa->faa_bst, addr, size, 0, &ioh) != 0) {
                aprint_error(": unable to map device\n");
                return;
        }
+       if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) {
+               aprint_error(": failed to decode interrupt\n");
+               goto fail;
+       }
+       sc->sc_ih = fdtbus_intr_establish(phandle,
+                       0, IPL_VM, 0, snigpio_intr, sc);
+       if (sc->sc_ih == NULL) {
+               aprint_error_dev(self, "couldn't establish interrupt\n");
+               goto fail;
+       }
+
+       aprint_naive("\n");
+       aprint_normal(": GPIO controller\n");
+       aprint_normal_dev(self, "interrupting on %s\n", intrstr);
 
        sc->sc_dev = self;
        sc->sc_phandle = phandle;
@@ -131,7 +153,13 @@
 
        snigpio_attach_i(sc);
 
+/* dig FDT description to show 32 of GPIO line usage */
+/* DIPSW3 1-8 usage remain unclear */
+
        return;
+ fail:
+       bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
+       return; 
 }
 
 static int
@@ -163,22 +191,24 @@
            &res, &acpi_resource_parse_ops_default);
        if (ACPI_FAILURE(rv))
                return;
-
        mem = acpi_res_mem(&res, 0);
        irq = acpi_res_irq(&res, 0);
-       if (mem == NULL || irq == NULL) {
+       if (mem == NULL || irq == NULL || mem->ar_length == 0) {
                aprint_error(": incomplete resources\n");
                return;
        }
-       if (mem->ar_length == 0) {
-               aprint_error(": zero length memory resource\n");
-               return;
-       }
        if (bus_space_map(aa->aa_memt, mem->ar_base, mem->ar_length, 0,
            &ioh)) {
                aprint_error(": couldn't map registers\n");
                return;
        }
+       sc->sc_ih = acpi_intr_establish(self,
+           (uint64_t)(uintptr_t)aa->aa_node->ad_handle,
+           IPL_VM, false, snigpio_intr, sc, device_xname(self));
+       if (sc->sc_ih == NULL) {
+               aprint_error_dev(self, "couldn't establish interrupt\n");
+               goto fail;
+       }
 
        sc->sc_dev = self;
        sc->sc_iot = aa->aa_memt;
@@ -186,31 +216,46 @@
        sc->sc_ios = mem->ar_length;
 
        snigpio_attach_i(sc);
+
+/* dig _DSD property to show 32 of GPIO line usage */
+/* DIPSW3 1-8 usage remain unclear */
+
+       acpi_resource_cleanup(&res);
+       return;
+ fail:
+       acpi_resource_cleanup(&res);
+       bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
+       return; 
 }
 
 static void
 snigpio_attach_i(struct snigpio_softc *sc)
 {
+       struct gpio_chipset_tag *gc;
        struct gpiobus_attach_args gba;
 
-       aprint_naive(": GPIO controller\n");
-       aprint_normal(": GPIO controller\n");
-
        mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM);
        sc->sc_maxpins = 32;
 
        /* create controller tag */
-       sc->sc_gpio_gc.gp_cookie = sc;
-       sc->sc_gpio_gc.gp_pin_read = NULL; /* AAA */
-       sc->sc_gpio_gc.gp_pin_write = NULL; /* AAA */
-       sc->sc_gpio_gc.gp_pin_ctl = NULL; /* AAA */
-       sc->sc_gpio_gc.gp_intr_establish = NULL; /* AAA */
-       sc->sc_gpio_gc.gp_intr_disestablish = NULL; /* AAA */
-       sc->sc_gpio_gc.gp_intr_str = NULL; /* AAA */
+       gc = &sc->sc_gpio_gc;
+       gc->gp_cookie = sc;
+       gc->gp_pin_read = NULL; /* AAA */
+       gc->gp_pin_write = NULL; /* AAA */
+       gc->gp_pin_ctl = NULL; /* AAA */
+       gc->gp_intr_establish = NULL; /* AAA */
+       gc->gp_intr_disestablish = NULL; /* AAA */
+       gc->gp_intr_str = NULL; /* AAA */
 
-       gba.gba_gc = &sc->sc_gpio_gc;
+       gba.gba_gc = gc;
        gba.gba_pins = &sc->sc_gpio_pins[0];
        gba.gba_npins = sc->sc_maxpins;
 
        (void) config_found_ia(sc->sc_dev, "gpiobus", &gba, gpiobus_print);
 }
+
+static int
+snigpio_intr(void *arg)
+{
+       return 1;
+}



Home | Main Index | Thread Index | Old Index