Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
cddbefcc
Commit
cddbefcc
authored
Apr 29, 2021
by
Jiri Kosina
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-5.13/i2c-hid' into for-linus
- Cleanups to ACPI handling in i2c-hid driver from Andy Shevchenko
parents
8ba3c81c
09609410
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
27 deletions
+25
-27
drivers/hid/i2c-hid/i2c-hid-acpi.c
drivers/hid/i2c-hid/i2c-hid-acpi.c
+25
-27
No files found.
drivers/hid/i2c-hid/i2c-hid-acpi.c
View file @
cddbefcc
...
...
@@ -25,12 +25,13 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/uuid.h>
#include "i2c-hid.h"
struct
i2c_hid_acpi
{
struct
i2chid_ops
ops
;
struct
i2c_client
*
client
;
struct
acpi_device
*
adev
;
};
static
const
struct
acpi_device_id
i2c_hid_acpi_blacklist
[]
=
{
...
...
@@ -42,29 +43,24 @@ static const struct acpi_device_id i2c_hid_acpi_blacklist[] = {
{
},
};
static
int
i2c_hid_acpi_get_descriptor
(
struct
i2c_client
*
client
)
/* HID I²C Device: 3cdff6f7-4267-4555-ad05-b30a3d8938de */
static
guid_t
i2c_hid_guid
=
GUID_INIT
(
0x3CDFF6F7
,
0x4267
,
0x4555
,
0xAD
,
0x05
,
0xB3
,
0x0A
,
0x3D
,
0x89
,
0x38
,
0xDE
);
static
int
i2c_hid_acpi_get_descriptor
(
struct
acpi_device
*
adev
)
{
static
guid_t
i2c_hid_guid
=
GUID_INIT
(
0x3CDFF6F7
,
0x4267
,
0x4555
,
0xAD
,
0x05
,
0xB3
,
0x0A
,
0x3D
,
0x89
,
0x38
,
0xDE
);
acpi_handle
handle
=
acpi_device_handle
(
adev
);
union
acpi_object
*
obj
;
struct
acpi_device
*
adev
;
acpi_handle
handle
;
u16
hid_descriptor_address
;
handle
=
ACPI_HANDLE
(
&
client
->
dev
);
if
(
!
handle
||
acpi_bus_get_device
(
handle
,
&
adev
))
{
dev_err
(
&
client
->
dev
,
"Error could not get ACPI device
\n
"
);
return
-
ENODEV
;
}
if
(
acpi_match_device_ids
(
adev
,
i2c_hid_acpi_blacklist
)
==
0
)
return
-
ENODEV
;
obj
=
acpi_evaluate_dsm_typed
(
handle
,
&
i2c_hid_guid
,
1
,
1
,
NULL
,
ACPI_TYPE_INTEGER
);
if
(
!
obj
)
{
dev_err
(
&
client
->
dev
,
"Error _DSM call to get HID descriptor address failed
\n
"
);
acpi_handle_err
(
handle
,
"Error _DSM call to get HID descriptor address failed
\n
"
);
return
-
ENODEV
;
}
...
...
@@ -76,14 +72,12 @@ static int i2c_hid_acpi_get_descriptor(struct i2c_client *client)
static
void
i2c_hid_acpi_shutdown_tail
(
struct
i2chid_ops
*
ops
)
{
struct
i2c_hid_acpi
*
ihid_acpi
=
container_of
(
ops
,
struct
i2c_hid_acpi
,
ops
);
struct
device
*
dev
=
&
ihid_acpi
->
client
->
dev
;
acpi_device_set_power
(
ACPI_COMPANION
(
dev
),
ACPI_STATE_D3_COLD
);
struct
i2c_hid_acpi
*
ihid_acpi
=
container_of
(
ops
,
struct
i2c_hid_acpi
,
ops
);
acpi_device_set_power
(
ihid_acpi
->
adev
,
ACPI_STATE_D3_COLD
);
}
static
int
i2c_hid_acpi_probe
(
struct
i2c_client
*
client
,
const
struct
i2c_device_id
*
dev_id
)
static
int
i2c_hid_acpi_probe
(
struct
i2c_client
*
client
)
{
struct
device
*
dev
=
&
client
->
dev
;
struct
i2c_hid_acpi
*
ihid_acpi
;
...
...
@@ -91,21 +85,25 @@ static int i2c_hid_acpi_probe(struct i2c_client *client,
u16
hid_descriptor_address
;
int
ret
;
adev
=
ACPI_COMPANION
(
dev
);
if
(
!
adev
)
{
dev_err
(
&
client
->
dev
,
"Error could not get ACPI device
\n
"
);
return
-
ENODEV
;
}
ihid_acpi
=
devm_kzalloc
(
&
client
->
dev
,
sizeof
(
*
ihid_acpi
),
GFP_KERNEL
);
if
(
!
ihid_acpi
)
return
-
ENOMEM
;
ihid_acpi
->
client
=
client
;
ihid_acpi
->
adev
=
adev
;
ihid_acpi
->
ops
.
shutdown_tail
=
i2c_hid_acpi_shutdown_tail
;
ret
=
i2c_hid_acpi_get_descriptor
(
client
);
ret
=
i2c_hid_acpi_get_descriptor
(
adev
);
if
(
ret
<
0
)
return
ret
;
hid_descriptor_address
=
ret
;
adev
=
ACPI_COMPANION
(
dev
);
if
(
adev
)
acpi_device_fix_up_power
(
adev
);
acpi_device_fix_up_power
(
adev
);
if
(
acpi_gbl_FADT
.
flags
&
ACPI_FADT_LOW_POWER_S0
)
{
device_set_wakeup_capable
(
dev
,
true
);
...
...
@@ -128,10 +126,10 @@ static struct i2c_driver i2c_hid_acpi_driver = {
.
name
=
"i2c_hid_acpi"
,
.
pm
=
&
i2c_hid_core_pm
,
.
probe_type
=
PROBE_PREFER_ASYNCHRONOUS
,
.
acpi_match_table
=
ACPI_PTR
(
i2c_hid_acpi_match
)
,
.
acpi_match_table
=
i2c_hid_acpi_match
,
},
.
probe
=
i2c_hid_acpi_probe
,
.
probe
_new
=
i2c_hid_acpi_probe
,
.
remove
=
i2c_hid_core_remove
,
.
shutdown
=
i2c_hid_core_shutdown
,
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment