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
8a3f1f18
Commit
8a3f1f18
authored
Feb 10, 2021
by
Rafael J. Wysocki
Browse files
Options
Browse Files
Download
Plain Diff
Merge back cpufreq updates for v5.12.
parents
d11a1d08
7ac839a0
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
99 additions
and
138 deletions
+99
-138
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Kconfig.arm
+0
-5
drivers/cpufreq/Makefile
drivers/cpufreq/Makefile
+0
-1
drivers/cpufreq/brcmstb-avs-cpufreq.c
drivers/cpufreq/brcmstb-avs-cpufreq.c
+17
-7
drivers/cpufreq/cpufreq-dt-platdev.c
drivers/cpufreq/cpufreq-dt-platdev.c
+0
-2
drivers/cpufreq/cpufreq-dt.c
drivers/cpufreq/cpufreq-dt.c
+1
-1
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+1
-2
drivers/cpufreq/davinci-cpufreq.c
drivers/cpufreq/davinci-cpufreq.c
+1
-1
drivers/cpufreq/intel_pstate.c
drivers/cpufreq/intel_pstate.c
+24
-22
drivers/cpufreq/loongson1-cpufreq.c
drivers/cpufreq/loongson1-cpufreq.c
+1
-1
drivers/cpufreq/mediatek-cpufreq.c
drivers/cpufreq/mediatek-cpufreq.c
+1
-1
drivers/cpufreq/omap-cpufreq.c
drivers/cpufreq/omap-cpufreq.c
+1
-1
drivers/cpufreq/pmac32-cpufreq.c
drivers/cpufreq/pmac32-cpufreq.c
+1
-2
drivers/cpufreq/qcom-cpufreq-hw.c
drivers/cpufreq/qcom-cpufreq-hw.c
+7
-1
drivers/cpufreq/s3c24xx-cpufreq.c
drivers/cpufreq/s3c24xx-cpufreq.c
+1
-1
drivers/cpufreq/s5pv210-cpufreq.c
drivers/cpufreq/s5pv210-cpufreq.c
+1
-1
drivers/cpufreq/sa1100-cpufreq.c
drivers/cpufreq/sa1100-cpufreq.c
+1
-1
drivers/cpufreq/sa1110-cpufreq.c
drivers/cpufreq/sa1110-cpufreq.c
+1
-1
drivers/cpufreq/scmi-cpufreq.c
drivers/cpufreq/scmi-cpufreq.c
+1
-1
drivers/cpufreq/scpi-cpufreq.c
drivers/cpufreq/scpi-cpufreq.c
+1
-1
drivers/cpufreq/spear-cpufreq.c
drivers/cpufreq/spear-cpufreq.c
+1
-1
drivers/cpufreq/tango-cpufreq.c
drivers/cpufreq/tango-cpufreq.c
+0
-38
drivers/cpufreq/tegra186-cpufreq.c
drivers/cpufreq/tegra186-cpufreq.c
+1
-1
drivers/cpufreq/tegra194-cpufreq.c
drivers/cpufreq/tegra194-cpufreq.c
+1
-2
drivers/cpufreq/tegra20-cpufreq.c
drivers/cpufreq/tegra20-cpufreq.c
+22
-23
drivers/cpufreq/vexpress-spc-cpufreq.c
drivers/cpufreq/vexpress-spc-cpufreq.c
+1
-2
include/linux/cpufreq.h
include/linux/cpufreq.h
+12
-18
No files found.
drivers/cpufreq/Kconfig.arm
View file @
8a3f1f18
...
...
@@ -289,11 +289,6 @@ config ARM_STI_CPUFREQ
this config option if you wish to add CPUFreq support for STi based
SoCs.
config ARM_TANGO_CPUFREQ
bool
depends on CPUFREQ_DT && ARCH_TANGO
default y
config ARM_TEGRA20_CPUFREQ
tristate "Tegra20/30 CPUFreq support"
depends on ARCH_TEGRA && CPUFREQ_DT
...
...
drivers/cpufreq/Makefile
View file @
8a3f1f18
...
...
@@ -79,7 +79,6 @@ obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
obj-$(CONFIG_ARM_SPEAR_CPUFREQ)
+=
spear-cpufreq.o
obj-$(CONFIG_ARM_STI_CPUFREQ)
+=
sti-cpufreq.o
obj-$(CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM)
+=
sun50i-cpufreq-nvmem.o
obj-$(CONFIG_ARM_TANGO_CPUFREQ)
+=
tango-cpufreq.o
obj-$(CONFIG_ARM_TEGRA20_CPUFREQ)
+=
tegra20-cpufreq.o
obj-$(CONFIG_ARM_TEGRA124_CPUFREQ)
+=
tegra124-cpufreq.o
obj-$(CONFIG_ARM_TEGRA186_CPUFREQ)
+=
tegra186-cpufreq.o
...
...
drivers/cpufreq/brcmstb-avs-cpufreq.c
View file @
8a3f1f18
...
...
@@ -597,6 +597,16 @@ static int brcm_avs_prepare_init(struct platform_device *pdev)
return
ret
;
}
static
void
brcm_avs_prepare_uninit
(
struct
platform_device
*
pdev
)
{
struct
private_data
*
priv
;
priv
=
platform_get_drvdata
(
pdev
);
iounmap
(
priv
->
avs_intr_base
);
iounmap
(
priv
->
base
);
}
static
int
brcm_avs_cpufreq_init
(
struct
cpufreq_policy
*
policy
)
{
struct
cpufreq_frequency_table
*
freq_table
;
...
...
@@ -732,21 +742,21 @@ static int brcm_avs_cpufreq_probe(struct platform_device *pdev)
brcm_avs_driver
.
driver_data
=
pdev
;
return
cpufreq_register_driver
(
&
brcm_avs_driver
);
ret
=
cpufreq_register_driver
(
&
brcm_avs_driver
);
if
(
ret
)
brcm_avs_prepare_uninit
(
pdev
);
return
ret
;
}
static
int
brcm_avs_cpufreq_remove
(
struct
platform_device
*
pdev
)
{
struct
private_data
*
priv
;
int
ret
;
ret
=
cpufreq_unregister_driver
(
&
brcm_avs_driver
);
if
(
ret
)
return
ret
;
WARN_ON
(
ret
);
priv
=
platform_get_drvdata
(
pdev
);
iounmap
(
priv
->
base
);
iounmap
(
priv
->
avs_intr_base
);
brcm_avs_prepare_uninit
(
pdev
);
return
0
;
}
...
...
drivers/cpufreq/cpufreq-dt-platdev.c
View file @
8a3f1f18
...
...
@@ -141,8 +141,6 @@ static const struct of_device_id blacklist[] __initconst = {
{
.
compatible
=
"st,stih410"
,
},
{
.
compatible
=
"st,stih418"
,
},
{
.
compatible
=
"sigma,tango4"
,
},
{
.
compatible
=
"ti,am33xx"
,
},
{
.
compatible
=
"ti,am43"
,
},
{
.
compatible
=
"ti,dra7"
,
},
...
...
drivers/cpufreq/cpufreq-dt.c
View file @
8a3f1f18
...
...
@@ -175,7 +175,7 @@ static int cpufreq_exit(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
dt_cpufreq_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
|
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_IS_COOLING_DEV
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
set_target
,
...
...
drivers/cpufreq/cpufreq.c
View file @
8a3f1f18
...
...
@@ -2810,8 +2810,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
if
(
ret
)
goto
err_boost_unreg
;
if
(
!
(
cpufreq_driver
->
flags
&
CPUFREQ_STICKY
)
&&
list_empty
(
&
cpufreq_policy_list
))
{
if
(
unlikely
(
list_empty
(
&
cpufreq_policy_list
)))
{
/* if all ->init() calls failed, unregister */
ret
=
-
ENODEV
;
pr_debug
(
"%s: No CPU initialized for driver %s
\n
"
,
__func__
,
...
...
drivers/cpufreq/davinci-cpufreq.c
View file @
8a3f1f18
...
...
@@ -95,7 +95,7 @@ static int davinci_cpu_init(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
davinci_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
davinci_target
,
.
get
=
cpufreq_generic_get
,
...
...
drivers/cpufreq/intel_pstate.c
View file @
8a3f1f18
...
...
@@ -819,13 +819,13 @@ static struct freq_attr *hwp_cpufreq_attrs[] = {
NULL
,
};
static
void
intel_pstate_get_hwp_max
(
unsigned
int
cpu
,
int
*
phy_max
,
static
void
intel_pstate_get_hwp_max
(
struct
cpudata
*
cpu
,
int
*
phy_max
,
int
*
current_max
)
{
u64
cap
;
rdmsrl_on_cpu
(
cpu
,
MSR_HWP_CAPABILITIES
,
&
cap
);
WRITE_ONCE
(
all_cpu_data
[
cpu
]
->
hwp_cap_cached
,
cap
);
rdmsrl_on_cpu
(
cpu
->
cpu
,
MSR_HWP_CAPABILITIES
,
&
cap
);
WRITE_ONCE
(
cpu
->
hwp_cap_cached
,
cap
);
if
(
global
.
no_turbo
||
global
.
turbo_disabled
)
*
current_max
=
HWP_GUARANTEED_PERF
(
cap
);
else
...
...
@@ -914,7 +914,7 @@ static void intel_pstate_hwp_offline(struct cpudata *cpu)
}
value
&=
~
GENMASK_ULL
(
31
,
0
);
min_perf
=
HWP_LOWEST_PERF
(
cpu
->
hwp_cap_cached
);
min_perf
=
HWP_LOWEST_PERF
(
READ_ONCE
(
cpu
->
hwp_cap_cached
)
);
/* Set hwp_max = hwp_min */
value
|=
HWP_MAX_PERF
(
min_perf
);
...
...
@@ -1213,7 +1213,7 @@ static void update_qos_request(enum freq_qos_req_type type)
continue
;
if
(
hwp_active
)
intel_pstate_get_hwp_max
(
i
,
&
turbo_max
,
&
max_state
);
intel_pstate_get_hwp_max
(
cpu
,
&
turbo_max
,
&
max_state
);
else
turbo_max
=
cpu
->
pstate
.
turbo_pstate
;
...
...
@@ -1714,21 +1714,22 @@ static void intel_pstate_max_within_limits(struct cpudata *cpu)
static
void
intel_pstate_get_cpu_pstates
(
struct
cpudata
*
cpu
)
{
cpu
->
pstate
.
min_pstate
=
pstate_funcs
.
get_min
();
cpu
->
pstate
.
max_pstate
=
pstate_funcs
.
get_max
();
cpu
->
pstate
.
max_pstate_physical
=
pstate_funcs
.
get_max_physical
();
cpu
->
pstate
.
turbo_pstate
=
pstate_funcs
.
get_turbo
();
cpu
->
pstate
.
scaling
=
pstate_funcs
.
get_scaling
();
cpu
->
pstate
.
max_freq
=
cpu
->
pstate
.
max_pstate
*
cpu
->
pstate
.
scaling
;
if
(
hwp_active
&&
!
hwp_mode_bdw
)
{
unsigned
int
phy_max
,
current_max
;
intel_pstate_get_hwp_max
(
cpu
->
cpu
,
&
phy_max
,
&
current_max
);
intel_pstate_get_hwp_max
(
cpu
,
&
phy_max
,
&
current_max
);
cpu
->
pstate
.
turbo_freq
=
phy_max
*
cpu
->
pstate
.
scaling
;
cpu
->
pstate
.
turbo_pstate
=
phy_max
;
cpu
->
pstate
.
max_pstate
=
HWP_GUARANTEED_PERF
(
READ_ONCE
(
cpu
->
hwp_cap_cached
));
}
else
{
cpu
->
pstate
.
turbo_freq
=
cpu
->
pstate
.
turbo_pstate
*
cpu
->
pstate
.
scaling
;
cpu
->
pstate
.
max_pstate
=
pstate_funcs
.
get_max
();
}
cpu
->
pstate
.
max_freq
=
cpu
->
pstate
.
max_pstate
*
cpu
->
pstate
.
scaling
;
if
(
pstate_funcs
.
get_aperf_mperf_shift
)
cpu
->
aperf_mperf_shift
=
pstate_funcs
.
get_aperf_mperf_shift
();
...
...
@@ -1750,6 +1751,7 @@ static int hwp_boost_hold_time_ns = 3 * NSEC_PER_MSEC;
static
inline
void
intel_pstate_hwp_boost_up
(
struct
cpudata
*
cpu
)
{
u64
hwp_req
=
READ_ONCE
(
cpu
->
hwp_req_cached
);
u64
hwp_cap
=
READ_ONCE
(
cpu
->
hwp_cap_cached
);
u32
max_limit
=
(
hwp_req
&
0xff00
)
>>
8
;
u32
min_limit
=
(
hwp_req
&
0xff
);
u32
boost_level1
;
...
...
@@ -1776,14 +1778,14 @@ static inline void intel_pstate_hwp_boost_up(struct cpudata *cpu)
cpu
->
hwp_boost_min
=
min_limit
;
/* level at half way mark between min and guranteed */
boost_level1
=
(
HWP_GUARANTEED_PERF
(
cpu
->
hwp_cap_cached
)
+
min_limit
)
>>
1
;
boost_level1
=
(
HWP_GUARANTEED_PERF
(
hwp_cap
)
+
min_limit
)
>>
1
;
if
(
cpu
->
hwp_boost_min
<
boost_level1
)
cpu
->
hwp_boost_min
=
boost_level1
;
else
if
(
cpu
->
hwp_boost_min
<
HWP_GUARANTEED_PERF
(
cpu
->
hwp_cap_cached
))
cpu
->
hwp_boost_min
=
HWP_GUARANTEED_PERF
(
cpu
->
hwp_cap_cached
);
else
if
(
cpu
->
hwp_boost_min
==
HWP_GUARANTEED_PERF
(
cpu
->
hwp_cap_cached
)
&&
max_limit
!=
HWP_GUARANTEED_PERF
(
cpu
->
hwp_cap_cached
))
else
if
(
cpu
->
hwp_boost_min
<
HWP_GUARANTEED_PERF
(
hwp_cap
))
cpu
->
hwp_boost_min
=
HWP_GUARANTEED_PERF
(
hwp_cap
);
else
if
(
cpu
->
hwp_boost_min
==
HWP_GUARANTEED_PERF
(
hwp_cap
)
&&
max_limit
!=
HWP_GUARANTEED_PERF
(
hwp_cap
))
cpu
->
hwp_boost_min
=
max_limit
;
else
return
;
...
...
@@ -2207,7 +2209,7 @@ static void intel_pstate_update_perf_limits(struct cpudata *cpu,
* rather than pure ratios.
*/
if
(
hwp_active
)
{
intel_pstate_get_hwp_max
(
cpu
->
cpu
,
&
turbo_max
,
&
max_state
);
intel_pstate_get_hwp_max
(
cpu
,
&
turbo_max
,
&
max_state
);
}
else
{
max_state
=
global
.
no_turbo
||
global
.
turbo_disabled
?
cpu
->
pstate
.
max_pstate
:
cpu
->
pstate
.
turbo_pstate
;
...
...
@@ -2322,7 +2324,7 @@ static void intel_pstate_verify_cpu_policy(struct cpudata *cpu,
if
(
hwp_active
)
{
int
max_state
,
turbo_max
;
intel_pstate_get_hwp_max
(
cpu
->
cpu
,
&
turbo_max
,
&
max_state
);
intel_pstate_get_hwp_max
(
cpu
,
&
turbo_max
,
&
max_state
);
max_freq
=
max_state
*
cpu
->
pstate
.
scaling
;
}
else
{
max_freq
=
intel_pstate_get_max_freq
(
cpu
);
...
...
@@ -2496,7 +2498,7 @@ static int intel_cpufreq_verify_policy(struct cpufreq_policy_data *policy)
* driver call was via the normal or fast switch path. Various graphs
* output from the intel_pstate_tracer.py utility that include core_busy
* (or performance or core_avg_perf) have a fixed y-axis from 0 to 100%,
* so we use 10 to indicate the
the
normal path through the driver, and
* so we use 10 to indicate the normal path through the driver, and
* 90 to indicate the fast switch path through the driver.
* The scaled_busy field is not used, and is set to 0.
*/
...
...
@@ -2526,7 +2528,7 @@ static void intel_cpufreq_trace(struct cpudata *cpu, unsigned int trace_type, in
fp_toint
(
cpu
->
iowait_boost
*
100
));
}
static
void
intel_cpufreq_
adjust_hwp
(
struct
cpudata
*
cpu
,
u32
min
,
u32
max
,
static
void
intel_cpufreq_
hwp_update
(
struct
cpudata
*
cpu
,
u32
min
,
u32
max
,
u32
desired
,
bool
fast_switch
)
{
u64
prev
=
READ_ONCE
(
cpu
->
hwp_req_cached
),
value
=
prev
;
...
...
@@ -2550,7 +2552,7 @@ static void intel_cpufreq_adjust_hwp(struct cpudata *cpu, u32 min, u32 max,
wrmsrl_on_cpu
(
cpu
->
cpu
,
MSR_HWP_REQUEST
,
value
);
}
static
void
intel_cpufreq_
adjust_perf_ctl
(
struct
cpudata
*
cpu
,
static
void
intel_cpufreq_
perf_ctl_update
(
struct
cpudata
*
cpu
,
u32
target_pstate
,
bool
fast_switch
)
{
if
(
fast_switch
)
...
...
@@ -2572,10 +2574,10 @@ static int intel_cpufreq_update_pstate(struct cpufreq_policy *policy,
int
max_pstate
=
policy
->
strict_target
?
target_pstate
:
cpu
->
max_perf_ratio
;
intel_cpufreq_
adjust_hwp
(
cpu
,
target_pstate
,
max_pstate
,
0
,
intel_cpufreq_
hwp_update
(
cpu
,
target_pstate
,
max_pstate
,
0
,
fast_switch
);
}
else
if
(
target_pstate
!=
old_pstate
)
{
intel_cpufreq_
adjust_perf_ctl
(
cpu
,
target_pstate
,
fast_switch
);
intel_cpufreq_
perf_ctl_update
(
cpu
,
target_pstate
,
fast_switch
);
}
cpu
->
pstate
.
current_pstate
=
target_pstate
;
...
...
@@ -2673,7 +2675,7 @@ static void intel_cpufreq_adjust_perf(unsigned int cpunum,
target_pstate
=
clamp_t
(
int
,
target_pstate
,
min_pstate
,
max_pstate
);
intel_cpufreq_
adjust_hwp
(
cpu
,
min_pstate
,
max_pstate
,
target_pstate
,
true
);
intel_cpufreq_
hwp_update
(
cpu
,
min_pstate
,
max_pstate
,
target_pstate
,
true
);
cpu
->
pstate
.
current_pstate
=
target_pstate
;
intel_cpufreq_trace
(
cpu
,
INTEL_PSTATE_TRACE_FAST_SWITCH
,
old_pstate
);
...
...
@@ -2709,7 +2711,7 @@ static int intel_cpufreq_cpu_init(struct cpufreq_policy *policy)
if
(
hwp_active
)
{
u64
value
;
intel_pstate_get_hwp_max
(
policy
->
cpu
,
&
turbo_max
,
&
max_state
);
intel_pstate_get_hwp_max
(
cpu
,
&
turbo_max
,
&
max_state
);
policy
->
transition_delay_us
=
INTEL_CPUFREQ_TRANSITION_DELAY_HWP
;
rdmsrl_on_cpu
(
cpu
->
cpu
,
MSR_HWP_REQUEST
,
&
value
);
WRITE_ONCE
(
cpu
->
hwp_req_cached
,
value
);
...
...
drivers/cpufreq/loongson1-cpufreq.c
View file @
8a3f1f18
...
...
@@ -116,7 +116,7 @@ static int ls1x_cpufreq_exit(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
ls1x_cpufreq_driver
=
{
.
name
=
"cpufreq-ls1x"
,
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
ls1x_cpufreq_target
,
.
get
=
cpufreq_generic_get
,
...
...
drivers/cpufreq/mediatek-cpufreq.c
View file @
8a3f1f18
...
...
@@ -463,7 +463,7 @@ static int mtk_cpufreq_exit(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
mtk_cpufreq_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
|
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_IS_COOLING_DEV
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
...
...
drivers/cpufreq/omap-cpufreq.c
View file @
8a3f1f18
...
...
@@ -144,7 +144,7 @@ static int omap_cpu_exit(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
omap_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
omap_target
,
.
get
=
cpufreq_generic_get
,
...
...
drivers/cpufreq/pmac32-cpufreq.c
View file @
8a3f1f18
...
...
@@ -439,8 +439,7 @@ static struct cpufreq_driver pmac_cpufreq_driver = {
.
init
=
pmac_cpufreq_cpu_init
,
.
suspend
=
pmac_cpufreq_suspend
,
.
resume
=
pmac_cpufreq_resume
,
.
flags
=
CPUFREQ_PM_NO_WARN
|
CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING
,
.
flags
=
CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING
,
.
attr
=
cpufreq_generic_attr
,
.
name
=
"powermac"
,
};
...
...
drivers/cpufreq/qcom-cpufreq-hw.c
View file @
8a3f1f18
...
...
@@ -347,6 +347,12 @@ static int qcom_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
dev_pm_opp_of_register_em
(
cpu_dev
,
policy
->
cpus
);
if
(
policy_has_boost_freq
(
policy
))
{
ret
=
cpufreq_enable_boost_support
();
if
(
ret
)
dev_warn
(
cpu_dev
,
"failed to enable boost: %d
\n
"
,
ret
);
}
return
0
;
error:
devm_iounmap
(
dev
,
base
);
...
...
@@ -374,7 +380,7 @@ static struct freq_attr *qcom_cpufreq_hw_attr[] = {
};
static
struct
cpufreq_driver
cpufreq_qcom_hw_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
|
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_IS_COOLING_DEV
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
...
...
drivers/cpufreq/s3c24xx-cpufreq.c
View file @
8a3f1f18
...
...
@@ -420,7 +420,7 @@ static int s3c_cpufreq_resume(struct cpufreq_policy *policy)
#endif
static
struct
cpufreq_driver
s3c24xx_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
target
=
s3c_cpufreq_target
,
.
get
=
cpufreq_generic_get
,
.
init
=
s3c_cpufreq_init
,
...
...
drivers/cpufreq/s5pv210-cpufreq.c
View file @
8a3f1f18
...
...
@@ -574,7 +574,7 @@ static int s5pv210_cpufreq_reboot_notifier_event(struct notifier_block *this,
}
static
struct
cpufreq_driver
s5pv210_driver
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
s5pv210_target
,
.
get
=
cpufreq_generic_get
,
...
...
drivers/cpufreq/sa1100-cpufreq.c
View file @
8a3f1f18
...
...
@@ -186,7 +186,7 @@ static int __init sa1100_cpu_init(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
sa1100_driver
__refdata
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
|
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
sa1100_target
,
...
...
drivers/cpufreq/sa1110-cpufreq.c
View file @
8a3f1f18
...
...
@@ -310,7 +310,7 @@ static int __init sa1110_cpu_init(struct cpufreq_policy *policy)
/* sa1110_driver needs __refdata because it must remain after init registers
* it with cpufreq_register_driver() */
static
struct
cpufreq_driver
sa1110_driver
__refdata
=
{
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
|
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
sa1110_target
,
...
...
drivers/cpufreq/scmi-cpufreq.c
View file @
8a3f1f18
...
...
@@ -217,7 +217,7 @@ static int scmi_cpufreq_exit(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
scmi_cpufreq_driver
=
{
.
name
=
"scmi"
,
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
HAVE_GOVERNOR_PER_POLICY
|
.
flags
=
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_IS_COOLING_DEV
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
...
...
drivers/cpufreq/scpi-cpufreq.c
View file @
8a3f1f18
...
...
@@ -191,7 +191,7 @@ static int scpi_cpufreq_exit(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
scpi_cpufreq_driver
=
{
.
name
=
"scpi-cpufreq"
,
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
HAVE_GOVERNOR_PER_POLICY
|
.
flags
=
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
|
CPUFREQ_IS_COOLING_DEV
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
...
...
drivers/cpufreq/spear-cpufreq.c
View file @
8a3f1f18
...
...
@@ -160,7 +160,7 @@ static int spear_cpufreq_init(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
spear_cpufreq_driver
=
{
.
name
=
"cpufreq-spear"
,
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
spear_cpufreq_target
,
.
get
=
cpufreq_generic_get
,
...
...
drivers/cpufreq/tango-cpufreq.c
deleted
100644 → 0
View file @
d11a1d08
#include <linux/of.h>
#include <linux/cpu.h>
#include <linux/clk.h>
#include <linux/pm_opp.h>
#include <linux/platform_device.h>
static
const
struct
of_device_id
machines
[]
__initconst
=
{
{
.
compatible
=
"sigma,tango4"
},
{
/* sentinel */
}
};
static
int
__init
tango_cpufreq_init
(
void
)
{
struct
device
*
cpu_dev
=
get_cpu_device
(
0
);
unsigned
long
max_freq
;
struct
clk
*
cpu_clk
;
void
*
res
;
if
(
!
of_match_node
(
machines
,
of_root
))
return
-
ENODEV
;
cpu_clk
=
clk_get
(
cpu_dev
,
NULL
);
if
(
IS_ERR
(
cpu_clk
))
return
-
ENODEV
;
max_freq
=
clk_get_rate
(
cpu_clk
);
dev_pm_opp_add
(
cpu_dev
,
max_freq
/
1
,
0
);
dev_pm_opp_add
(
cpu_dev
,
max_freq
/
2
,
0
);
dev_pm_opp_add
(
cpu_dev
,
max_freq
/
3
,
0
);
dev_pm_opp_add
(
cpu_dev
,
max_freq
/
5
,
0
);
dev_pm_opp_add
(
cpu_dev
,
max_freq
/
9
,
0
);
res
=
platform_device_register_data
(
NULL
,
"cpufreq-dt"
,
-
1
,
NULL
,
0
);
return
PTR_ERR_OR_ZERO
(
res
);
}
device_initcall
(
tango_cpufreq_init
);
drivers/cpufreq/tegra186-cpufreq.c
View file @
8a3f1f18
...
...
@@ -117,7 +117,7 @@ static unsigned int tegra186_cpufreq_get(unsigned int cpu)
static
struct
cpufreq_driver
tegra186_cpufreq_driver
=
{
.
name
=
"tegra186"
,
.
flags
=
CPUFREQ_
STICKY
|
CPUFREQ_
HAVE_GOVERNOR_PER_POLICY
|
.
flags
=
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
get
=
tegra186_cpufreq_get
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
...
...
drivers/cpufreq/tegra194-cpufreq.c
View file @
8a3f1f18
...
...
@@ -272,8 +272,7 @@ static int tegra194_cpufreq_set_target(struct cpufreq_policy *policy,
static
struct
cpufreq_driver
tegra194_cpufreq_driver
=
{
.
name
=
"tegra194"
,
.
flags
=
CPUFREQ_STICKY
|
CPUFREQ_CONST_LOOPS
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
flags
=
CPUFREQ_CONST_LOOPS
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
tegra194_cpufreq_set_target
,
.
get
=
tegra194_get_speed
,
...
...
drivers/cpufreq/tegra20-cpufreq.c
View file @
8a3f1f18
...
...
@@ -32,6 +32,16 @@ static bool cpu0_node_has_opp_v2_prop(void)
return
ret
;
}
static
void
tegra20_cpufreq_put_supported_hw
(
void
*
opp_table
)
{
dev_pm_opp_put_supported_hw
(
opp_table
);
}
static
void
tegra20_cpufreq_dt_unregister
(
void
*
cpufreq_dt
)
{
platform_device_unregister
(
cpufreq_dt
);
}
static
int
tegra20_cpufreq_probe
(
struct
platform_device
*
pdev
)
{
struct
platform_device
*
cpufreq_dt
;
...
...
@@ -68,42 +78,31 @@ static int tegra20_cpufreq_probe(struct platform_device *pdev)
return
err
;
}
err
=
devm_add_action_or_reset
(
&
pdev
->
dev
,
tegra20_cpufreq_put_supported_hw
,
opp_table
);
if
(
err
)
return
err
;
cpufreq_dt
=
platform_device_register_simple
(
"cpufreq-dt"
,
-
1
,
NULL
,
0
);
err
=
PTR_ERR_OR_ZERO
(
cpufreq_dt
);
if
(
err
)
{
dev_err
(
&
pdev
->
dev
,
"failed to create cpufreq-dt device: %d
\n
"
,
err
);
goto
err_put_supported_hw
;
return
err
;
}
platform_set_drvdata
(
pdev
,
cpufreq_dt
);
return
0
;
err_put_supported_hw:
dev_pm_opp_put_supported_hw
(
opp_table
);
return
err
;
}
static
int
tegra20_cpufreq_remove
(
struct
platform_device
*
pdev
)
{
struct
platform_device
*
cpufreq_dt
;
struct
opp_table
*
opp_table
;
cpufreq_dt
=
platform_get_drvdata
(
pdev
);
platform_device_unregister
(
cpufreq_dt
);
opp_table
=
dev_pm_opp_get_opp_table
(
get_cpu_device
(
0
));
dev_pm_opp_put_supported_hw
(
opp_table
);
dev_pm_opp_put_opp_table
(
opp_table
);
err
=
devm_add_action_or_reset
(
&
pdev
->
dev
,
tegra20_cpufreq_dt_unregister
,
cpufreq_dt
);
if
(
err
)
return
err
;
return
0
;
}
static
struct
platform_driver
tegra20_cpufreq_driver
=
{
.
probe
=
tegra20_cpufreq_probe
,
.
remove
=
tegra20_cpufreq_remove
,
.
driver
=
{
.
name
=
"tegra20-cpufreq"
,
},
...
...
drivers/cpufreq/vexpress-spc-cpufreq.c
View file @
8a3f1f18
...
...
@@ -486,8 +486,7 @@ static void ve_spc_cpufreq_ready(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
ve_spc_cpufreq_driver
=
{
.
name
=
"vexpress-spc"
,
.
flags
=
CPUFREQ_STICKY
|
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
.
flags
=
CPUFREQ_HAVE_GOVERNOR_PER_POLICY
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK
,
.
verify
=
cpufreq_generic_frequency_table_verify
,
.
target_index
=
ve_spc_cpufreq_set_target
,
...
...
include/linux/cpufreq.h
View file @
8a3f1f18
...
...
@@ -387,14 +387,22 @@ struct cpufreq_driver {
/* flags */
/* driver isn't removed even if all ->init() calls failed */
#define CPUFREQ_STICKY BIT(0)
/*
* Set by drivers that need to update internale upper and lower boundaries along
* with the target frequency and so the core and governors should also invoke
* the diver if the target frequency does not change, but the policy min or max
* may have changed.
*/
#define CPUFREQ_NEED_UPDATE_LIMITS BIT(0)
/* loops_per_jiffy or other kernel "constants" aren't affected by frequency transitions */
#define CPUFREQ_CONST_LOOPS BIT(1)
/* don't warn on suspend/resume speed mismatches */
#define CPUFREQ_PM_NO_WARN BIT(2)
/*
* Set by drivers that want the core to automatically register the cpufreq
* driver as a thermal cooling device.
*/
#define CPUFREQ_IS_COOLING_DEV BIT(2)
/*
* This should be set by platforms having multiple clock-domains, i.e.
...
...
@@ -426,20 +434,6 @@ struct cpufreq_driver {
*/
#define CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING BIT(6)
/*
* Set by drivers that want the core to automatically register the cpufreq
* driver as a thermal cooling device.
*/
#define CPUFREQ_IS_COOLING_DEV BIT(7)
/*
* Set by drivers that need to update internale upper and lower boundaries along
* with the target frequency and so the core and governors should also invoke
* the diver if the target frequency does not change, but the policy min or max
* may have changed.
*/
#define CPUFREQ_NEED_UPDATE_LIMITS BIT(8)
int
cpufreq_register_driver
(
struct
cpufreq_driver
*
driver_data
);
int
cpufreq_unregister_driver
(
struct
cpufreq_driver
*
driver_data
);
...
...
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