Update devfreq next for v5.14
Detailed description for this pull request: 1. Update devfreq core - Use DEVICE_ATTR_RW macro for devfreq userspace governor - Add missing error code in devfreq_add_device() - Fix get_target_freq when not using required-opp The86ad9a24f2
("PM / devfreq: Add required OPPs support to passive governor") supported the required-opp property for using devfreq passive governor. But,86ad9a24f2
has caused the problem on use-case when required-opp is not used. So that fix the passive governor for supporting the case of when required-opp is not used. 2. Update devfreq driver - Remove unneeded get_dev_status and polling_ms from imx-bus.c because imx-bus.c doesn't support simple_ondemand. - Remove unneeded DEVFREQ_GOV_SIMPLE_ONDEMAND dependecy from imx8m-ddrc.c because it doesn't support simple_ondemand governor. - Use tegra30-devfreq.c as thermal cooling device - Convert dt-binding doc style to yaml and add cooling-cells property information to dt-binding doc for tegra30-devfreq.c -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEEsSpuqBtbWtRe4rLGnM3fLN7rz1MFAmDVtwYWHGN3MDAuY2hv aUBzYW1zdW5nLmNvbQAKCRCczd8s3uvPU8dND/0TpsMPMPtk5xA6wecWJ4iF5pOO grUjlfpsd23K4CLMxcgNAir/AwBnrVQ9TMKtKNQmHHRE4hfHxc+YFVRPmonlLqKh PK0C2eLGHSI+cHKbxJykzx9JPDQ/fV7plb/BjZBVAG1bsfue2x3pNgqC7BOKVYbd xOrERvnfF76QU/jsD1kORkB1k/fS2DwGwtU0rhaCO7MnhO3DuM5SVPpqdkggeSqQ UaBRdeC7K8Z7InhcmgNMg2LOCwInCGUD7D0F/J+a4u7ukKPHmZ4kXCTq0zCAWR06 LZpMlTx69vtBV+6mYrfxGFJqARa3ezsVcJFgl2SCpb/x8yV4rjhgdONfJv++9+mV VVfDx+uSbLn29KC/HczgwcjqjiO3qHGBV62Ml9f6u98ZDCLAZ4eauk4cuP/gO/Ed IrQfRtxZfcuODuyo4Zv6T9isMwGas4OATWxXlDJ6aPGhC4OLY5Q64I127G4RjM6b Ac3Fvgbr7F30xaFJyWopG5XY2lLfJmu8BtSIqjBnGccuBQviYcMqNEAAwAuu3oCQ llh1crtB6ezLtsx2M5cqejgN32kCjlY1v2bJx+lyfufYR9F/0CdYhO5IuB0kLgfA 90ZNTK8nVHFjvL10ywNIj6ljerwCXOAPlPljTCZw/Dj4FilvrrEGGcG6DGKKQJDM abevYsSODGcK3r4Bpg== =gc4V -----END PGP SIGNATURE----- Merge tag 'devfreq-next-for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux Pull devfreq material for v5.14 from Chanwoo Choi: 1. Update devfreq core - Use DEVICE_ATTR_RW macro for devfreq userspace governor. - Add missing error code in devfreq_add_device(). - Fix get_target_freq() when not using required-opp. 2. Update devfreq drivers - Remove unneeded get_dev_status() and polling_ms from imx-bus.c, because imx-bus.c doesn't support simple_ondemand. - Remove unneeded DEVFREQ_GOV_SIMPLE_ONDEMAND dependecy from imx8m-ddrc.c, because it doesn't support the simple_ondemand governor. - Use tegra30-devfreq.c as thermal cooling device. - Convert dt-binding doc style to yaml and add cooling-cells property information to dt-binding doc for tegra30-devfreq.c. * tag 'devfreq-next-for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux: PM / devfreq: passive: Fix get_target_freq when not using required-opp dt-bindings: devfreq: tegra30-actmon: Add cooling-cells dt-bindings: devfreq: tegra30-actmon: Convert to schema PM / devfreq: userspace: Use DEVICE_ATTR_RW macro PM / devfreq: imx8m-ddrc: Remove DEVFREQ_GOV_SIMPLE_ONDEMAND dependency PM / devfreq: tegra30: Support thermal cooling PM / devfreq: imx-bus: Remove imx_bus_get_dev_status PM / devfreq: Add missing error code in devfreq_add_device()
This commit is contained in:
commit
bc6f492134
@ -1,57 +0,0 @@
|
||||
NVIDIA Tegra Activity Monitor
|
||||
|
||||
The activity monitor block collects statistics about the behaviour of other
|
||||
components in the system. This information can be used to derive the rate at
|
||||
which the external memory needs to be clocked in order to serve all requests
|
||||
from the monitored clients.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "nvidia,tegra<chip>-actmon"
|
||||
- reg: offset and length of the register set for the device
|
||||
- interrupts: standard interrupt property
|
||||
- clocks: Must contain a phandle and clock specifier pair for each entry in
|
||||
clock-names. See ../../clock/clock-bindings.txt for details.
|
||||
- clock-names: Must include the following entries:
|
||||
- actmon
|
||||
- emc
|
||||
- resets: Must contain an entry for each entry in reset-names. See
|
||||
../../reset/reset.txt for details.
|
||||
- reset-names: Must include the following entries:
|
||||
- actmon
|
||||
- operating-points-v2: See ../bindings/opp/opp.txt for details.
|
||||
- interconnects: Should contain entries for memory clients sitting on
|
||||
MC->EMC memory interconnect path.
|
||||
- interconnect-names: Should include name of the interconnect path for each
|
||||
interconnect entry. Consult TRM documentation for
|
||||
information about available memory clients, see MEMORY
|
||||
CONTROLLER section.
|
||||
|
||||
For each opp entry in 'operating-points-v2' table:
|
||||
- opp-supported-hw: bitfield indicating SoC speedo ID mask
|
||||
- opp-peak-kBps: peak bandwidth of the memory channel
|
||||
|
||||
Example:
|
||||
dfs_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp@12750000 {
|
||||
opp-hz = /bits/ 64 <12750000>;
|
||||
opp-supported-hw = <0x000F>;
|
||||
opp-peak-kBps = <51000>;
|
||||
};
|
||||
...
|
||||
};
|
||||
|
||||
actmon@6000c800 {
|
||||
compatible = "nvidia,tegra124-actmon";
|
||||
reg = <0x0 0x6000c800 0x0 0x400>;
|
||||
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA124_CLK_ACTMON>,
|
||||
<&tegra_car TEGRA124_CLK_EMC>;
|
||||
clock-names = "actmon", "emc";
|
||||
resets = <&tegra_car 119>;
|
||||
reset-names = "actmon";
|
||||
operating-points-v2 = <&dfs_opp_table>;
|
||||
interconnects = <&mc TEGRA124_MC_MPCORER &emc>;
|
||||
interconnect-names = "cpu";
|
||||
};
|
@ -0,0 +1,126 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/devfreq/nvidia,tegra30-actmon.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NVIDIA Tegra30 Activity Monitor
|
||||
|
||||
maintainers:
|
||||
- Dmitry Osipenko <digetx@gmail.com>
|
||||
- Jon Hunter <jonathanh@nvidia.com>
|
||||
- Thierry Reding <thierry.reding@gmail.com>
|
||||
|
||||
description: |
|
||||
The activity monitor block collects statistics about the behaviour of other
|
||||
components in the system. This information can be used to derive the rate at
|
||||
which the external memory needs to be clocked in order to serve all requests
|
||||
from the monitored clients.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- nvidia,tegra30-actmon
|
||||
- nvidia,tegra114-actmon
|
||||
- nvidia,tegra124-actmon
|
||||
- nvidia,tegra210-actmon
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: actmon
|
||||
- const: emc
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: actmon
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
interconnects:
|
||||
minItems: 1
|
||||
maxItems: 12
|
||||
|
||||
interconnect-names:
|
||||
minItems: 1
|
||||
maxItems: 12
|
||||
description:
|
||||
Should include name of the interconnect path for each interconnect
|
||||
entry. Consult TRM documentation for information about available
|
||||
memory clients, see MEMORY CONTROLLER and ACTIVITY MONITOR sections.
|
||||
|
||||
operating-points-v2:
|
||||
description:
|
||||
Should contain freqs and voltages and opp-supported-hw property, which
|
||||
is a bitfield indicating SoC speedo ID mask.
|
||||
|
||||
"#cooling-cells":
|
||||
const: 2
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- resets
|
||||
- reset-names
|
||||
- interrupts
|
||||
- interconnects
|
||||
- interconnect-names
|
||||
- operating-points-v2
|
||||
- "#cooling-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/memory/tegra30-mc.h>
|
||||
|
||||
mc: memory-controller@7000f000 {
|
||||
compatible = "nvidia,tegra30-mc";
|
||||
reg = <0x7000f000 0x400>;
|
||||
clocks = <&clk 32>;
|
||||
clock-names = "mc";
|
||||
|
||||
interrupts = <0 77 4>;
|
||||
|
||||
#iommu-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
emc: external-memory-controller@7000f400 {
|
||||
compatible = "nvidia,tegra30-emc";
|
||||
reg = <0x7000f400 0x400>;
|
||||
interrupts = <0 78 4>;
|
||||
clocks = <&clk 57>;
|
||||
|
||||
nvidia,memory-controller = <&mc>;
|
||||
operating-points-v2 = <&dvfs_opp_table>;
|
||||
power-domains = <&domain>;
|
||||
|
||||
#interconnect-cells = <0>;
|
||||
};
|
||||
|
||||
actmon@6000c800 {
|
||||
compatible = "nvidia,tegra30-actmon";
|
||||
reg = <0x6000c800 0x400>;
|
||||
interrupts = <0 45 4>;
|
||||
clocks = <&clk 119>, <&clk 57>;
|
||||
clock-names = "actmon", "emc";
|
||||
resets = <&rst 119>;
|
||||
reset-names = "actmon";
|
||||
operating-points-v2 = <&dvfs_opp_table>;
|
||||
interconnects = <&mc TEGRA30_MC_MPCORER &emc>;
|
||||
interconnect-names = "cpu-read";
|
||||
#cooling-cells = <2>;
|
||||
};
|
@ -103,7 +103,6 @@ config ARM_IMX8M_DDRC_DEVFREQ
|
||||
tristate "i.MX8M DDRC DEVFREQ Driver"
|
||||
depends on (ARCH_MXC && HAVE_ARM_SMCCC) || \
|
||||
(COMPILE_TEST && HAVE_ARM_SMCCC)
|
||||
select DEVFREQ_GOV_SIMPLE_ONDEMAND
|
||||
select DEVFREQ_GOV_USERSPACE
|
||||
help
|
||||
This adds the DEVFREQ driver for the i.MX8M DDR Controller. It allows
|
||||
|
@ -823,6 +823,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||
if (devfreq->profile->timer < 0
|
||||
|| devfreq->profile->timer >= DEVFREQ_TIMER_NUM) {
|
||||
mutex_unlock(&devfreq->lock);
|
||||
err = -EINVAL;
|
||||
goto err_dev;
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq,
|
||||
dev_pm_opp_put(p_opp);
|
||||
|
||||
if (IS_ERR(opp))
|
||||
return PTR_ERR(opp);
|
||||
goto no_required_opp;
|
||||
|
||||
*freq = dev_pm_opp_get_freq(opp);
|
||||
dev_pm_opp_put(opp);
|
||||
@ -73,6 +73,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq,
|
||||
return 0;
|
||||
}
|
||||
|
||||
no_required_opp:
|
||||
/*
|
||||
* Get the OPP table's index of decided frequency by governor
|
||||
* of parent device.
|
||||
|
@ -31,8 +31,8 @@ static int devfreq_userspace_func(struct devfreq *df, unsigned long *freq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t store_freq(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t set_freq_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct devfreq *devfreq = to_devfreq(dev);
|
||||
struct userspace_data *data;
|
||||
@ -52,8 +52,8 @@ static ssize_t store_freq(struct device *dev, struct device_attribute *attr,
|
||||
return err;
|
||||
}
|
||||
|
||||
static ssize_t show_freq(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
static ssize_t set_freq_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct devfreq *devfreq = to_devfreq(dev);
|
||||
struct userspace_data *data;
|
||||
@ -70,7 +70,7 @@ static ssize_t show_freq(struct device *dev, struct device_attribute *attr,
|
||||
return err;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(set_freq, 0644, show_freq, store_freq);
|
||||
static DEVICE_ATTR_RW(set_freq);
|
||||
static struct attribute *dev_entries[] = {
|
||||
&dev_attr_set_freq.attr,
|
||||
NULL,
|
||||
|
@ -45,18 +45,6 @@ static int imx_bus_get_cur_freq(struct device *dev, unsigned long *freq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx_bus_get_dev_status(struct device *dev,
|
||||
struct devfreq_dev_status *stat)
|
||||
{
|
||||
struct imx_bus *priv = dev_get_drvdata(dev);
|
||||
|
||||
stat->busy_time = 0;
|
||||
stat->total_time = 0;
|
||||
stat->current_frequency = clk_get_rate(priv->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void imx_bus_exit(struct device *dev)
|
||||
{
|
||||
struct imx_bus *priv = dev_get_drvdata(dev);
|
||||
@ -129,9 +117,7 @@ static int imx_bus_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->profile.polling_ms = 1000;
|
||||
priv->profile.target = imx_bus_target;
|
||||
priv->profile.get_dev_status = imx_bus_get_dev_status;
|
||||
priv->profile.exit = imx_bus_exit;
|
||||
priv->profile.get_cur_freq = imx_bus_get_cur_freq;
|
||||
priv->profile.initial_freq = clk_get_rate(priv->clk);
|
||||
|
@ -688,6 +688,7 @@ static struct devfreq_dev_profile tegra_devfreq_profile = {
|
||||
.polling_ms = ACTMON_SAMPLING_PERIOD,
|
||||
.target = tegra_devfreq_target,
|
||||
.get_dev_status = tegra_devfreq_get_dev_status,
|
||||
.is_cooling_device = true,
|
||||
};
|
||||
|
||||
static int tegra_governor_get_target(struct devfreq *devfreq,
|
||||
|
Loading…
Reference in New Issue
Block a user