]> Git Repo - linux.git/blob - drivers/platform/x86/intel/int3472/common.c
Merge tag 'wireless-next-2023-05-12' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / platform / x86 / intel / int3472 / common.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Author: Dan Scally <[email protected]> */
3
4 #include <linux/acpi.h>
5 #include <linux/slab.h>
6
7 #include "common.h"
8
9 union acpi_object *skl_int3472_get_acpi_buffer(struct acpi_device *adev, char *id)
10 {
11         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
12         acpi_handle handle = adev->handle;
13         union acpi_object *obj;
14         acpi_status status;
15
16         status = acpi_evaluate_object(handle, id, NULL, &buffer);
17         if (ACPI_FAILURE(status))
18                 return ERR_PTR(-ENODEV);
19
20         obj = buffer.pointer;
21         if (!obj)
22                 return ERR_PTR(-ENODEV);
23
24         if (obj->type != ACPI_TYPE_BUFFER) {
25                 acpi_handle_err(handle, "%s object is not an ACPI buffer\n", id);
26                 kfree(obj);
27                 return ERR_PTR(-EINVAL);
28         }
29
30         return obj;
31 }
32
33 int skl_int3472_fill_cldb(struct acpi_device *adev, struct int3472_cldb *cldb)
34 {
35         union acpi_object *obj;
36         int ret;
37
38         obj = skl_int3472_get_acpi_buffer(adev, "CLDB");
39         if (IS_ERR(obj))
40                 return PTR_ERR(obj);
41
42         if (obj->buffer.length > sizeof(*cldb)) {
43                 acpi_handle_err(adev->handle, "The CLDB buffer is too large\n");
44                 ret = -EINVAL;
45                 goto out_free_obj;
46         }
47
48         memcpy(cldb, obj->buffer.pointer, obj->buffer.length);
49         ret = 0;
50
51 out_free_obj:
52         kfree(obj);
53         return ret;
54 }
55
56 /* sensor_adev_ret may be NULL, name_ret must not be NULL */
57 int skl_int3472_get_sensor_adev_and_name(struct device *dev,
58                                          struct acpi_device **sensor_adev_ret,
59                                          const char **name_ret)
60 {
61         struct acpi_device *adev = ACPI_COMPANION(dev);
62         struct acpi_device *sensor;
63         int ret = 0;
64
65         sensor = acpi_dev_get_next_consumer_dev(adev, NULL);
66         if (!sensor) {
67                 dev_err(dev, "INT3472 seems to have no dependents.\n");
68                 return -ENODEV;
69         }
70
71         *name_ret = devm_kasprintf(dev, GFP_KERNEL, I2C_DEV_NAME_FORMAT,
72                                    acpi_dev_name(sensor));
73         if (!*name_ret)
74                 ret = -ENOMEM;
75
76         if (ret == 0 && sensor_adev_ret)
77                 *sensor_adev_ret = sensor;
78         else
79                 acpi_dev_put(sensor);
80
81         return ret;
82 }
This page took 0.037635 seconds and 4 git commands to generate.