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
401c4242
Commit
401c4242
authored
Feb 19, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regulator/topic/core' into regulator-next
parents
0fe3f971
a4d7641f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
110 additions
and
111 deletions
+110
-111
drivers/regulator/core.c
drivers/regulator/core.c
+74
-71
drivers/regulator/devres.c
drivers/regulator/devres.c
+26
-40
drivers/regulator/internal.h
drivers/regulator/internal.h
+10
-0
No files found.
drivers/regulator/core.c
View file @
401c4242
...
...
@@ -1455,12 +1455,14 @@ static struct regulator_dev *regulator_lookup_by_name(const char *name)
* lookup could succeed in the future.
*
* If successful, returns a struct regulator_dev that corresponds to the name
* @supply and with the embedded struct device refcount incremented by one,
* or NULL on failure. The refcount must be dropped by calling put_device().
* @supply and with the embedded struct device refcount incremented by one.
* The refcount must be dropped by calling put_device().
* On failure one of the following ERR-PTR-encoded values is returned:
* -ENODEV if lookup fails permanently, -EPROBE_DEFER if lookup could succeed
* in the future.
*/
static
struct
regulator_dev
*
regulator_dev_lookup
(
struct
device
*
dev
,
const
char
*
supply
,
int
*
ret
)
const
char
*
supply
)
{
struct
regulator_dev
*
r
;
struct
device_node
*
node
;
...
...
@@ -1476,16 +1478,12 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
r
=
of_find_regulator_by_node
(
node
);
if
(
r
)
return
r
;
*
ret
=
-
EPROBE_DEFER
;
return
NULL
;
}
else
{
/*
* If we couldn't even get the node then it's
* not just that the device didn't register
* yet, there's no node and we'll never
* succeed.
* We have a node, but there is no device.
* assume it has not registered yet.
*/
*
ret
=
-
ENODEV
;
return
ERR_PTR
(
-
EPROBE_DEFER
)
;
}
}
...
...
@@ -1506,13 +1504,16 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
if
(
strcmp
(
map
->
supply
,
supply
)
==
0
&&
get_device
(
&
map
->
regulator
->
dev
))
{
mutex_unlock
(
&
regulator_list_mutex
)
;
return
map
->
regulator
;
r
=
map
->
regulator
;
break
;
}
}
mutex_unlock
(
&
regulator_list_mutex
);
return
NULL
;
if
(
r
)
return
r
;
return
ERR_PTR
(
-
ENODEV
);
}
static
int
regulator_resolve_supply
(
struct
regulator_dev
*
rdev
)
...
...
@@ -1529,8 +1530,10 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
if
(
rdev
->
supply
)
return
0
;
r
=
regulator_dev_lookup
(
dev
,
rdev
->
supply_name
,
&
ret
);
if
(
!
r
)
{
r
=
regulator_dev_lookup
(
dev
,
rdev
->
supply_name
);
if
(
IS_ERR
(
r
))
{
ret
=
PTR_ERR
(
r
);
if
(
ret
==
-
ENODEV
)
{
/*
* No supply was specified for this regulator and
...
...
@@ -1580,69 +1583,72 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
}
/* Internal regulator request function */
st
atic
st
ruct
regulator
*
_regulator_get
(
struct
device
*
dev
,
const
char
*
id
,
bool
exclusive
,
bool
allow_dummy
)
struct
regulator
*
_regulator_get
(
struct
device
*
dev
,
const
char
*
id
,
enum
regulator_get_type
get_type
)
{
struct
regulator_dev
*
rdev
;
struct
regulator
*
regulator
=
ERR_PTR
(
-
EPROBE_DEFER
)
;
const
char
*
devname
=
NULL
;
struct
regulator
*
regulator
;
const
char
*
devname
=
dev
?
dev_name
(
dev
)
:
"deviceless"
;
int
ret
;
if
(
get_type
>=
MAX_GET_TYPE
)
{
dev_err
(
dev
,
"invalid type %d in %s
\n
"
,
get_type
,
__func__
);
return
ERR_PTR
(
-
EINVAL
);
}
if
(
id
==
NULL
)
{
pr_err
(
"get() with no identifier
\n
"
);
return
ERR_PTR
(
-
EINVAL
);
}
if
(
dev
)
devname
=
dev_name
(
dev
);
if
(
have_full_constraints
())
ret
=
-
ENODEV
;
else
ret
=
-
EPROBE_DEFER
;
rdev
=
regulator_dev_lookup
(
dev
,
id
,
&
ret
);
if
(
rdev
)
goto
found
;
rdev
=
regulator_dev_lookup
(
dev
,
id
);
if
(
IS_ERR
(
rdev
))
{
ret
=
PTR_ERR
(
rdev
);
regulator
=
ERR_PTR
(
ret
);
/*
* If regulator_dev_lookup() fails with error other
* than -ENODEV our job here is done, we simply return it.
*/
if
(
ret
!=
-
ENODEV
)
return
ERR_PTR
(
ret
);
/*
* If we have return value from dev_lookup fail, we do not expect to
* succeed, so, quit with appropriate error value
*/
if
(
ret
&&
ret
!=
-
ENODEV
)
return
regulator
;
if
(
!
have_full_constraints
())
{
dev_warn
(
dev
,
"incomplete constraints, dummy supplies not allowed
\n
"
);
return
ERR_PTR
(
-
ENODEV
);
}
if
(
!
devname
)
devname
=
"deviceless"
;
switch
(
get_type
)
{
case
NORMAL_GET
:
/*
* Assume that a regulator is physically present and
* enabled, even if it isn't hooked up, and just
* provide a dummy.
*/
dev_warn
(
dev
,
"%s supply %s not found, using dummy regulator
\n
"
,
devname
,
id
);
rdev
=
dummy_regulator_rdev
;
get_device
(
&
rdev
->
dev
);
break
;
/*
* Assume that a regulator is physically present and enabled
* even if it isn't hooked up and just provide a dummy.
*/
if
(
have_full_constraints
()
&&
allow_dummy
)
{
pr_warn
(
"%s supply %s not found, using dummy regulator
\n
"
,
devname
,
id
);
case
EXCLUSIVE_GET
:
dev_warn
(
dev
,
"dummy supplies not allowed for exclusive requests
\n
"
);
/* fall through */
rdev
=
dummy_regulator_rdev
;
get_device
(
&
rdev
->
dev
);
goto
found
;
/* Don't log an error when called from regulator_get_optional() */
}
else
if
(
!
have_full_constraints
()
||
exclusive
)
{
dev_warn
(
dev
,
"dummy supplies not allowed
\n
"
);
default:
return
ERR_PTR
(
-
ENODEV
);
}
}
return
regulator
;
found:
if
(
rdev
->
exclusive
)
{
regulator
=
ERR_PTR
(
-
EPERM
);
put_device
(
&
rdev
->
dev
);
return
regulator
;
}
if
(
exclusive
&&
rdev
->
open_count
)
{
if
(
get_type
==
EXCLUSIVE_GET
&&
rdev
->
open_count
)
{
regulator
=
ERR_PTR
(
-
EBUSY
);
put_device
(
&
rdev
->
dev
);
return
regulator
;
...
...
@@ -1656,6 +1662,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
}
if
(
!
try_module_get
(
rdev
->
owner
))
{
regulator
=
ERR_PTR
(
-
EPROBE_DEFER
);
put_device
(
&
rdev
->
dev
);
return
regulator
;
}
...
...
@@ -1669,7 +1676,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
}
rdev
->
open_count
++
;
if
(
exclusive
)
{
if
(
get_type
==
EXCLUSIVE_GET
)
{
rdev
->
exclusive
=
1
;
ret
=
_regulator_is_enabled
(
rdev
);
...
...
@@ -1697,7 +1704,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
*/
struct
regulator
*
regulator_get
(
struct
device
*
dev
,
const
char
*
id
)
{
return
_regulator_get
(
dev
,
id
,
false
,
true
);
return
_regulator_get
(
dev
,
id
,
NORMAL_GET
);
}
EXPORT_SYMBOL_GPL
(
regulator_get
);
...
...
@@ -1724,7 +1731,7 @@ EXPORT_SYMBOL_GPL(regulator_get);
*/
struct
regulator
*
regulator_get_exclusive
(
struct
device
*
dev
,
const
char
*
id
)
{
return
_regulator_get
(
dev
,
id
,
true
,
false
);
return
_regulator_get
(
dev
,
id
,
EXCLUSIVE_GET
);
}
EXPORT_SYMBOL_GPL
(
regulator_get_exclusive
);
...
...
@@ -1750,7 +1757,7 @@ EXPORT_SYMBOL_GPL(regulator_get_exclusive);
*/
struct
regulator
*
regulator_get_optional
(
struct
device
*
dev
,
const
char
*
id
)
{
return
_regulator_get
(
dev
,
id
,
false
,
false
);
return
_regulator_get
(
dev
,
id
,
OPTIONAL_GET
);
}
EXPORT_SYMBOL_GPL
(
regulator_get_optional
);
...
...
@@ -3660,7 +3667,7 @@ int regulator_bulk_disable(int num_consumers,
for
(
++
i
;
i
<
num_consumers
;
++
i
)
{
r
=
regulator_enable
(
consumers
[
i
].
consumer
);
if
(
r
!=
0
)
pr_err
(
"Failed to re
enam
e %s: %d
\n
"
,
pr_err
(
"Failed to re
-enabl
e %s: %d
\n
"
,
consumers
[
i
].
supply
,
r
);
}
...
...
@@ -3686,21 +3693,17 @@ int regulator_bulk_force_disable(int num_consumers,
struct
regulator_bulk_data
*
consumers
)
{
int
i
;
int
ret
;
int
ret
=
0
;
for
(
i
=
0
;
i
<
num_consumers
;
i
++
)
for
(
i
=
0
;
i
<
num_consumers
;
i
++
)
{
consumers
[
i
].
ret
=
regulator_force_disable
(
consumers
[
i
].
consumer
);
for
(
i
=
0
;
i
<
num_consumers
;
i
++
)
{
if
(
consumers
[
i
].
ret
!=
0
)
{
/* Store first error for reporting */
if
(
consumers
[
i
].
ret
&&
!
ret
)
ret
=
consumers
[
i
].
ret
;
goto
out
;
}
}
return
0
;
out:
return
ret
;
}
EXPORT_SYMBOL_GPL
(
regulator_bulk_force_disable
);
...
...
drivers/regulator/devres.c
View file @
401c4242
...
...
@@ -19,12 +19,6 @@
#include "internal.h"
enum
{
NORMAL_GET
,
EXCLUSIVE_GET
,
OPTIONAL_GET
,
};
static
void
devm_regulator_release
(
struct
device
*
dev
,
void
*
res
)
{
regulator_put
(
*
(
struct
regulator
**
)
res
);
...
...
@@ -39,20 +33,7 @@ static struct regulator *_devm_regulator_get(struct device *dev, const char *id,
if
(
!
ptr
)
return
ERR_PTR
(
-
ENOMEM
);
switch
(
get_type
)
{
case
NORMAL_GET
:
regulator
=
regulator_get
(
dev
,
id
);
break
;
case
EXCLUSIVE_GET
:
regulator
=
regulator_get_exclusive
(
dev
,
id
);
break
;
case
OPTIONAL_GET
:
regulator
=
regulator_get_optional
(
dev
,
id
);
break
;
default:
regulator
=
ERR_PTR
(
-
EINVAL
);
}
regulator
=
_regulator_get
(
dev
,
id
,
get_type
);
if
(
!
IS_ERR
(
regulator
))
{
*
ptr
=
regulator
;
devres_add
(
dev
,
ptr
);
...
...
@@ -139,6 +120,18 @@ void devm_regulator_put(struct regulator *regulator)
}
EXPORT_SYMBOL_GPL
(
devm_regulator_put
);
struct
regulator_bulk_devres
{
struct
regulator_bulk_data
*
consumers
;
int
num_consumers
;
};
static
void
devm_regulator_bulk_release
(
struct
device
*
dev
,
void
*
res
)
{
struct
regulator_bulk_devres
*
devres
=
res
;
regulator_bulk_free
(
devres
->
num_consumers
,
devres
->
consumers
);
}
/**
* devm_regulator_bulk_get - managed get multiple regulator consumers
*
...
...
@@ -157,29 +150,22 @@ EXPORT_SYMBOL_GPL(devm_regulator_put);
int
devm_regulator_bulk_get
(
struct
device
*
dev
,
int
num_consumers
,
struct
regulator_bulk_data
*
consumers
)
{
int
i
;
struct
regulator_bulk_devres
*
devres
;
int
ret
;
for
(
i
=
0
;
i
<
num_consumers
;
i
++
)
consumers
[
i
].
consumer
=
NULL
;
for
(
i
=
0
;
i
<
num_consumers
;
i
++
)
{
consumers
[
i
].
consumer
=
devm_regulator_get
(
dev
,
consumers
[
i
].
supply
);
if
(
IS_ERR
(
consumers
[
i
].
consumer
))
{
ret
=
PTR_ERR
(
consumers
[
i
].
consumer
);
dev_err
(
dev
,
"Failed to get supply '%s': %d
\n
"
,
consumers
[
i
].
supply
,
ret
);
consumers
[
i
].
consumer
=
NULL
;
goto
err
;
}
}
return
0
;
devres
=
devres_alloc
(
devm_regulator_bulk_release
,
sizeof
(
*
devres
),
GFP_KERNEL
);
if
(
!
devres
)
return
-
ENOMEM
;
err:
for
(
i
=
0
;
i
<
num_consumers
&&
consumers
[
i
].
consumer
;
i
++
)
devm_regulator_put
(
consumers
[
i
].
consumer
);
ret
=
regulator_bulk_get
(
dev
,
num_consumers
,
consumers
);
if
(
!
ret
)
{
devres
->
consumers
=
consumers
;
devres
->
num_consumers
=
num_consumers
;
devres_add
(
dev
,
devres
);
}
else
{
devres_free
(
devres
);
}
return
ret
;
}
...
...
drivers/regulator/internal.h
View file @
401c4242
...
...
@@ -51,4 +51,14 @@ regulator_of_get_init_data(struct device *dev,
}
#endif
enum
regulator_get_type
{
NORMAL_GET
,
EXCLUSIVE_GET
,
OPTIONAL_GET
,
MAX_GET_TYPE
};
struct
regulator
*
_regulator_get
(
struct
device
*
dev
,
const
char
*
id
,
enum
regulator_get_type
get_type
);
#endif
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