Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/acpi make it handle legacy devices too, although the...



details:   https://anonhg.NetBSD.org/src/rev/1ab29f36d2b1
branches:  trunk
changeset: 772974:1ab29f36d2b1
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Jan 22 20:24:27 2012 +0000

description:
make it handle legacy devices too, although the ones in the table are not.

diffstat:

 sys/dev/acpi/tpm_acpi.c |  88 ++++++++++++++++++++++++++++++------------------
 1 files changed, 55 insertions(+), 33 deletions(-)

diffs (146 lines):

diff -r b1b82af3ad34 -r 1ab29f36d2b1 sys/dev/acpi/tpm_acpi.c
--- a/sys/dev/acpi/tpm_acpi.c   Sun Jan 22 20:21:12 2012 +0000
+++ b/sys/dev/acpi/tpm_acpi.c   Sun Jan 22 20:24:27 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tpm_acpi.c,v 1.1 2012/01/22 06:44:28 christos Exp $ */
+/* $NetBSD: tpm_acpi.c,v 1.2 2012/01/22 20:24:27 christos Exp $ */
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tpm_acpi.c,v 1.1 2012/01/22 06:44:28 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tpm_acpi.c,v 1.2 2012/01/22 20:24:27 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -102,12 +102,10 @@
        /* There can be only one. */
        if (tpm_cd.cd_devs && tpm_cd.cd_devs[0])
                return 0;
-
 #ifdef notyet
-       // XXX: My sony can't find the IRQ
+       return 0;
+#else
        return acpi_match_hid(aa->aa_node->ad_devinfo, tpm_acpi_ids);
-#else
-       return 0;
 #endif
 }
 
@@ -117,9 +115,12 @@
        struct tpm_softc *sc = device_private(self);
        struct acpi_attach_args *aa = aux;
        struct acpi_resources res;
+       struct acpi_io *io;
        struct acpi_mem *mem;
        struct acpi_irq *irq;
-       int rv;
+       bus_addr_t base;
+       bus_addr_t size;
+       int rv, inum;
 
        sc->sc_dev = self;
 
@@ -132,43 +133,64 @@
                 return;
        }
 
-       mem = acpi_res_mem(&res, 0);
-       if (mem == NULL) {
-               aprint_error_dev(sc->sc_dev, "cannot find mem\n");
-               goto out;
+       io = acpi_res_io(&res, 0);
+       if (io && tpm_legacy_probe(aa->aa_iot, io->ar_base)) {
+               sc->sc_bt = aa->aa_iot;
+               base = io->ar_base;
+               size = io->ar_length;
+               sc->sc_batm = aa->aa_iot;
+               sc->sc_init = tpm_legacy_init;
+               sc->sc_start = tpm_legacy_start;
+               sc->sc_read = tpm_legacy_read;
+               sc->sc_write = tpm_legacy_write;
+               sc->sc_end = tpm_legacy_end;
+               mem = NULL;
+       } else {
+               mem = acpi_res_mem(&res, 0);
+               if (mem == NULL) {
+                       aprint_error_dev(sc->sc_dev, "cannot find mem\n");
+                       goto out;
+               }
+
+               if (mem->ar_length != TPM_SIZE) {
+                       aprint_error_dev(sc->sc_dev,
+                           "wrong size mem %u != %u\n",
+                           mem->ar_length, TPM_SIZE);
+                       goto out;
+               }
+
+               base = mem->ar_base;
+               size = mem->ar_length;
+               sc->sc_bt = aa->aa_memt;
+               sc->sc_init = tpm_tis12_init;
+               sc->sc_start = tpm_tis12_start;
+               sc->sc_read = tpm_tis12_read;
+               sc->sc_write = tpm_tis12_write;
+               sc->sc_end = tpm_tis12_end;
        }
 
-       if (mem->ar_length != TPM_SIZE) {
-               aprint_error_dev(sc->sc_dev, "wrong size mem %u != %u\n",
-                   mem->ar_length, TPM_SIZE);
-               goto out;
-       }
-
-       sc->sc_bt = aa->aa_memt;
-       sc->sc_init = tpm_tis12_init;
-       sc->sc_start = tpm_tis12_start;
-       sc->sc_read = tpm_tis12_read;
-       sc->sc_write = tpm_tis12_write;
-       sc->sc_end = tpm_tis12_end;
-
-       if (bus_space_map(sc->sc_bt, mem->ar_base, mem->ar_length, 0,
-           &sc->sc_bh)) {
+       if (bus_space_map(sc->sc_bt, base, size, 0, &sc->sc_bh)) {
                aprint_error_dev(sc->sc_dev, "cannot map registers\n");
                goto out;
        }
 
-       irq = acpi_res_irq(&res, 0);
-       if (irq == NULL) {
-               aprint_error_dev(sc->sc_dev, "cannot find irq\n");
+       if (mem && !tpm_tis12_probe(sc->sc_bt, sc->sc_bh)) {
+               aprint_error_dev(sc->sc_dev, "1.2 probe failed\n");
                goto out1;
        }
 
-       if ((rv = (*sc->sc_init)(sc, irq->ar_irq,
-           device_xname(sc->sc_dev))) != 0)
+       irq = acpi_res_irq(&res, 0);
+       if (irq == NULL)
+               inum = -1;
+       else
+               inum = irq->ar_irq;
+
+       if ((rv = (*sc->sc_init)(sc, inum, device_xname(sc->sc_dev))) != 0)
                aprint_error_dev(sc->sc_dev, "cannot init device %d\n", rv);
                goto out1;
 
-       if ((sc->sc_ih = isa_intr_establish(aa->aa_ic, irq->ar_irq,
+       if (inum != -1 &&
+           (sc->sc_ih = isa_intr_establish(aa->aa_ic, irq->ar_irq,
            IST_EDGE, IPL_TTY, tpm_intr, sc)) == NULL) {
                aprint_error_dev(sc->sc_dev, "cannot establish interrupt\n");
                goto out1;
@@ -178,7 +200,7 @@
                aprint_error_dev(sc->sc_dev, "Cannot set power mgmt handler\n");
        return;
 out1:
-       bus_space_unmap(sc->sc_bt, sc->sc_bh, TPM_SIZE);
+       bus_space_unmap(sc->sc_bt, sc->sc_bh, size);
 out:
        acpi_resource_cleanup(&res);
 }



Home | Main Index | Thread Index | Old Index