Skip to content

Commit

Permalink
Merge tag 'devfreq-next-for-5.14' of git://git.kernel.org/pub/scm/lin…
Browse files Browse the repository at this point in the history
…ux/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()
  • Loading branch information
rafaeljw committed Jun 25, 2021
2 parents 13311e7 + 8c37d01 commit bc6f492
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 78 deletions.

This file was deleted.

126 changes: 126 additions & 0 deletions Documentation/devicetree/bindings/devfreq/nvidia,tegra30-actmon.yaml
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
- Jon Hunter <[email protected]>
- Thierry Reding <[email protected]>

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>;
};
1 change: 0 additions & 1 deletion drivers/devfreq/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions drivers/devfreq/devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
3 changes: 2 additions & 1 deletion drivers/devfreq/governor_passive.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,15 @@ 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);

return 0;
}

no_required_opp:
/*
* Get the OPP table's index of decided frequency by governor
* of parent device.
Expand Down
10 changes: 5 additions & 5 deletions drivers/devfreq/governor_userspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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,
Expand Down
14 changes: 0 additions & 14 deletions drivers/devfreq/imx-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions drivers/devfreq/tegra30-devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit bc6f492

Please sign in to comment.