1 // SPDX-License-Identifier: GPL-2.0
2 /* Author: Dan Scally <djrscally@gmail.com> */
4 #include <linux/acpi.h>
5 #include <linux/slab.h>
9 union acpi_object
*skl_int3472_get_acpi_buffer(struct acpi_device
*adev
, char *id
)
11 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
12 acpi_handle handle
= adev
->handle
;
13 union acpi_object
*obj
;
16 status
= acpi_evaluate_object(handle
, id
, NULL
, &buffer
);
17 if (ACPI_FAILURE(status
))
18 return ERR_PTR(-ENODEV
);
22 return ERR_PTR(-ENODEV
);
24 if (obj
->type
!= ACPI_TYPE_BUFFER
) {
25 acpi_handle_err(handle
, "%s object is not an ACPI buffer\n", id
);
27 return ERR_PTR(-EINVAL
);
32 EXPORT_SYMBOL_GPL(skl_int3472_get_acpi_buffer
);
34 int skl_int3472_fill_cldb(struct acpi_device
*adev
, struct int3472_cldb
*cldb
)
36 union acpi_object
*obj
;
39 obj
= skl_int3472_get_acpi_buffer(adev
, "CLDB");
43 if (obj
->buffer
.length
> sizeof(*cldb
)) {
44 acpi_handle_err(adev
->handle
, "The CLDB buffer is too large\n");
49 memcpy(cldb
, obj
->buffer
.pointer
, obj
->buffer
.length
);
56 EXPORT_SYMBOL_GPL(skl_int3472_fill_cldb
);
58 /* sensor_adev_ret may be NULL, name_ret must not be NULL */
59 int skl_int3472_get_sensor_adev_and_name(struct device
*dev
,
60 struct acpi_device
**sensor_adev_ret
,
61 const char **name_ret
)
63 struct acpi_device
*adev
= ACPI_COMPANION(dev
);
64 struct acpi_device
*sensor
;
67 sensor
= acpi_dev_get_next_consumer_dev(adev
, NULL
);
69 dev_err(dev
, "INT3472 seems to have no dependents.\n");
73 *name_ret
= devm_kasprintf(dev
, GFP_KERNEL
, I2C_DEV_NAME_FORMAT
,
74 acpi_dev_name(sensor
));
78 if (ret
== 0 && sensor_adev_ret
)
79 *sensor_adev_ret
= sensor
;
85 EXPORT_SYMBOL_GPL(skl_int3472_get_sensor_adev_and_name
);
87 MODULE_DESCRIPTION("Intel SkyLake INT3472 ACPI Device Driver library");
88 MODULE_AUTHOR("Daniel Scally <djrscally@gmail.com>");
89 MODULE_LICENSE("GPL");