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
6ad94e95
Commit
6ad94e95
authored
Oct 03, 2019
by
Linus Walleij
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'ib-fwnode-gpiod-get-index' into devel
parents
f8b410e3
13949fa9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
101 additions
and
34 deletions
+101
-34
drivers/gpio/gpiolib-devres.c
drivers/gpio/gpiolib-devres.c
+9
-24
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.c
+48
-0
include/linux/gpio/consumer.h
include/linux/gpio/consumer.h
+44
-10
No files found.
drivers/gpio/gpiolib-devres.c
View file @
6ad94e95
...
...
@@ -185,12 +185,11 @@ struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
EXPORT_SYMBOL_GPL
(
devm_gpiod_get_from_of_node
);
/**
* devm_fwnode_get_index_gpiod_from_child - get a GPIO descriptor from a
* device's child node
* devm_fwnode_gpiod_get_index - get a GPIO descriptor from a given node
* @dev: GPIO consumer
* @fwnode: firmware node containing GPIO reference
* @con_id: function within the GPIO consumer
* @index: index of the GPIO to obtain in the consumer
* @child: firmware node (child of @dev)
* @flags: GPIO initialization flags
* @label: label to attach to the requested GPIO
*
...
...
@@ -200,35 +199,21 @@ EXPORT_SYMBOL_GPL(devm_gpiod_get_from_of_node);
* On successful request the GPIO pin is configured in accordance with
* provided @flags.
*/
struct
gpio_desc
*
devm_fwnode_g
et_index_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
int
index
,
struct
fwnode_handle
*
child
,
enum
gpiod_flags
flags
,
const
char
*
label
)
struct
gpio_desc
*
devm_fwnode_g
piod_get_index
(
struct
device
*
dev
,
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
char
prop_name
[
32
];
/* 32 is max size of property name */
struct
gpio_desc
**
dr
;
struct
gpio_desc
*
desc
;
unsigned
int
i
;
dr
=
devres_alloc
(
devm_gpiod_release
,
sizeof
(
struct
gpio_desc
*
),
GFP_KERNEL
);
if
(
!
dr
)
return
ERR_PTR
(
-
ENOMEM
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
gpio_suffixes
);
i
++
)
{
if
(
con_id
)
snprintf
(
prop_name
,
sizeof
(
prop_name
),
"%s-%s"
,
con_id
,
gpio_suffixes
[
i
]);
else
snprintf
(
prop_name
,
sizeof
(
prop_name
),
"%s"
,
gpio_suffixes
[
i
]);
desc
=
fwnode_get_named_gpiod
(
child
,
prop_name
,
index
,
flags
,
label
);
if
(
!
IS_ERR
(
desc
)
||
(
PTR_ERR
(
desc
)
!=
-
ENOENT
))
break
;
}
desc
=
fwnode_gpiod_get_index
(
fwnode
,
con_id
,
index
,
flags
,
label
);
if
(
IS_ERR
(
desc
))
{
devres_free
(
dr
);
return
desc
;
...
...
@@ -239,7 +224,7 @@ struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev,
return
desc
;
}
EXPORT_SYMBOL_GPL
(
devm_fwnode_g
et_index_gpiod_from_child
);
EXPORT_SYMBOL_GPL
(
devm_fwnode_g
piod_get_index
);
/**
* devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
...
...
drivers/gpio/gpiolib.c
View file @
6ad94e95
...
...
@@ -4324,6 +4324,54 @@ static int platform_gpio_count(struct device *dev, const char *con_id)
return
count
;
}
/**
* fwnode_gpiod_get_index - obtain a GPIO from firmware node
* @fwnode: handle of the firmware node
* @con_id: function within the GPIO consumer
* @index: index of the GPIO to obtain for the consumer
* @flags: GPIO initialization flags
* @label: label to attach to the requested GPIO
*
* This function can be used for drivers that get their configuration
* from opaque firmware.
*
* The function properly finds the corresponding GPIO using whatever is the
* underlying firmware interface and then makes sure that the GPIO
* descriptor is requested before it is returned to the caller.
*
* Returns:
* On successful request the GPIO pin is configured in accordance with
* provided @flags.
*
* In case of error an ERR_PTR() is returned.
*/
struct
gpio_desc
*
fwnode_gpiod_get_index
(
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
struct
gpio_desc
*
desc
;
char
prop_name
[
32
];
/* 32 is max size of property name */
unsigned
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
gpio_suffixes
);
i
++
)
{
if
(
con_id
)
snprintf
(
prop_name
,
sizeof
(
prop_name
),
"%s-%s"
,
con_id
,
gpio_suffixes
[
i
]);
else
snprintf
(
prop_name
,
sizeof
(
prop_name
),
"%s"
,
gpio_suffixes
[
i
]);
desc
=
fwnode_get_named_gpiod
(
fwnode
,
prop_name
,
index
,
flags
,
label
);
if
(
!
IS_ERR
(
desc
)
||
(
PTR_ERR
(
desc
)
!=
-
ENOENT
))
break
;
}
return
desc
;
}
EXPORT_SYMBOL_GPL
(
fwnode_gpiod_get_index
);
/**
* gpiod_count - return the number of GPIOs associated with a device / function
* or -ENOENT if no GPIO has been assigned to the requested function
...
...
include/linux/gpio/consumer.h
View file @
6ad94e95
...
...
@@ -176,11 +176,15 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
const
char
*
propname
,
int
index
,
enum
gpiod_flags
dflags
,
const
char
*
label
);
struct
gpio_desc
*
devm_fwnode_get_index_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
int
index
,
struct
fwnode_handle
*
child
,
enum
gpiod_flags
flags
,
const
char
*
label
);
struct
gpio_desc
*
fwnode_gpiod_get_index
(
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
);
struct
gpio_desc
*
devm_fwnode_gpiod_get_index
(
struct
device
*
dev
,
struct
fwnode_handle
*
child
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
);
#else
/* CONFIG_GPIOLIB */
...
...
@@ -531,6 +535,38 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
return
ERR_PTR
(
-
ENOSYS
);
}
static
inline
struct
gpio_desc
*
fwnode_gpiod_get_index
(
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
ERR_PTR
(
-
ENOSYS
);
}
static
inline
struct
gpio_desc
*
devm_fwnode_gpiod_get_index
(
struct
device
*
dev
,
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
int
index
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
ERR_PTR
(
-
ENOSYS
);
}
#endif
/* CONFIG_GPIOLIB */
static
inline
struct
gpio_desc
*
devm_fwnode_gpiod_get
(
struct
device
*
dev
,
struct
fwnode_handle
*
fwnode
,
const
char
*
con_id
,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
devm_fwnode_gpiod_get_index
(
dev
,
fwnode
,
con_id
,
0
,
flags
,
label
);
}
static
inline
struct
gpio_desc
*
devm_fwnode_get_index_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
int
index
,
...
...
@@ -538,11 +574,10 @@ struct gpio_desc *devm_fwnode_get_index_gpiod_from_child(struct device *dev,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
ERR_PTR
(
-
ENOSYS
);
return
devm_fwnode_gpiod_get_index
(
dev
,
child
,
con_id
,
index
,
flags
,
label
);
}
#endif
/* CONFIG_GPIOLIB */
static
inline
struct
gpio_desc
*
devm_fwnode_get_gpiod_from_child
(
struct
device
*
dev
,
const
char
*
con_id
,
...
...
@@ -550,8 +585,7 @@ struct gpio_desc *devm_fwnode_get_gpiod_from_child(struct device *dev,
enum
gpiod_flags
flags
,
const
char
*
label
)
{
return
devm_fwnode_get_index_gpiod_from_child
(
dev
,
con_id
,
0
,
child
,
flags
,
label
);
return
devm_fwnode_gpiod_get_index
(
dev
,
child
,
con_id
,
0
,
flags
,
label
);
}
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_OF_GPIO)
...
...
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