Source-Changes-HG archive

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

[src/trunk]: src/sys/dev Don't map ACPI _HID / _CID strings to "compatible" s...



details:   https://anonhg.NetBSD.org/src/rev/f23f997eac26
branches:  trunk
changeset: 958955:f23f997eac26
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Tue Jan 26 01:23:08 2021 +0000

description:
Don't map ACPI _HID / _CID strings to "compatible" strings from the
Device Tree bindings.  Just pass those strings in the standard
most-specific-to-least-specific order to the drivers and let them
deal.

diffstat:

 sys/dev/acpi/acpi_i2c.c |  142 ++++++-----------------------------------------
 sys/dev/i2c/ihidev.c    |    6 +-
 sys/dev/i2c/pcai2cmux.c |    8 +-
 3 files changed, 27 insertions(+), 129 deletions(-)

diffs (256 lines):

diff -r 727234b6c4d3 -r f23f997eac26 sys/dev/acpi/acpi_i2c.c
--- a/sys/dev/acpi/acpi_i2c.c   Tue Jan 26 01:15:39 2021 +0000
+++ b/sys/dev/acpi/acpi_i2c.c   Tue Jan 26 01:23:08 2021 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: acpi_i2c.c,v 1.10 2021/01/26 00:19:53 jmcneill Exp $ */
+/* $NetBSD: acpi_i2c.c,v 1.11 2021/01/26 01:23:08 thorpej Exp $ */
 
 /*-
- * Copyright (c) 2017 The NetBSD Foundation, Inc.
+ * Copyright (c) 2017, 2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -30,113 +30,18 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.10 2021/01/26 00:19:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.11 2021/01/26 01:23:08 thorpej Exp $");
 
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpi_i2c.h>
 #include <dev/i2c/i2cvar.h>
 
+#include <sys/kmem.h>
+
 #define _COMPONENT     ACPI_BUS_COMPONENT
 ACPI_MODULE_NAME       ("acpi_i2c")
 
-static void
-acpi_enter_i2c_hid(struct acpi_devnode *devnode, prop_dictionary_t dev)
-{
-       ACPI_OBJECT_LIST arg;
-       ACPI_OBJECT obj[4];
-       ACPI_OBJECT *osc;
-       ACPI_BUFFER buf;
-       ACPI_STATUS rv;
-       /* 3cdff6f7-4267-4555-ad05-b30a3d8938de */
-       static uint8_t i2c_hid_guid[] = {
-               0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
-               0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
-       };
-
-       arg.Count = 4;
-       arg.Pointer = obj;
-
-       obj[0].Type = ACPI_TYPE_BUFFER;
-       obj[0].Buffer.Length = sizeof(i2c_hid_guid);
-       obj[0].Buffer.Pointer = i2c_hid_guid;
-
-       /* rev */
-       obj[1].Type = ACPI_TYPE_INTEGER;
-       obj[1].Integer.Value = 1;
-
-       /* func */
-       obj[2].Type = ACPI_TYPE_INTEGER;
-       obj[2].Integer.Value = 1;
-
-       obj[3].Type = ACPI_TYPE_PACKAGE;
-       obj[3].Buffer.Length = 0;
-
-       buf.Pointer = NULL;
-       buf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
-
-       rv = AcpiEvaluateObject(devnode->ad_handle, "_DSM", &arg, &buf);
-
-       if (ACPI_FAILURE(rv)) {
-               aprint_error("failed to evaluate _DSM for %s: %s\n",
-                   devnode->ad_name, AcpiFormatException(rv));
-               return;
-       }
-
-       osc = buf.Pointer;
-       if (osc->Type != ACPI_TYPE_INTEGER) {
-               aprint_error("bad _DSM return type %d for %s\n",
-                   osc->Type, devnode->ad_name);
-               return;
-       }
-       prop_dictionary_set_uint32(dev, "hid-descr-addr", osc->Integer.Value);
-}
-
-struct acpi_i2c_id {
-       const char *id;
-       const char *compat;
-       const int compatlen;
-       void (*parse)(struct acpi_devnode *, prop_dictionary_t);
-};
-
-static const struct acpi_i2c_id acpi_i2c_ids[] = {
-       {
-               .id = "PNP0C50",
-               .compat = "hid-over-i2c",
-               .compatlen = 13,
-               .parse = acpi_enter_i2c_hid
-       },
-       {
-               .id = "ACPI0C50",
-               .compat = "hid-over-i2c",
-               .compatlen = 13,
-               .parse = acpi_enter_i2c_hid
-       },
-       {
-               .id = "NXP0002",
-               .compat = "nxp,pca9547",
-               .compatlen = 12,
-               .parse = NULL
-       },
-       {
-               .id = NULL,
-               .compat = NULL,
-               .compatlen = 0,
-               .parse = NULL
-       }
-};
-
-static const struct acpi_i2c_id *
-acpi_i2c_search(const char *name)
-{
-       int i;
-       for (i = 0; acpi_i2c_ids[i].id != NULL; i++) {
-               if (strcmp(name, acpi_i2c_ids[i].id) == 0)
-                       return &acpi_i2c_ids[i];
-       }
-       return NULL;
-}
-
 struct acpi_i2c_context {
        uint16_t i2c_addr;
 };
@@ -170,10 +75,9 @@
        prop_dictionary_t dev;
        struct acpi_i2c_context i2cc;
        ACPI_STATUS rv;
-       int cidi;
-       ACPI_PNP_DEVICE_ID_LIST *idlist;
        const char *name;
-       static const struct acpi_i2c_id *i2c_id;
+       char *clist;
+       size_t clist_size;
 
        memset(&i2cc, 0, sizeof(i2cc));
        rv = AcpiWalkResources(ad->ad_handle, "_CRS",
@@ -192,7 +96,14 @@
                    ad->ad_name);
                return;
        }
-       if ((ad->ad_devinfo->Valid &  ACPI_VALID_HID) == 0)
+       clist = acpi_pack_compat_list(ad->ad_devinfo, &clist_size);
+       if (clist == NULL) {
+               prop_object_release(dev);
+               aprint_error("ignoring device %s (no _HID or _CID)\n",
+                   ad->ad_name);
+               return;
+       }
+       if ((ad->ad_devinfo->Valid & ACPI_VALID_HID) == 0)
                name = ad->ad_name;
        else
                name = ad->ad_devinfo->HardwareId.String;
@@ -200,30 +111,13 @@
        prop_dictionary_set_uint32(dev, "addr", i2cc.i2c_addr);
        prop_dictionary_set_uint64(dev, "cookie", (uintptr_t)ad->ad_handle);
        prop_dictionary_set_uint32(dev, "cookietype", I2C_COOKIE_ACPI);
-       /* first search by name, then by CID */
-       i2c_id = acpi_i2c_search(name);
-       idlist = &ad->ad_devinfo->CompatibleIdList;
-       for (cidi = 0;
-           cidi < idlist->Count && i2c_id == NULL;
-           cidi++) {
-               i2c_id = acpi_i2c_search(idlist->Ids[cidi].String);
-       }
-       if (i2c_id != NULL) {
-               if (i2c_id->compat != NULL) {
-                       prop_data_t data;
-                       data = prop_data_create_copy(i2c_id->compat,
-                           i2c_id->compatlen);
-                       prop_dictionary_set(dev, "compatible", data);
-                       prop_object_release(data);
-               }
-               if (i2c_id->parse != NULL)
-                       i2c_id->parse(ad, dev);
-       }
+       prop_dictionary_set_data(dev, "compatible", clist, clist_size);
+       kmem_free(clist, clist_size);
+
        prop_array_add(array, dev);
        prop_object_release(dev);
 }
 
-
 prop_array_t
 acpi_enter_i2c_devs(device_t dev, struct acpi_devnode *devnode)
 {
diff -r 727234b6c4d3 -r f23f997eac26 sys/dev/i2c/ihidev.c
--- a/sys/dev/i2c/ihidev.c      Tue Jan 26 01:15:39 2021 +0000
+++ b/sys/dev/i2c/ihidev.c      Tue Jan 26 01:23:08 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ihidev.c,v 1.15 2021/01/26 01:15:39 thorpej Exp $ */
+/* $NetBSD: ihidev.c,v 1.16 2021/01/26 01:23:08 thorpej Exp $ */
 /* $OpenBSD ihidev.c,v 1.13 2017/04/08 02:57:23 deraadt Exp $ */
 
 /*-
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.15 2021/01/26 01:15:39 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.16 2021/01/26 01:23:08 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -126,6 +126,8 @@
 static int     ihidev_submatch(device_t, cfdata_t, const int *, void *);
 
 static const struct device_compatible_entry compat_data[] = {
+       { .compat = "PNP0C50" },
+       { .compat = "ACPI0C50" },
        { .compat = "hid-over-i2c" },
        { }
 };
diff -r 727234b6c4d3 -r f23f997eac26 sys/dev/i2c/pcai2cmux.c
--- a/sys/dev/i2c/pcai2cmux.c   Tue Jan 26 01:15:39 2021 +0000
+++ b/sys/dev/i2c/pcai2cmux.c   Tue Jan 26 01:23:08 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pcai2cmux.c,v 1.6 2021/01/25 12:18:18 jmcneill Exp $   */
+/*     $NetBSD: pcai2cmux.c,v 1.7 2021/01/26 01:23:08 thorpej Exp $    */
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcai2cmux.c,v 1.6 2021/01/25 12:18:18 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcai2cmux.c,v 1.7 2021/01/26 01:23:08 thorpej Exp $");
 
 /*
  * Driver for NXP PCA954x / PCA984x I2C switches and multiplexers.
@@ -133,6 +133,8 @@
        /* PCA9547 - 8 channel i2c mux */
        { .compat = "nxp,pca9547",
          .data = &mux8_type },
+       { .compat = "NXP0002",
+         .data = &mux8_type },
 
        /* PCA9548 - 8 channel i2c switch */
        { .compat = "nxp,pca9548",
@@ -154,7 +156,7 @@
        { .compat = "nxp,pca9849",
          .data = &mux4_type },
 
-       { 0 }
+       { }
 };
 
 struct pcaiicmux_softc {



Home | Main Index | Thread Index | Old Index