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
|
||||
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
|
||||
should be documented as Documentation/devicetree/bindings/power/<vendor>-opp.txt
|
||||
and should have a compatible description like: "operating-points-v2-<vendor>".
|
||||
|
@ -154,6 +159,14 @@ Optional properties:
|
|||
|
||||
- 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.
|
||||
|
||||
/ {
|
||||
|
|
|
@ -40,6 +40,12 @@ Optional properties:
|
|||
domain's idle states. In the absence of this property, the domain would be
|
||||
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:
|
||||
|
||||
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
|
||||
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
|
||||
|
|
|
@ -737,7 +737,7 @@ struct devfreq *devm_devfreq_add_device(struct device *dev,
|
|||
devfreq = devfreq_add_device(dev, profile, governor_name, data);
|
||||
if (IS_ERR(devfreq)) {
|
||||
devres_free(ptr);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return devfreq;
|
||||
}
|
||||
|
||||
*ptr = devfreq;
|
||||
|
@ -996,7 +996,8 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
|
|||
if (df->governor == governor) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
} else if (df->governor->immutable || governor->immutable) {
|
||||
} else if ((df->governor && df->governor->immutable) ||
|
||||
governor->immutable) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ struct rockchip_iodomain_supply {
|
|||
struct rockchip_iodomain {
|
||||
struct device *dev;
|
||||
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];
|
||||
};
|
||||
|
||||
|
@ -382,43 +382,43 @@ static const struct rockchip_iodomain_soc_data soc_data_rv1108_pmu = {
|
|||
static const struct of_device_id rockchip_iodomain_match[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3188-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3188
|
||||
.data = &soc_data_rk3188
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3228-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3228
|
||||
.data = &soc_data_rk3228
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3288-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3288
|
||||
.data = &soc_data_rk3288
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3328-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3328
|
||||
.data = &soc_data_rk3328
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3368-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3368
|
||||
.data = &soc_data_rk3368
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3368-pmu-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3368_pmu
|
||||
.data = &soc_data_rk3368_pmu
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3399-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3399
|
||||
.data = &soc_data_rk3399
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rk3399_pmu
|
||||
.data = &soc_data_rk3399_pmu
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rv1108-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rv1108
|
||||
.data = &soc_data_rv1108
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rv1108-pmu-io-voltage-domain",
|
||||
.data = (void *)&soc_data_rv1108_pmu
|
||||
.data = &soc_data_rv1108_pmu
|
||||
},
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
@ -443,7 +443,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, iod);
|
||||
|
||||
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;
|
||||
if (parent && parent->of_node) {
|
||||
|
|
|
@ -11,10 +11,6 @@
|
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* 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__
|
||||
|
|
|
@ -411,6 +411,16 @@ def set_trace_buffer_size():
|
|||
print('IO error setting trace buffer size ')
|
||||
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):
|
||||
""" Read and parse trace data """
|
||||
|
||||
|
@ -583,4 +593,9 @@ for root, dirs, files in os.walk('.'):
|
|||
for f in files:
|
||||
fix_ownership(f)
|
||||
|
||||
clear_trace_file()
|
||||
# Free the memory
|
||||
if interval:
|
||||
free_trace_buffer()
|
||||
|
||||
os.chdir('../../')
|
||||
|
|
Loading…
Reference in New Issue