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
ef9cc993
Commit
ef9cc993
authored
Nov 29, 2014
by
Rafael J. Wysocki
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pm-clk' into pm-runtime
parents
af261127
471f7707
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
32 deletions
+61
-32
drivers/base/power/clock_ops.c
drivers/base/power/clock_ops.c
+53
-32
include/linux/pm_clock.h
include/linux/pm_clock.h
+8
-0
No files found.
drivers/base/power/clock_ops.c
View file @
ef9cc993
...
...
@@ -12,6 +12,7 @@
#include <linux/pm.h>
#include <linux/pm_clock.h>
#include <linux/clk.h>
#include <linux/clkdev.h>
#include <linux/slab.h>
#include <linux/err.h>
...
...
@@ -34,14 +35,20 @@ struct pm_clock_entry {
/**
* pm_clk_enable - Enable a clock, reporting any errors
* @dev: The device for the given clock
* @c
lk: The clock being enabled
.
* @c
e: PM clock entry corresponding to the clock
.
*/
static
inline
int
__pm_clk_enable
(
struct
device
*
dev
,
struct
clk
*
clk
)
static
inline
int
__pm_clk_enable
(
struct
device
*
dev
,
struct
pm_clock_entry
*
ce
)
{
int
ret
=
clk_enable
(
clk
);
if
(
ret
)
dev_err
(
dev
,
"%s: failed to enable clk %p, error %d
\n
"
,
__func__
,
clk
,
ret
);
int
ret
;
if
(
ce
->
status
<
PCE_STATUS_ERROR
)
{
ret
=
clk_enable
(
ce
->
clk
);
if
(
!
ret
)
ce
->
status
=
PCE_STATUS_ENABLED
;
else
dev_err
(
dev
,
"%s: failed to enable clk %p, error %d
\n
"
,
__func__
,
ce
->
clk
,
ret
);
}
return
ret
;
}
...
...
@@ -53,7 +60,8 @@ static inline int __pm_clk_enable(struct device *dev, struct clk *clk)
*/
static
void
pm_clk_acquire
(
struct
device
*
dev
,
struct
pm_clock_entry
*
ce
)
{
ce
->
clk
=
clk_get
(
dev
,
ce
->
con_id
);
if
(
!
ce
->
clk
)
ce
->
clk
=
clk_get
(
dev
,
ce
->
con_id
);
if
(
IS_ERR
(
ce
->
clk
))
{
ce
->
status
=
PCE_STATUS_ERROR
;
}
else
{
...
...
@@ -63,15 +71,8 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce)
}
}
/**
* pm_clk_add - Start using a device clock for power management.
* @dev: Device whose clock is going to be used for power management.
* @con_id: Connection ID of the clock.
*
* Add the clock represented by @con_id to the list of clocks used for
* the power management of @dev.
*/
int
pm_clk_add
(
struct
device
*
dev
,
const
char
*
con_id
)
static
int
__pm_clk_add
(
struct
device
*
dev
,
const
char
*
con_id
,
struct
clk
*
clk
)
{
struct
pm_subsys_data
*
psd
=
dev_to_psd
(
dev
);
struct
pm_clock_entry
*
ce
;
...
...
@@ -93,6 +94,12 @@ int pm_clk_add(struct device *dev, const char *con_id)
kfree
(
ce
);
return
-
ENOMEM
;
}
}
else
{
if
(
IS_ERR
(
ce
->
clk
)
||
!
__clk_get
(
clk
))
{
kfree
(
ce
);
return
-
ENOENT
;
}
ce
->
clk
=
clk
;
}
pm_clk_acquire
(
dev
,
ce
);
...
...
@@ -103,6 +110,32 @@ int pm_clk_add(struct device *dev, const char *con_id)
return
0
;
}
/**
* pm_clk_add - Start using a device clock for power management.
* @dev: Device whose clock is going to be used for power management.
* @con_id: Connection ID of the clock.
*
* Add the clock represented by @con_id to the list of clocks used for
* the power management of @dev.
*/
int
pm_clk_add
(
struct
device
*
dev
,
const
char
*
con_id
)
{
return
__pm_clk_add
(
dev
,
con_id
,
NULL
);
}
/**
* pm_clk_add_clk - Start using a device clock for power management.
* @dev: Device whose clock is going to be used for power management.
* @clk: Clock pointer
*
* Add the clock to the list of clocks used for the power management of @dev.
* It will increment refcount on clock pointer, use clk_put() on it when done.
*/
int
pm_clk_add_clk
(
struct
device
*
dev
,
struct
clk
*
clk
)
{
return
__pm_clk_add
(
dev
,
NULL
,
clk
);
}
/**
* __pm_clk_remove - Destroy PM clock entry.
* @ce: PM clock entry to destroy.
...
...
@@ -266,7 +299,6 @@ int pm_clk_resume(struct device *dev)
struct
pm_subsys_data
*
psd
=
dev_to_psd
(
dev
);
struct
pm_clock_entry
*
ce
;
unsigned
long
flags
;
int
ret
;
dev_dbg
(
dev
,
"%s()
\n
"
,
__func__
);
...
...
@@ -275,13 +307,8 @@ int pm_clk_resume(struct device *dev)
spin_lock_irqsave
(
&
psd
->
lock
,
flags
);
list_for_each_entry
(
ce
,
&
psd
->
clock_list
,
node
)
{
if
(
ce
->
status
<
PCE_STATUS_ERROR
)
{
ret
=
__pm_clk_enable
(
dev
,
ce
->
clk
);
if
(
!
ret
)
ce
->
status
=
PCE_STATUS_ENABLED
;
}
}
list_for_each_entry
(
ce
,
&
psd
->
clock_list
,
node
)
__pm_clk_enable
(
dev
,
ce
);
spin_unlock_irqrestore
(
&
psd
->
lock
,
flags
);
...
...
@@ -390,7 +417,6 @@ int pm_clk_resume(struct device *dev)
struct
pm_subsys_data
*
psd
=
dev_to_psd
(
dev
);
struct
pm_clock_entry
*
ce
;
unsigned
long
flags
;
int
ret
;
dev_dbg
(
dev
,
"%s()
\n
"
,
__func__
);
...
...
@@ -400,13 +426,8 @@ int pm_clk_resume(struct device *dev)
spin_lock_irqsave
(
&
psd
->
lock
,
flags
);
list_for_each_entry
(
ce
,
&
psd
->
clock_list
,
node
)
{
if
(
ce
->
status
<
PCE_STATUS_ERROR
)
{
ret
=
__pm_clk_enable
(
dev
,
ce
->
clk
);
if
(
!
ret
)
ce
->
status
=
PCE_STATUS_ENABLED
;
}
}
list_for_each_entry
(
ce
,
&
psd
->
clock_list
,
node
)
__pm_clk_enable
(
dev
,
ce
);
spin_unlock_irqrestore
(
&
psd
->
lock
,
flags
);
...
...
include/linux/pm_clock.h
View file @
ef9cc993
...
...
@@ -18,6 +18,8 @@ struct pm_clk_notifier_block {
char
*
con_ids
[];
};
struct
clk
;
#ifdef CONFIG_PM_CLK
static
inline
bool
pm_clk_no_clocks
(
struct
device
*
dev
)
{
...
...
@@ -29,6 +31,7 @@ extern void pm_clk_init(struct device *dev);
extern
int
pm_clk_create
(
struct
device
*
dev
);
extern
void
pm_clk_destroy
(
struct
device
*
dev
);
extern
int
pm_clk_add
(
struct
device
*
dev
,
const
char
*
con_id
);
extern
int
pm_clk_add_clk
(
struct
device
*
dev
,
struct
clk
*
clk
);
extern
void
pm_clk_remove
(
struct
device
*
dev
,
const
char
*
con_id
);
extern
int
pm_clk_suspend
(
struct
device
*
dev
);
extern
int
pm_clk_resume
(
struct
device
*
dev
);
...
...
@@ -51,6 +54,11 @@ static inline int pm_clk_add(struct device *dev, const char *con_id)
{
return
-
EINVAL
;
}
static
inline
int
pm_clk_add_clk
(
struct
device
*
dev
,
struct
clk
*
clk
)
{
return
-
EINVAL
;
}
static
inline
void
pm_clk_remove
(
struct
device
*
dev
,
const
char
*
con_id
)
{
}
...
...
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