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
8c541b11
Commit
8c541b11
authored
Jan 26, 2017
by
Linus Walleij
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ib-gpiod-flags' into devel
parents
49cec4d8
b2987d74
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
64 additions
and
46 deletions
+64
-46
drivers/gpio/devres.c
drivers/gpio/devres.c
+8
-2
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.c
+18
-5
drivers/input/keyboard/gpio_keys.c
drivers/input/keyboard/gpio_keys.c
+2
-8
drivers/input/keyboard/gpio_keys_polled.c
drivers/input/keyboard/gpio_keys_polled.c
+3
-9
drivers/leds/leds-gpio.c
drivers/leds/leds-gpio.c
+7
-6
drivers/video/fbdev/amba-clcd-nomadik.c
drivers/video/fbdev/amba-clcd-nomadik.c
+9
-10
include/linux/gpio/consumer.h
include/linux/gpio/consumer.h
+17
-6
No files found.
drivers/gpio/devres.c
View file @
8c541b11
...
...
@@ -129,13 +129,19 @@ EXPORT_SYMBOL(devm_gpiod_get_index);
* @dev: GPIO consumer
* @con_id: function within the GPIO consumer
* @child: firmware node (child of @dev)
* @flags: GPIO initialization flags
*
* GPIO descriptors returned from this function are automatically disposed on
* driver detach.
*
* On successfull request the GPIO pin is configured in accordance with
* provided @flags.
*/
struct
gpio_desc
*
devm_get_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
struct
fwnode_handle
*
child
)
struct
fwnode_handle
*
child
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
char
prop_name
[
32
];
/* 32 is max size of property name */
struct
gpio_desc
**
dr
;
...
...
@@ -155,7 +161,7 @@ struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
snprintf
(
prop_name
,
sizeof
(
prop_name
),
"%s"
,
gpio_suffixes
[
i
]);
desc
=
fwnode_get_named_gpiod
(
child
,
prop_name
);
desc
=
fwnode_get_named_gpiod
(
child
,
prop_name
,
flags
,
label
);
if
(
!
IS_ERR
(
desc
)
||
(
PTR_ERR
(
desc
)
!=
-
ENOENT
))
break
;
}
...
...
drivers/gpio/gpiolib.c
View file @
8c541b11
...
...
@@ -3301,6 +3301,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_index);
* fwnode_get_named_gpiod - obtain a GPIO from firmware node
* @fwnode: handle of the firmware node
* @propname: name of the firmware property representing the GPIO
* @dflags: GPIO initialization flags
*
* This function can be used for drivers that get their configuration
* from firmware.
...
...
@@ -3309,12 +3310,18 @@ EXPORT_SYMBOL_GPL(gpiod_get_index);
* underlying firmware interface and then makes sure that the GPIO
* descriptor is requested before it is returned to the caller.
*
* On successfull request the GPIO pin is configured in accordance with
* provided @dflags.
*
* In case of error an ERR_PTR() is returned.
*/
struct
gpio_desc
*
fwnode_get_named_gpiod
(
struct
fwnode_handle
*
fwnode
,
const
char
*
propname
)
const
char
*
propname
,
enum
gpiod_flags
dflags
,
const
char
*
label
)
{
struct
gpio_desc
*
desc
=
ERR_PTR
(
-
ENODEV
);
unsigned
long
lflags
=
0
;
bool
active_low
=
false
;
bool
single_ended
=
false
;
int
ret
;
...
...
@@ -3342,18 +3349,24 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
if
(
IS_ERR
(
desc
))
return
desc
;
ret
=
gpiod_request
(
desc
,
NULL
);
ret
=
gpiod_request
(
desc
,
label
);
if
(
ret
)
return
ERR_PTR
(
ret
);
if
(
active_low
)
set_bit
(
FLAG_ACTIVE_LOW
,
&
desc
->
flags
)
;
lflags
|=
GPIO_ACTIVE_LOW
;
if
(
single_ended
)
{
if
(
active_low
)
set_bit
(
FLAG_OPEN_DRAIN
,
&
desc
->
flags
)
;
lflags
|=
GPIO_OPEN_DRAIN
;
else
set_bit
(
FLAG_OPEN_SOURCE
,
&
desc
->
flags
);
lflags
|=
GPIO_OPEN_SOURCE
;
}
ret
=
gpiod_configure_flags
(
desc
,
propname
,
lflags
,
dflags
);
if
(
ret
<
0
)
{
gpiod_put
(
desc
);
return
ERR_PTR
(
ret
);
}
return
desc
;
...
...
drivers/input/keyboard/gpio_keys.c
View file @
8c541b11
...
...
@@ -481,7 +481,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
spin_lock_init
(
&
bdata
->
lock
);
if
(
child
)
{
bdata
->
gpiod
=
devm_get_gpiod_from_child
(
dev
,
NULL
,
child
);
bdata
->
gpiod
=
devm_get_gpiod_from_child
(
dev
,
NULL
,
child
,
GPIOD_IN
,
desc
);
if
(
IS_ERR
(
bdata
->
gpiod
))
{
error
=
PTR_ERR
(
bdata
->
gpiod
);
if
(
error
==
-
ENOENT
)
{
...
...
@@ -496,13 +497,6 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
error
);
return
error
;
}
}
else
{
error
=
gpiod_direction_input
(
bdata
->
gpiod
);
if
(
error
)
{
dev_err
(
dev
,
"Failed to configure GPIO %d as input: %d
\n
"
,
desc_to_gpio
(
bdata
->
gpiod
),
error
);
return
error
;
}
}
}
else
if
(
gpio_is_valid
(
button
->
gpio
))
{
/*
...
...
drivers/input/keyboard/gpio_keys_polled.c
View file @
8c541b11
...
...
@@ -304,7 +304,9 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
}
bdata
->
gpiod
=
devm_get_gpiod_from_child
(
dev
,
NULL
,
child
);
child
,
GPIOD_IN
,
button
->
desc
);
if
(
IS_ERR
(
bdata
->
gpiod
))
{
error
=
PTR_ERR
(
bdata
->
gpiod
);
if
(
error
!=
-
EPROBE_DEFER
)
...
...
@@ -314,14 +316,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
fwnode_handle_put
(
child
);
return
error
;
}
error
=
gpiod_direction_input
(
bdata
->
gpiod
);
if
(
error
)
{
dev_err
(
dev
,
"Failed to configure GPIO %d as input: %d
\n
"
,
desc_to_gpio
(
bdata
->
gpiod
),
error
);
fwnode_handle_put
(
child
);
return
error
;
}
}
else
if
(
gpio_is_valid
(
button
->
gpio
))
{
/*
* Legacy GPIO number so request the GPIO here and
...
...
drivers/leds/leds-gpio.c
View file @
8c541b11
...
...
@@ -174,12 +174,6 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
const
char
*
state
=
NULL
;
struct
device_node
*
np
=
to_of_node
(
child
);
led
.
gpiod
=
devm_get_gpiod_from_child
(
dev
,
NULL
,
child
);
if
(
IS_ERR
(
led
.
gpiod
))
{
fwnode_handle_put
(
child
);
return
ERR_CAST
(
led
.
gpiod
);
}
ret
=
fwnode_property_read_string
(
child
,
"label"
,
&
led
.
name
);
if
(
ret
&&
IS_ENABLED
(
CONFIG_OF
)
&&
np
)
led
.
name
=
np
->
name
;
...
...
@@ -188,6 +182,13 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
return
ERR_PTR
(
-
EINVAL
);
}
led
.
gpiod
=
devm_get_gpiod_from_child
(
dev
,
NULL
,
child
,
GPIOD_ASIS
,
led
.
name
);
if
(
IS_ERR
(
led
.
gpiod
))
{
fwnode_handle_put
(
child
);
return
ERR_CAST
(
led
.
gpiod
);
}
fwnode_property_read_string
(
child
,
"linux,default-trigger"
,
&
led
.
default_trigger
);
...
...
drivers/video/fbdev/amba-clcd-nomadik.c
View file @
8c541b11
...
...
@@ -184,32 +184,31 @@ static void tpg110_init(struct device *dev, struct device_node *np,
{
dev_info
(
dev
,
"TPG110 display init
\n
"
);
grestb
=
devm_get_gpiod_from_child
(
dev
,
"grestb"
,
&
np
->
fwnode
);
/* This asserts the GRESTB signal, putting the display into reset */
grestb
=
devm_get_gpiod_from_child
(
dev
,
"grestb"
,
&
np
->
fwnode
,
GPIOD_OUT_HIGH
,
"grestb"
);
if
(
IS_ERR
(
grestb
))
{
dev_err
(
dev
,
"no GRESTB GPIO
\n
"
);
return
;
}
/* This asserts the GRESTB signal, putting the display into reset */
gpiod_direction_output
(
grestb
,
1
);
scen
=
devm_get_gpiod_from_child
(
dev
,
"scen"
,
&
np
->
fwnode
);
scen
=
devm_get_gpiod_from_child
(
dev
,
"scen"
,
&
np
->
fwnode
,
GPIOD_OUT_LOW
,
"scen"
);
if
(
IS_ERR
(
scen
))
{
dev_err
(
dev
,
"no SCEN GPIO
\n
"
);
return
;
}
gpiod_direction_output
(
scen
,
0
);
scl
=
devm_get_gpiod_from_child
(
dev
,
"scl"
,
&
np
->
fwnode
);
scl
=
devm_get_gpiod_from_child
(
dev
,
"scl"
,
&
np
->
fwnode
,
GPIOD_OUT_LOW
,
"scl"
);
if
(
IS_ERR
(
scl
))
{
dev_err
(
dev
,
"no SCL GPIO
\n
"
);
return
;
}
gpiod_direction_output
(
scl
,
0
);
sda
=
devm_get_gpiod_from_child
(
dev
,
"sda"
,
&
np
->
fwnode
);
sda
=
devm_get_gpiod_from_child
(
dev
,
"sda"
,
&
np
->
fwnode
,
GPIOD_OUT_LOW
,
"sda"
);
if
(
IS_ERR
(
sda
))
{
dev_err
(
dev
,
"no SDA GPIO
\n
"
);
return
;
}
gpiod_direction_output
(
sda
,
0
);
board
->
enable
=
tpg110_enable
;
board
->
disable
=
tpg110_disable
;
}
...
...
include/linux/gpio/consumer.h
View file @
8c541b11
...
...
@@ -135,10 +135,14 @@ int desc_to_gpio(const struct gpio_desc *desc);
struct
fwnode_handle
;
struct
gpio_desc
*
fwnode_get_named_gpiod
(
struct
fwnode_handle
*
fwnode
,
const
char
*
propname
);
const
char
*
propname
,
enum
gpiod_flags
dflags
,
const
char
*
label
);
struct
gpio_desc
*
devm_get_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
struct
fwnode_handle
*
child
);
struct
fwnode_handle
*
child
,
enum
gpiod_flags
flags
,
const
char
*
label
);
#else
/* CONFIG_GPIOLIB */
static
inline
int
gpiod_count
(
struct
device
*
dev
,
const
char
*
con_id
)
...
...
@@ -411,14 +415,21 @@ static inline int desc_to_gpio(const struct gpio_desc *desc)
/* Child properties interface */
struct
fwnode_handle
;
static
inline
struct
gpio_desc
*
fwnode_get_named_gpiod
(
struct
fwnode_handle
*
fwnode
,
const
char
*
propname
)
static
inline
struct
gpio_desc
*
fwnode_get_named_gpiod
(
struct
fwnode_handle
*
fwnode
,
const
char
*
propname
,
enum
gpiod_flags
dflags
,
const
char
*
label
)
{
return
ERR_PTR
(
-
ENOSYS
);
}
static
inline
struct
gpio_desc
*
devm_get_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
struct
fwnode_handle
*
child
)
static
inline
struct
gpio_desc
*
devm_get_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
struct
fwnode_handle
*
child
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
ERR_PTR
(
-
ENOSYS
);
}
...
...
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