9
9
#include <linux/module.h>
10
10
#include <linux/platform_device.h>
11
11
12
+ struct pch_fivr_resp {
13
+ u64 status ;
14
+ u64 result ;
15
+ };
16
+
17
+ static int pch_fivr_read (acpi_handle handle , char * method , struct pch_fivr_resp * fivr_resp )
18
+ {
19
+ struct acpi_buffer resp = { sizeof (struct pch_fivr_resp ), fivr_resp };
20
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER , NULL };
21
+ struct acpi_buffer format = { sizeof ("NN" ), "NN" };
22
+ union acpi_object * obj ;
23
+ acpi_status status ;
24
+ int ret = - EFAULT ;
25
+
26
+ status = acpi_evaluate_object (handle , method , NULL , & buffer );
27
+ if (ACPI_FAILURE (status ))
28
+ return ret ;
29
+
30
+ obj = buffer .pointer ;
31
+ if (!obj || obj -> type != ACPI_TYPE_PACKAGE )
32
+ goto release_buffer ;
33
+
34
+ status = acpi_extract_package (obj , & format , & resp );
35
+ if (ACPI_FAILURE (status ))
36
+ goto release_buffer ;
37
+
38
+ if (fivr_resp -> status )
39
+ goto release_buffer ;
40
+
41
+ ret = 0 ;
42
+
43
+ release_buffer :
44
+ kfree (buffer .pointer );
45
+ return ret ;
46
+ }
47
+
12
48
/*
13
49
* Presentation of attributes which are defined for INT1045
14
50
* They are:
@@ -23,15 +59,14 @@ static ssize_t name##_show(struct device *dev,\
23
59
char *buf)\
24
60
{\
25
61
struct acpi_device *acpi_dev = dev_get_drvdata(dev);\
26
- unsigned long long val ;\
27
- acpi_status status;\
62
+ struct pch_fivr_resp fivr_resp ;\
63
+ int status;\
28
64
\
29
- status = acpi_evaluate_integer(acpi_dev->handle, #method,\
30
- NULL, &val);\
31
- if (ACPI_SUCCESS(status))\
32
- return sprintf(buf, "%d\n", (int)val);\
33
- else\
34
- return -EINVAL;\
65
+ status = pch_fivr_read(acpi_dev->handle, #method, &fivr_resp);\
66
+ if (status)\
67
+ return status;\
68
+ \
69
+ return sprintf(buf, "%llu\n", fivr_resp.result);\
35
70
}
36
71
37
72
#define PCH_FIVR_STORE (name , method ) \
0 commit comments