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
3a557878
Commit
3a557878
authored
Sep 16, 2020
by
Viresh Kumar
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'opp/defer-probe' into HEAD
parents
8aaf6264
90d46d71
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
68 additions
and
44 deletions
+68
-44
drivers/base/power/domain.c
drivers/base/power/domain.c
+8
-6
drivers/opp/core.c
drivers/opp/core.c
+31
-22
drivers/opp/of.c
drivers/opp/of.c
+28
-15
drivers/soc/samsung/exynos-asv.c
drivers/soc/samsung/exynos-asv.c
+1
-1
No files found.
drivers/base/power/domain.c
View file @
3a557878
...
...
@@ -2044,8 +2044,9 @@ int of_genpd_add_provider_simple(struct device_node *np,
if
(
genpd
->
set_performance_state
)
{
ret
=
dev_pm_opp_of_add_table
(
&
genpd
->
dev
);
if
(
ret
)
{
dev_err
(
&
genpd
->
dev
,
"Failed to add OPP table: %d
\n
"
,
ret
);
if
(
ret
!=
-
EPROBE_DEFER
)
dev_err
(
&
genpd
->
dev
,
"Failed to add OPP table: %d
\n
"
,
ret
);
goto
unlock
;
}
...
...
@@ -2054,7 +2055,7 @@ int of_genpd_add_provider_simple(struct device_node *np,
* state.
*/
genpd
->
opp_table
=
dev_pm_opp_get_opp_table
(
&
genpd
->
dev
);
WARN_ON
(
!
genpd
->
opp_table
);
WARN_ON
(
IS_ERR
(
genpd
->
opp_table
)
);
}
ret
=
genpd_add_provider
(
np
,
genpd_xlate_simple
,
genpd
);
...
...
@@ -2111,8 +2112,9 @@ int of_genpd_add_provider_onecell(struct device_node *np,
if
(
genpd
->
set_performance_state
)
{
ret
=
dev_pm_opp_of_add_table_indexed
(
&
genpd
->
dev
,
i
);
if
(
ret
)
{
dev_err
(
&
genpd
->
dev
,
"Failed to add OPP table for index %d: %d
\n
"
,
i
,
ret
);
if
(
ret
!=
-
EPROBE_DEFER
)
dev_err
(
&
genpd
->
dev
,
"Failed to add OPP table for index %d: %d
\n
"
,
i
,
ret
);
goto
error
;
}
...
...
@@ -2121,7 +2123,7 @@ int of_genpd_add_provider_onecell(struct device_node *np,
* performance state.
*/
genpd
->
opp_table
=
dev_pm_opp_get_opp_table_indexed
(
&
genpd
->
dev
,
i
);
WARN_ON
(
!
genpd
->
opp_table
);
WARN_ON
(
IS_ERR
(
genpd
->
opp_table
)
);
}
genpd
->
provider
=
&
np
->
fwnode
;
...
...
drivers/opp/core.c
View file @
3a557878
...
...
@@ -1068,7 +1068,7 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
*/
opp_table
=
kzalloc
(
sizeof
(
*
opp_table
),
GFP_KERNEL
);
if
(
!
opp_table
)
return
NULL
;
return
ERR_PTR
(
-
ENOMEM
)
;
mutex_init
(
&
opp_table
->
lock
);
mutex_init
(
&
opp_table
->
genpd_virt_dev_lock
);
...
...
@@ -1079,8 +1079,8 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
opp_dev
=
_add_opp_dev
(
dev
,
opp_table
);
if
(
!
opp_dev
)
{
kfree
(
opp_table
)
;
return
NULL
;
ret
=
-
ENOMEM
;
goto
err
;
}
_of_init_opp_table
(
opp_table
,
dev
,
index
);
...
...
@@ -1089,16 +1089,21 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
opp_table
->
clk
=
clk_get
(
dev
,
NULL
);
if
(
IS_ERR
(
opp_table
->
clk
))
{
ret
=
PTR_ERR
(
opp_table
->
clk
);
if
(
ret
!=
-
EPROBE_DEFER
)
dev_dbg
(
dev
,
"%s: Couldn't find clock: %d
\n
"
,
__func__
,
ret
);
if
(
ret
==
-
EPROBE_DEFER
)
goto
err
;
dev_dbg
(
dev
,
"%s: Couldn't find clock: %d
\n
"
,
__func__
,
ret
);
}
/* Find interconnect path(s) for the device */
ret
=
dev_pm_opp_of_find_icc_paths
(
dev
,
opp_table
);
if
(
ret
)
if
(
ret
)
{
if
(
ret
==
-
EPROBE_DEFER
)
goto
err
;
dev_warn
(
dev
,
"%s: Error finding interconnect paths: %d
\n
"
,
__func__
,
ret
);
}
BLOCKING_INIT_NOTIFIER_HEAD
(
&
opp_table
->
head
);
INIT_LIST_HEAD
(
&
opp_table
->
opp_list
);
...
...
@@ -1107,6 +1112,10 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
/* Secure the device table modification */
list_add
(
&
opp_table
->
node
,
&
opp_tables
);
return
opp_table
;
err:
kfree
(
opp_table
);
return
ERR_PTR
(
ret
);
}
void
_get_opp_table_kref
(
struct
opp_table
*
opp_table
)
...
...
@@ -1129,7 +1138,7 @@ static struct opp_table *_opp_get_opp_table(struct device *dev, int index)
if
(
opp_table
)
{
if
(
!
_add_opp_dev_unlocked
(
dev
,
opp_table
))
{
dev_pm_opp_put_opp_table
(
opp_table
);
opp_table
=
NULL
;
opp_table
=
ERR_PTR
(
-
ENOMEM
)
;
}
goto
unlock
;
}
...
...
@@ -1573,8 +1582,8 @@ struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
struct
opp_table
*
opp_table
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
IS_ERR
(
opp_table
)
)
return
opp_table
;
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON
(
!
list_empty
(
&
opp_table
->
opp_list
));
...
...
@@ -1632,8 +1641,8 @@ struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
struct
opp_table
*
opp_table
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
IS_ERR
(
opp_table
)
)
return
opp_table
;
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON
(
!
list_empty
(
&
opp_table
->
opp_list
));
...
...
@@ -1725,8 +1734,8 @@ struct opp_table *dev_pm_opp_set_regulators(struct device *dev,
int
ret
,
i
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
IS_ERR
(
opp_table
)
)
return
opp_table
;
/* This should be called before OPPs are initialized */
if
(
WARN_ON
(
!
list_empty
(
&
opp_table
->
opp_list
)))
{
...
...
@@ -1833,8 +1842,8 @@ struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name)
int
ret
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
IS_ERR
(
opp_table
)
)
return
opp_table
;
/* This should be called before OPPs are initialized */
if
(
WARN_ON
(
!
list_empty
(
&
opp_table
->
opp_list
)))
{
...
...
@@ -1901,8 +1910,8 @@ struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
return
ERR_PTR
(
-
EINVAL
);
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
!
IS_ERR
(
opp_table
)
)
return
opp_table
;
/* This should be called before OPPs are initialized */
if
(
WARN_ON
(
!
list_empty
(
&
opp_table
->
opp_list
)))
{
...
...
@@ -1982,8 +1991,8 @@ struct opp_table *dev_pm_opp_attach_genpd(struct device *dev,
const
char
**
name
=
names
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
ERR_PTR
(
-
ENOMEM
)
;
if
(
IS_ERR
(
opp_table
)
)
return
opp_table
;
/*
* If the genpd's OPP table isn't already initialized, parsing of the
...
...
@@ -2153,8 +2162,8 @@ int dev_pm_opp_add(struct device *dev, unsigned long freq, unsigned long u_volt)
int
ret
;
opp_table
=
dev_pm_opp_get_opp_table
(
dev
);
if
(
!
opp_table
)
return
-
ENOMEM
;
if
(
IS_ERR
(
opp_table
)
)
return
PTR_ERR
(
opp_table
)
;
/* Fix regulator count for dynamic OPPs */
opp_table
->
regulator_count
=
1
;
...
...
drivers/opp/of.c
View file @
3a557878
...
...
@@ -886,11 +886,25 @@ static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
const
__be32
*
val
;
int
nr
,
ret
=
0
;
mutex_lock
(
&
opp_table
->
lock
);
if
(
opp_table
->
parsed_static_opps
)
{
opp_table
->
parsed_static_opps
++
;
mutex_unlock
(
&
opp_table
->
lock
);
return
0
;
}
opp_table
->
parsed_static_opps
=
1
;
mutex_unlock
(
&
opp_table
->
lock
);
prop
=
of_find_property
(
dev
->
of_node
,
"operating-points"
,
NULL
);
if
(
!
prop
)
return
-
ENODEV
;
if
(
!
prop
->
value
)
return
-
ENODATA
;
if
(
!
prop
)
{
ret
=
-
ENODEV
;
goto
remove_static_opp
;
}
if
(
!
prop
->
value
)
{
ret
=
-
ENODATA
;
goto
remove_static_opp
;
}
/*
* Each OPP is a set of tuples consisting of frequency and
...
...
@@ -899,13 +913,10 @@ static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
nr
=
prop
->
length
/
sizeof
(
u32
);
if
(
nr
%
2
)
{
dev_err
(
dev
,
"%s: Invalid OPP table
\n
"
,
__func__
);
return
-
EINVAL
;
ret
=
-
EINVAL
;
goto
remove_static_opp
;
}
mutex_lock
(
&
opp_table
->
lock
);
opp_table
->
parsed_static_opps
=
1
;
mutex_unlock
(
&
opp_table
->
lock
);
val
=
prop
->
value
;
while
(
nr
)
{
unsigned
long
freq
=
be32_to_cpup
(
val
++
)
*
1000
;
...
...
@@ -915,12 +926,14 @@ static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
if
(
ret
)
{
dev_err
(
dev
,
"%s: Failed to add OPP %ld (%d)
\n
"
,
__func__
,
freq
,
ret
);
_opp_remove_all_static
(
opp_table
);
return
ret
;
goto
remove_static_opp
;
}
nr
-=
2
;
}
remove_static_opp:
_opp_remove_all_static
(
opp_table
);
return
ret
;
}
...
...
@@ -947,8 +960,8 @@ int dev_pm_opp_of_add_table(struct device *dev)
int
ret
;
opp_table
=
dev_pm_opp_get_opp_table_indexed
(
dev
,
0
);
if
(
!
opp_table
)
return
-
ENOMEM
;
if
(
IS_ERR
(
opp_table
)
)
return
PTR_ERR
(
opp_table
)
;
/*
* OPPs have two version of bindings now. Also try the old (v1)
...
...
@@ -1002,8 +1015,8 @@ int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
}
opp_table
=
dev_pm_opp_get_opp_table_indexed
(
dev
,
index
);
if
(
!
opp_table
)
return
-
ENOMEM
;
if
(
IS_ERR
(
opp_table
)
)
return
PTR_ERR
(
opp_table
)
;
ret
=
_of_add_opp_table_v2
(
dev
,
opp_table
);
if
(
ret
)
...
...
drivers/soc/samsung/exynos-asv.c
View file @
3a557878
...
...
@@ -93,7 +93,7 @@ static int exynos_asv_update_opps(struct exynos_asv *asv)
continue
;
opp_table
=
dev_pm_opp_get_opp_table
(
cpu
);
if
(
IS_ERR
_OR_NULL
(
opp_table
))
if
(
IS_ERR
(
opp_table
))
continue
;
if
(
!
last_opp_table
||
opp_table
!=
last_opp_table
)
{
...
...
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