acpi.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2021-2023 Realtek Corporation
  3. */
  4. #include <linux/acpi.h>
  5. #include <linux/uuid.h>
  6. #include "acpi.h"
  7. #include "debug.h"
  8. static const guid_t rtw89_guid = GUID_INIT(0xD2A8C3E8, 0x4B69, 0x4F00,
  9. 0x82, 0xBD, 0xFE, 0x86,
  10. 0x07, 0x80, 0x3A, 0xA7);
  11. static int rtw89_acpi_dsm_get(struct rtw89_dev *rtwdev, union acpi_object *obj,
  12. u8 *value)
  13. {
  14. switch (obj->type) {
  15. case ACPI_TYPE_INTEGER:
  16. *value = (u8)obj->integer.value;
  17. break;
  18. case ACPI_TYPE_BUFFER:
  19. *value = obj->buffer.pointer[0];
  20. break;
  21. default:
  22. rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
  23. "acpi dsm return unhandled type: %d\n", obj->type);
  24. return -EINVAL;
  25. }
  26. return 0;
  27. }
  28. int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
  29. enum rtw89_acpi_dsm_func func, u8 *value)
  30. {
  31. union acpi_object *obj;
  32. int ret;
  33. obj = acpi_evaluate_dsm(ACPI_HANDLE(rtwdev->dev), &rtw89_guid,
  34. 0, func, NULL);
  35. if (!obj) {
  36. rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
  37. "acpi dsm fail to evaluate func: %d\n", func);
  38. return -ENOENT;
  39. }
  40. ret = rtw89_acpi_dsm_get(rtwdev, obj, value);
  41. ACPI_FREE(obj);
  42. return ret;
  43. }