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
4435b577
Commit
4435b577
authored
Aug 20, 2018
by
Jiri Kosina
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-4.19/i2c-hid' into for-linus
Low voltage support for i2c-hid
parents
5a12d86c
6136f97c
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
32 additions
and
35 deletions
+32
-35
Documentation/devicetree/bindings/input/hid-over-i2c.txt
Documentation/devicetree/bindings/input/hid-over-i2c.txt
+2
-1
drivers/hid/i2c-hid/i2c-hid.c
drivers/hid/i2c-hid/i2c-hid.c
+27
-30
include/linux/platform_data/i2c-hid.h
include/linux/platform_data/i2c-hid.h
+3
-4
No files found.
Documentation/devicetree/bindings/input/hid-over-i2c.txt
View file @
4435b577
...
...
@@ -26,7 +26,8 @@ device-specific compatible properties, which should be used in addition to the
- compatible:
* "wacom,w9013" (Wacom W9013 digitizer). Supports:
- vdd-supply
- vdd-supply (3.3V)
- vddl-supply (1.8V)
- post-power-on-delay-ms
- vdd-supply: phandle of the regulator that provides the supply voltage.
...
...
drivers/hid/i2c-hid/i2c-hid.c
View file @
4435b577
...
...
@@ -1002,18 +1002,18 @@ static int i2c_hid_probe(struct i2c_client *client,
return
client
->
irq
;
}
ihid
=
kzalloc
(
sizeof
(
struct
i2c_
hid
),
GFP_KERNEL
);
ihid
=
devm_kzalloc
(
&
client
->
dev
,
sizeof
(
*
i
hid
),
GFP_KERNEL
);
if
(
!
ihid
)
return
-
ENOMEM
;
if
(
client
->
dev
.
of_node
)
{
ret
=
i2c_hid_of_probe
(
client
,
&
ihid
->
pdata
);
if
(
ret
)
goto
err
;
return
ret
;
}
else
if
(
!
platform_data
)
{
ret
=
i2c_hid_acpi_pdata
(
client
,
&
ihid
->
pdata
);
if
(
ret
)
goto
err
;
return
ret
;
}
else
{
ihid
->
pdata
=
*
platform_data
;
}
...
...
@@ -1021,21 +1021,20 @@ static int i2c_hid_probe(struct i2c_client *client,
/* Parse platform agnostic common properties from ACPI / device tree */
i2c_hid_fwnode_probe
(
client
,
&
ihid
->
pdata
);
ihid
->
pdata
.
supply
=
devm_regulator_get
(
&
client
->
dev
,
"vdd"
);
if
(
IS_ERR
(
ihid
->
pdata
.
supply
))
{
ret
=
PTR_ERR
(
ihid
->
pdata
.
supply
);
if
(
ret
!=
-
EPROBE_DEFER
)
dev_err
(
&
client
->
dev
,
"Failed to get regulator: %d
\n
"
,
ret
);
goto
err
;
}
ihid
->
pdata
.
supplies
[
0
].
supply
=
"vdd"
;
ihid
->
pdata
.
supplies
[
1
].
supply
=
"vddl"
;
ret
=
devm_regulator_bulk_get
(
&
client
->
dev
,
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
if
(
ret
)
return
ret
;
ret
=
regulator_bulk_enable
(
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
if
(
ret
<
0
)
return
ret
;
ret
=
regulator_enable
(
ihid
->
pdata
.
supply
);
if
(
ret
<
0
)
{
dev_err
(
&
client
->
dev
,
"Failed to enable regulator: %d
\n
"
,
ret
);
goto
err
;
}
if
(
ihid
->
pdata
.
post_power_delay_ms
)
msleep
(
ihid
->
pdata
.
post_power_delay_ms
);
...
...
@@ -1122,11 +1121,9 @@ static int i2c_hid_probe(struct i2c_client *client,
pm_runtime_disable
(
&
client
->
dev
);
err_regulator:
regulator_disable
(
ihid
->
pdata
.
supply
);
err:
regulator_bulk_disable
(
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
i2c_hid_free_buffers
(
ihid
);
kfree
(
ihid
);
return
ret
;
}
...
...
@@ -1148,9 +1145,8 @@ static int i2c_hid_remove(struct i2c_client *client)
if
(
ihid
->
bufsize
)
i2c_hid_free_buffers
(
ihid
);
regulator_disable
(
ihid
->
pdata
.
supply
);
kfree
(
ihid
);
regulator_bulk_disable
(
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
return
0
;
}
...
...
@@ -1201,9 +1197,8 @@ static int i2c_hid_suspend(struct device *dev)
hid_warn
(
hid
,
"Failed to enable irq wake: %d
\n
"
,
wake_status
);
}
else
{
ret
=
regulator_disable
(
ihid
->
pdata
.
supply
);
if
(
ret
<
0
)
hid_warn
(
hid
,
"Failed to disable supply: %d
\n
"
,
ret
);
regulator_bulk_disable
(
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
}
return
0
;
...
...
@@ -1218,9 +1213,11 @@ static int i2c_hid_resume(struct device *dev)
int
wake_status
;
if
(
!
device_may_wakeup
(
&
client
->
dev
))
{
ret
=
regulator_enable
(
ihid
->
pdata
.
supply
);
if
(
ret
<
0
)
hid_warn
(
hid
,
"Failed to enable supply: %d
\n
"
,
ret
);
ret
=
regulator_bulk_enable
(
ARRAY_SIZE
(
ihid
->
pdata
.
supplies
),
ihid
->
pdata
.
supplies
);
if
(
ret
)
hid_warn
(
hid
,
"Failed to enable supplies: %d
\n
"
,
ret
);
if
(
ihid
->
pdata
.
post_power_delay_ms
)
msleep
(
ihid
->
pdata
.
post_power_delay_ms
);
}
else
if
(
ihid
->
irq_wake_enabled
)
{
...
...
include/linux/platform_data/i2c-hid.h
View file @
4435b577
...
...
@@ -12,14 +12,13 @@
#ifndef __LINUX_I2C_HID_H
#define __LINUX_I2C_HID_H
#include <linux/regulator/consumer.h>
#include <linux/types.h>
struct
regulator
;
/**
* struct i2chid_platform_data - used by hid over i2c implementation.
* @hid_descriptor_address: i2c register where the HID descriptor is stored.
* @suppl
y: regulator
for powering on the device.
* @suppl
ies: regulators
for powering on the device.
* @post_power_delay_ms: delay after powering on before device is usable.
*
* Note that it is the responsibility of the platform driver (or the acpi 5.0
...
...
@@ -35,7 +34,7 @@ struct regulator;
*/
struct
i2c_hid_platform_data
{
u16
hid_descriptor_address
;
struct
regulator
*
supply
;
struct
regulator
_bulk_data
supplies
[
2
]
;
int
post_power_delay_ms
;
};
...
...
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