Merge branches 'pm-opp', 'pm-devfreq', 'pm-avs' and 'pm-tools'
* pm-opp: OPP: Introduce "required-opp" property OPP: Allow OPP table to be used for power-domains * pm-devfreq: PM / devfreq: Fix potential NULL pointer dereference in governor_store PM / devfreq: Propagate error from devfreq_add_device() * pm-avs: PM / AVS: rockchip-io: account for const type of of_device_id.data * pm-tools: tools/power/x86/intel_pstate_tracer: Free the trace buffer memory cpupower: Remove FSF address
This commit is contained in:
commit
ee43730d65
|
@ -45,6 +45,11 @@ Devices supporting OPPs must set their "operating-points-v2" property with
|
||||||
phandle to a OPP table in their DT node. The OPP core will use this phandle to
|
phandle to a OPP table in their DT node. The OPP core will use this phandle to
|
||||||
find the operating points for the device.
|
find the operating points for the device.
|
||||||
|
|
||||||
|
This can contain more than one phandle for power domain providers that provide
|
||||||
|
multiple power domains. That is, one phandle for each power domain. If only one
|
||||||
|
phandle is available, then the same OPP table will be used for all power domains
|
||||||
|
provided by the power domain provider.
|
||||||
|
|
||||||
If required, this can be extended for SoC vendor specific bindings. Such bindings
|
If required, this can be extended for SoC vendor specific bindings. Such bindings
|
||||||
should be documented as Documentation/devicetree/bindings/power/<vendor>-opp.txt
|
should be documented as Documentation/devicetree/bindings/power/<vendor>-opp.txt
|
||||||
and should have a compatible description like: "operating-points-v2-<vendor>".
|
and should have a compatible description like: "operating-points-v2-<vendor>".
|
||||||
|
@ -154,6 +159,14 @@ Optional properties:
|
||||||
|
|
||||||
- status: Marks the node enabled/disabled.
|
- status: Marks the node enabled/disabled.
|
||||||
|
|
||||||
|
- required-opp: This contains phandle to an OPP node in another device's OPP
|
||||||
|
table. It may contain an array of phandles, where each phandle points to an
|
||||||
|
OPP of a different device. It should not contain multiple phandles to the OPP
|
||||||
|
nodes in the same OPP table. This specifies the minimum required OPP of the
|
||||||
|
device(s), whose OPP's phandle is present in this property, for the
|
||||||
|
functioning of the current device at the current OPP (where this property is
|
||||||
|
present).
|
||||||
|
|
||||||
Example 1: Single cluster Dual-core ARM cortex A9, switch DVFS states together.
|
Example 1: Single cluster Dual-core ARM cortex A9, switch DVFS states together.
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
|
|
@ -40,6 +40,12 @@ Optional properties:
|
||||||
domain's idle states. In the absence of this property, the domain would be
|
domain's idle states. In the absence of this property, the domain would be
|
||||||
considered as capable of being powered-on or powered-off.
|
considered as capable of being powered-on or powered-off.
|
||||||
|
|
||||||
|
- operating-points-v2 : Phandles to the OPP tables of power domains provided by
|
||||||
|
a power domain provider. If the provider provides a single power domain only
|
||||||
|
or all the power domains provided by the provider have identical OPP tables,
|
||||||
|
then this shall contain a single phandle. Refer to ../opp/opp.txt for more
|
||||||
|
information.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
power: power-controller@12340000 {
|
power: power-controller@12340000 {
|
||||||
|
@ -120,4 +126,63 @@ The node above defines a typical PM domain consumer device, which is located
|
||||||
inside a PM domain with index 0 of a power controller represented by a node
|
inside a PM domain with index 0 of a power controller represented by a node
|
||||||
with the label "power".
|
with the label "power".
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- required-opp: This contains phandle to an OPP node in another device's OPP
|
||||||
|
table. It may contain an array of phandles, where each phandle points to an
|
||||||
|
OPP of a different device. It should not contain multiple phandles to the OPP
|
||||||
|
nodes in the same OPP table. This specifies the minimum required OPP of the
|
||||||
|
device(s), whose OPP's phandle is present in this property, for the
|
||||||
|
functioning of the current device at the current OPP (where this property is
|
||||||
|
present).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
- OPP table for domain provider that provides two domains.
|
||||||
|
|
||||||
|
domain0_opp_table: opp-table0 {
|
||||||
|
compatible = "operating-points-v2";
|
||||||
|
|
||||||
|
domain0_opp_0: opp-1000000000 {
|
||||||
|
opp-hz = /bits/ 64 <1000000000>;
|
||||||
|
opp-microvolt = <975000 970000 985000>;
|
||||||
|
};
|
||||||
|
domain0_opp_1: opp-1100000000 {
|
||||||
|
opp-hz = /bits/ 64 <1100000000>;
|
||||||
|
opp-microvolt = <1000000 980000 1010000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
domain1_opp_table: opp-table1 {
|
||||||
|
compatible = "operating-points-v2";
|
||||||
|
|
||||||
|
domain1_opp_0: opp-1200000000 {
|
||||||
|
opp-hz = /bits/ 64 <1200000000>;
|
||||||
|
opp-microvolt = <975000 970000 985000>;
|
||||||
|
};
|
||||||
|
domain1_opp_1: opp-1300000000 {
|
||||||
|
opp-hz = /bits/ 64 <1300000000>;
|
||||||
|
opp-microvolt = <1000000 980000 1010000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
power: power-controller@12340000 {
|
||||||
|
compatible = "foo,power-controller";
|
||||||
|
reg = <0x12340000 0x1000>;
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
operating-points-v2 = <&domain0_opp_table>, <&domain1_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
leaky-device0@12350000 {
|
||||||
|
compatible = "foo,i-leak-current";
|
||||||
|
reg = <0x12350000 0x1000>;
|
||||||
|
power-domains = <&power 0>;
|
||||||
|
required-opp = <&domain0_opp_0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
leaky-device1@12350000 {
|
||||||
|
compatible = "foo,i-leak-current";
|
||||||
|
reg = <0x12350000 0x1000>;
|
||||||
|
power-domains = <&power 1>;
|
||||||
|
required-opp = <&domain1_opp_1>;
|
||||||
|
};
|
||||||
|
|
||||||
[1]. Documentation/devicetree/bindings/power/domain-idle-state.txt
|
[1]. Documentation/devicetree/bindings/power/domain-idle-state.txt
|
||||||
|
|
|
@ -737,7 +737,7 @@ struct devfreq *devm_devfreq_add_device(struct device *dev,
|
||||||
devfreq = devfreq_add_device(dev, profile, governor_name, data);
|
devfreq = devfreq_add_device(dev, profile, governor_name, data);
|
||||||
if (IS_ERR(devfreq)) {
|
if (IS_ERR(devfreq)) {
|
||||||
devres_free(ptr);
|
devres_free(ptr);
|
||||||
return ERR_PTR(-ENOMEM);
|
return devfreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ptr = devfreq;
|
*ptr = devfreq;
|
||||||
|
@ -996,7 +996,8 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
|
||||||
if (df->governor == governor) {
|
if (df->governor == governor) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto out;
|
goto out;
|
||||||
} else if (df->governor->immutable || governor->immutable) {
|
} else if ((df->governor && df->governor->immutable) ||
|
||||||
|
governor->immutable) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ struct rockchip_iodomain_supply {
|
||||||
struct rockchip_iodomain {
|
struct rockchip_iodomain {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct regmap *grf;
|
struct regmap *grf;
|
||||||
struct rockchip_iodomain_soc_data *soc_data;
|
const struct rockchip_iodomain_soc_data *soc_data;
|
||||||
struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
|
struct rockchip_iodomain_supply supplies[MAX_SUPPLIES];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -382,43 +382,43 @@ static const struct rockchip_iodomain_soc_data soc_data_rv1108_pmu = {
|
||||||
static const struct of_device_id rockchip_iodomain_match[] = {
|
static const struct of_device_id rockchip_iodomain_match[] = {
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3188-io-voltage-domain",
|
.compatible = "rockchip,rk3188-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3188
|
.data = &soc_data_rk3188
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3228-io-voltage-domain",
|
.compatible = "rockchip,rk3228-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3228
|
.data = &soc_data_rk3228
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3288-io-voltage-domain",
|
.compatible = "rockchip,rk3288-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3288
|
.data = &soc_data_rk3288
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3328-io-voltage-domain",
|
.compatible = "rockchip,rk3328-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3328
|
.data = &soc_data_rk3328
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3368-io-voltage-domain",
|
.compatible = "rockchip,rk3368-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3368
|
.data = &soc_data_rk3368
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3368-pmu-io-voltage-domain",
|
.compatible = "rockchip,rk3368-pmu-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3368_pmu
|
.data = &soc_data_rk3368_pmu
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3399-io-voltage-domain",
|
.compatible = "rockchip,rk3399-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3399
|
.data = &soc_data_rk3399
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
|
.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rk3399_pmu
|
.data = &soc_data_rk3399_pmu
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rv1108-io-voltage-domain",
|
.compatible = "rockchip,rv1108-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rv1108
|
.data = &soc_data_rv1108
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rv1108-pmu-io-voltage-domain",
|
.compatible = "rockchip,rv1108-pmu-io-voltage-domain",
|
||||||
.data = (void *)&soc_data_rv1108_pmu
|
.data = &soc_data_rv1108_pmu
|
||||||
},
|
},
|
||||||
{ /* sentinel */ },
|
{ /* sentinel */ },
|
||||||
};
|
};
|
||||||
|
@ -443,7 +443,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
|
||||||
platform_set_drvdata(pdev, iod);
|
platform_set_drvdata(pdev, iod);
|
||||||
|
|
||||||
match = of_match_node(rockchip_iodomain_match, np);
|
match = of_match_node(rockchip_iodomain_match, np);
|
||||||
iod->soc_data = (struct rockchip_iodomain_soc_data *)match->data;
|
iod->soc_data = match->data;
|
||||||
|
|
||||||
parent = pdev->dev.parent;
|
parent = pdev->dev.parent;
|
||||||
if (parent && parent->of_node) {
|
if (parent && parent->of_node) {
|
||||||
|
|
|
@ -11,10 +11,6 @@
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CPUPOWER_CPUFREQ_H__
|
#ifndef __CPUPOWER_CPUFREQ_H__
|
||||||
|
|
|
@ -411,6 +411,16 @@ def set_trace_buffer_size():
|
||||||
print('IO error setting trace buffer size ')
|
print('IO error setting trace buffer size ')
|
||||||
quit()
|
quit()
|
||||||
|
|
||||||
|
def free_trace_buffer():
|
||||||
|
""" Free the trace buffer memory """
|
||||||
|
|
||||||
|
try:
|
||||||
|
open('/sys/kernel/debug/tracing/buffer_size_kb'
|
||||||
|
, 'w').write("1")
|
||||||
|
except:
|
||||||
|
print('IO error setting trace buffer size ')
|
||||||
|
quit()
|
||||||
|
|
||||||
def read_trace_data(filename):
|
def read_trace_data(filename):
|
||||||
""" Read and parse trace data """
|
""" Read and parse trace data """
|
||||||
|
|
||||||
|
@ -583,4 +593,9 @@ for root, dirs, files in os.walk('.'):
|
||||||
for f in files:
|
for f in files:
|
||||||
fix_ownership(f)
|
fix_ownership(f)
|
||||||
|
|
||||||
|
clear_trace_file()
|
||||||
|
# Free the memory
|
||||||
|
if interval:
|
||||||
|
free_trace_buffer()
|
||||||
|
|
||||||
os.chdir('../../')
|
os.chdir('../../')
|
||||||
|
|
Loading…
Reference in a new issue