diff options
| author | thorpej <thorpej@NetBSD.org> | 2021-01-26 01:23:08 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2021-01-26 01:23:08 +0000 |
| commit | d5e53f06ab4c19fa9f28ccbcb1a8645b9324a3c4 (patch) | |
| tree | 1de56e1f075407559d8a1b84c84c674c181b7db9 /sys/dev/acpi | |
| parent | 67422ab2b194997855897b19b337c136a785cedd (diff) | |
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 (limited to 'sys/dev/acpi')
| -rw-r--r-- | sys/dev/acpi/acpi_i2c.c | 142 |
1 files changed, 18 insertions, 124 deletions
diff --git a/sys/dev/acpi/acpi_i2c.c b/sys/dev/acpi/acpi_i2c.c index b1f52c89b33..7b17909ee54 100644 --- a/sys/dev/acpi/acpi_i2c.c +++ b/sys/dev/acpi/acpi_i2c.c @@ -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 @@ acpi_enter_i2c_device(struct acpi_devnode *ad, prop_array_t array) 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 @@ acpi_enter_i2c_device(struct acpi_devnode *ad, prop_array_t array) 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 @@ acpi_enter_i2c_device(struct acpi_devnode *ad, prop_array_t array) 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) { |
