* Re: [PATCH V4 2/2] thermal: broadcom: add Northstar thermal driver
From: Eduardo Valentin @ 2017-04-01 19:54 UTC (permalink / raw)
To: Rafał Miłecki
Cc: Zhang Rui, Rob Herring, Mark Rutland, Stephen Warren, Lee Jones,
Eric Anholt, Florian Fainelli, Ray Jui, Scott Branden,
bcm-kernel-feedback-list, linux-pm, devicetree, linux-rpi-kernel,
linux-arm-kernel, Rafał Miłecki, Jon Mason
In-Reply-To: <20170331201124.656-2-zajec5@gmail.com>
On Fri, Mar 31, 2017 at 10:11:24PM +0200, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
>
> Northstar is a SoC family commonly used in home routers. This commit
> adds a driver for checking CPU temperature. As Northstar Plus seems to
> also have this IP block this new symbol gets ARCH_BCM_IPROC dependency.
>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> Signed-off-by: Jon Mason <jon.mason@broadcom.com>
> ---
This driver looks fine from what concerns the of thermal usage.
I had only one request on the DT bindings example. I believe better to
get the example fixed so bad DTs does not get copied.
> V2: Make it iProc specific as NSP can also use this driver
> Select proper symbols in config ARCH_BCM_IPROC
> Define PVTMON register bits
> Update code selecting temperature monitor mode
> Thank you Jon!
> V3: More details in help message for BCM_NS_THERMAL
> Use slope & offset
> Drop arch code change (I'll be submitted using a proper tree)
> Thank you Eduardo!
> V4: Comment operations on PVTMON_CONTROL0 register
> ---
> drivers/thermal/Kconfig | 5 ++
> drivers/thermal/Makefile | 1 +
> drivers/thermal/broadcom/Kconfig | 8 +++
> drivers/thermal/broadcom/Makefile | 1 +
> drivers/thermal/broadcom/ns-thermal.c | 105 ++++++++++++++++++++++++++++++++++
Also, I have just merged a BRCM driver. Does it make sense to move it
here too?
It does not need to be a blocking request for this driver though.
> 5 files changed, 120 insertions(+)
> create mode 100644 drivers/thermal/broadcom/Kconfig
> create mode 100644 drivers/thermal/broadcom/Makefile
> create mode 100644 drivers/thermal/broadcom/ns-thermal.c
>
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index 776b34396144..008e173ec825 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -392,6 +392,11 @@ config MTK_THERMAL
> Enable this option if you want to have support for thermal management
> controller present in Mediatek SoCs
>
> +menu "Broadcom thermal drivers"
> +depends on ARCH_BCM || COMPILE_TEST
> +source "drivers/thermal/broadcom/Kconfig"
> +endmenu
> +
> menu "Texas Instruments thermal drivers"
> depends on ARCH_HAS_BANDGAP || COMPILE_TEST
> depends on HAS_IOMEM
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index 7adae2029355..549d81b6363c 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -27,6 +27,7 @@ thermal_sys-$(CONFIG_CLOCK_THERMAL) += clock_cooling.o
> thermal_sys-$(CONFIG_DEVFREQ_THERMAL) += devfreq_cooling.o
>
> # platform thermal drivers
> +obj-y += broadcom/
> obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM) += qcom-spmi-temp-alarm.o
> obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o
> obj-$(CONFIG_ROCKCHIP_THERMAL) += rockchip_thermal.o
> diff --git a/drivers/thermal/broadcom/Kconfig b/drivers/thermal/broadcom/Kconfig
> new file mode 100644
> index 000000000000..f0dea8a8e002
> --- /dev/null
> +++ b/drivers/thermal/broadcom/Kconfig
> @@ -0,0 +1,8 @@
> +config BCM_NS_THERMAL
> + tristate "Northstar thermal driver"
> + depends on ARCH_BCM_IPROC || COMPILE_TEST
> + help
> + Northstar is a family of SoCs that includes e.g. BCM4708, BCM47081,
> + BCM4709 and BCM47094. It contains DMU (Device Management Unit) block
> + with a thermal sensor that allows checking CPU temperature. This
> + driver provides support for it.
> diff --git a/drivers/thermal/broadcom/Makefile b/drivers/thermal/broadcom/Makefile
> new file mode 100644
> index 000000000000..059df9a0ed69
> --- /dev/null
> +++ b/drivers/thermal/broadcom/Makefile
> @@ -0,0 +1 @@
> +obj-$(CONFIG_BCM_NS_THERMAL) += ns-thermal.o
> diff --git a/drivers/thermal/broadcom/ns-thermal.c b/drivers/thermal/broadcom/ns-thermal.c
> new file mode 100644
> index 000000000000..eab96b3572b9
> --- /dev/null
> +++ b/drivers/thermal/broadcom/ns-thermal.c
> @@ -0,0 +1,105 @@
> +/*
> + * Copyright (C) 2017 Rafał Miłecki <rafal@milecki.pl>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/of_address.h>
> +#include <linux/platform_device.h>
> +#include <linux/thermal.h>
> +
> +#define PVTMON_CONTROL0 0x00
> +#define PVTMON_CONTROL0_SEL_MASK 0x0000000e
> +#define PVTMON_CONTROL0_SEL_TEMP_MONITOR 0x00000000
> +#define PVTMON_CONTROL0_SEL_TEST_MODE 0x0000000e
> +#define PVTMON_STATUS 0x08
> +
> +struct ns_thermal {
> + struct thermal_zone_device *tz;
> + void __iomem *pvtmon;
> +};
> +
> +static int ns_thermal_get_temp(void *data, int *temp)
> +{
> + struct ns_thermal *ns_thermal = data;
> + int offset = thermal_zone_get_offset(ns_thermal->tz);
> + int slope = thermal_zone_get_slope(ns_thermal->tz);
> + u32 val;
> +
> + val = readl(ns_thermal->pvtmon + PVTMON_CONTROL0);
> + if ((val & PVTMON_CONTROL0_SEL_MASK) != PVTMON_CONTROL0_SEL_TEMP_MONITOR) {
> + /* Clear current mode selection */
> + val &= ~PVTMON_CONTROL0_SEL_MASK;
> +
> + /* Set temp monitor mode (it's the default actually) */
> + val |= PVTMON_CONTROL0_SEL_TEMP_MONITOR;
> +
> + writel(val, ns_thermal->pvtmon + PVTMON_CONTROL0);
> + }
> +
> + val = readl(ns_thermal->pvtmon + PVTMON_STATUS);
> + *temp = slope * val + offset;
> +
> + return 0;
> +}
> +
> +const struct thermal_zone_of_device_ops ns_thermal_ops = {
> + .get_temp = ns_thermal_get_temp,
> +};
> +
> +static int ns_thermal_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct ns_thermal *ns_thermal;
> +
> + ns_thermal = devm_kzalloc(dev, sizeof(*ns_thermal), GFP_KERNEL);
> + if (!ns_thermal)
> + return -ENOMEM;
> +
> + ns_thermal->pvtmon = of_iomap(dev_of_node(dev), 0);
> + if (WARN_ON(!ns_thermal->pvtmon))
> + return -ENOENT;
> +
> + ns_thermal->tz = devm_thermal_zone_of_sensor_register(dev, 0,
> + ns_thermal,
> + &ns_thermal_ops);
> + if (IS_ERR(ns_thermal->tz)) {
> + iounmap(ns_thermal->pvtmon);
> + return PTR_ERR(ns_thermal->tz);
> + }
> +
> + platform_set_drvdata(pdev, ns_thermal);
> +
> + return 0;
> +}
> +
> +static int ns_thermal_remove(struct platform_device *pdev)
> +{
> + struct ns_thermal *ns_thermal = platform_get_drvdata(pdev);
> +
> + iounmap(ns_thermal->pvtmon);
> +
> + return 0;
> +}
> +
> +static const struct of_device_id ns_thermal_of_match[] = {
> + { .compatible = "brcm,ns-thermal", },
> + {},
> +};
> +MODULE_DEVICE_TABLE(of, ns_thermal_of_match);
> +
> +static struct platform_driver ns_thermal_driver = {
> + .probe = ns_thermal_probe,
> + .remove = ns_thermal_remove,
> + .driver = {
> + .name = "ns-thermal",
> + .of_match_table = ns_thermal_of_match,
> + },
> +};
> +module_platform_driver(ns_thermal_driver);
> +
> +MODULE_DESCRIPTION("Northstar thermal driver");
> +MODULE_LICENSE("GPL v2");
> --
> 2.11.0
>
^ permalink raw reply
* Re: [PATCH V4 1/2] dt-bindings: thermal: add support for Broadcom's Northstar thermal
From: Eduardo Valentin @ 2017-04-01 19:51 UTC (permalink / raw)
To: Rafał Miłecki
Cc: Zhang Rui, Rob Herring, Mark Rutland, Stephen Warren, Lee Jones,
Eric Anholt, Florian Fainelli, Ray Jui, Scott Branden,
bcm-kernel-feedback-list, linux-pm, devicetree, linux-rpi-kernel,
linux-arm-kernel, Rafał Miłecki
In-Reply-To: <20170331201124.656-1-zajec5@gmail.com>
Rafal,
On Fri, Mar 31, 2017 at 10:11:23PM +0200, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
>
> This commit documents binding for thermal used in Northstar family SoCs.
>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> ---
> V3: Add thermal-zones to the example
> Rob: Because of this update, I didn't include Acked-by I got for V2
> ---
> .../devicetree/bindings/thermal/brcm,ns-thermal | 26 ++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/thermal/brcm,ns-thermal
>
> diff --git a/Documentation/devicetree/bindings/thermal/brcm,ns-thermal b/Documentation/devicetree/bindings/thermal/brcm,ns-thermal
> new file mode 100644
> index 000000000000..c561c7349f17
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/brcm,ns-thermal
> @@ -0,0 +1,26 @@
> +* Broadcom Northstar Thermal
> +
> +This binding describes thermal sensor that is part of Northstar's DMU (Device
> +Management Unit).
> +
> +Required properties:
> +- compatible : Must be "brcm,ns-thermal"
> +- reg : iomem address range of PVTMON registers
> +- #thermal-sensor-cells : Should be <0>
> +
> +Example:
> +
> +thermal: thermal@1800c2c0 {
> + compatible = "brcm,ns-thermal";
> + reg = <0x1800c2c0 0x10>;
> + #thermal-sensor-cells = <0>;
> +};
> +
> +thermal-zones {
> + cpu_thermal: cpu-thermal {
> + polling-delay-passive = <0>;
> + polling-delay = <1000>;
> + coefficients = <(-556) 418000>;
> + thermal-sensors = <&thermal>;
You need to define trips and cooling devices here. Otherwise, makes
little sense to have this device in thermal subsystem. Here is an
example of minimal set:
https://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git/commit/?h=linus&id=1e2ac9821de6a85d3e8358f238436708d1d46869
The above has no passive action. It is just gonna shutdown the system if
temperature crosses a threshold.
But, a typical cooling device would be CPU frequency throttling. Do you have
that up and running in your routers?
> + };
> +};
> --
> 2.11.0
>
^ permalink raw reply
* Re: [PATCH V12 3/4] ARM64: dts: bcm2837: Define CPU thermal coefficients
From: Eduardo Valentin @ 2017-04-01 16:37 UTC (permalink / raw)
To: Stefan Wahren
Cc: Zhang Rui, kernel, Eric Anholt, Rob Herring, Frank Rowand,
Florian Fainelli, Rafał Miłecki, linux-rpi-kernel,
devicetree, linux-pm
In-Reply-To: <1490990586-30898-4-git-send-email-stefan.wahren@i2se.com>
On Fri, Mar 31, 2017 at 08:03:05PM +0000, Stefan Wahren wrote:
> This defines the bcm2837 SoC specific thermal coefficients in
> order to initialize the thermal driver correctly.
>
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Acked-by: Eduardo Valentin <edubezval@gmail.com>
^ permalink raw reply
* Re: [PATCH V12 2/4] ARM: dts: bcm283x: Add CPU thermal zone with 1 trip point
From: Eduardo Valentin @ 2017-04-01 16:37 UTC (permalink / raw)
To: Stefan Wahren
Cc: Zhang Rui, kernel, Eric Anholt, Rob Herring, Frank Rowand,
Florian Fainelli, Rafał Miłecki, linux-rpi-kernel,
devicetree, linux-pm
In-Reply-To: <1490990586-30898-3-git-send-email-stefan.wahren@i2se.com>
On Fri, Mar 31, 2017 at 08:03:04PM +0000, Stefan Wahren wrote:
> As suggested by Eduardo Valentin this adds the thermal zone for
> the bcm2835 SoC with its single thermal sensor. We start with
> the criticial trip point and leave the cooling devices empty
> since we don't have any at the moment. Since the coefficients
> could vary depending on the SoC we need to define them separate.
>
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Acked-by: Eduardo Valentin <edubezval@gmail.com>
^ permalink raw reply
* Re: [PATCH V12 0/4] thermal: bcm2835: add thermal driver for bcm2835 SoC
From: Eduardo Valentin @ 2017-04-01 16:33 UTC (permalink / raw)
To: Stefan Wahren
Cc: Zhang Rui, kernel, Eric Anholt, Rob Herring, Frank Rowand,
Florian Fainelli, Rafał Miłecki, linux-rpi-kernel,
devicetree, linux-pm
In-Reply-To: <1490990586-30898-1-git-send-email-stefan.wahren@i2se.com>
Hello Stefan,
On Fri, Mar 31, 2017 at 08:03:02PM +0000, Stefan Wahren wrote:
> This is an attempt to finish Martin's great work on the bcm2835
> thermal driver. It includes now all Eduardo's suggestions and the
> explanations from the Raspberry Pi forum [1].
>
> ChangeLog:
> V1 -> V2: added specific settings depending on compatiblity
> added trip point based on register
> setting up ctrl-register if HW is not enabled by firmware
> as per recommendation of Eric (untested)
> check that clock frequency is in range
> (1.9 - 5MHz - as per comment in clk-bcm2835.c)
> V2 -> V4: moved back to thermal (not using bcm sub-directory)
> set polling interval to 1second (was 0ms, so interrupt driven)
> V5 -> V6: added correct depends in KConfig
> removed defined default for RESET_DELAY
> removed obvious comments
> clarify HW setup comments if not set up by FW already
> move clk_prepare_enable to an earlier stage and add error handling
> clarify warning when TS-clock runs out of recommended range
> clk_disable_unprepare added in bcm2835_thermal_remove
> added comment on recommended temperature ranges for SOC
> V6 -> V7: removed depends on ARCH_BCM2836 || ARCH_BCM2837 in Kconfig
> V7 -> V8: rebased
> V8 -> V9: moved to use the thermal framework offset and slope in
> thermal_zone_parameters as per request
> V9 -> V10: implement support for thermal zone descriptor, define offset and
> slope within DT, apply forum explanations, replace symbolic with octal
> permissions
> V10 -> V11: fix parse issue in bcm2837.dtsi, fix probing and remove unused tzp
> V11 -> V12: split of-thermal changes from this series since they aren't
> necessary, avoid double definition of matching table
>
> [1] - https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=160289&p=1040448
>
> Stefan Wahren (4):
> dt-bindings: Add thermal zone to bcm2835-thermal example
> ARM: dts: bcm283x: Add CPU thermal zone with 1 trip point
> ARM64: dts: bcm2837: Define CPU thermal coefficients
> thermal: bcm2835: add thermal driver for bcm2835 SoC
Thanks for the patience and for cleaning the driver. I added patches 1
and 4 into my -linus branch for the next merge window. DTS(i) changes
should go via your arch tree.
BR,
^ permalink raw reply
* Re: [PATCH RFC 2/3] thermal: dove: convert to a thermal OF sensor device
From: Eduardo Valentin @ 2017-04-01 16:15 UTC (permalink / raw)
To: Russell King
Cc: Jason Cooper, Andrew Lunn, Sebastian Hesselbarth, Gregory Clement,
Rob Herring, Mark Rutland, Zhang Rui, linux-arm-kernel,
devicetree, linux-pm
In-Reply-To: <E1cn8qH-0002v6-SE@rmk-PC.armlinux.org.uk>
Russell,
On Sun, Mar 12, 2017 at 07:07:45PM +0000, Russell King wrote:
> Convert the dove thermal infrastructure to an OF sensor device, and add
> the thermal zones for the SoC, with a critical trip point of 120°C.
> This allows us to specify thermal zones and couple them to cooling
> devices in DT.
>
> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
> ---
> arch/arm/boot/dts/dove.dtsi | 17 +++++++++++++++++
> drivers/thermal/dove_thermal.c | 33 +++++++++++++++++++++++++--------
I have no opposition to these changes. The only request, to avoid
conflicts, is to split the patch into driver and DTS changes. We have
been pushing these separately. DTS changes go via the arch tree. Drivers
changes goes via Rui/me.
You can add my:
Acked-by: Eduardo Valentin <edubezval@gmail.com>
On the DTSI patch.
^ permalink raw reply
* [PATCH 1/1] clk: meson: gxbb: remove the "cpu_clk" from the GXBB and GXL driver
From: Martin Blumenstingl @ 2017-04-01 12:55 UTC (permalink / raw)
To: linux-amlogic, jbrunet, narmstrong, linux-clk
Cc: devicetree, khilman, carlo, sboyd, mturquette, linux-arm-kernel,
Martin Blumenstingl
In-Reply-To: <20170401125519.7339-1-martin.blumenstingl@googlemail.com>
It seems that the "cpu_clk" was carried over from the meson8b clock
controller driver. On Meson GX (GXBB/GXL/GXM) the registers which are
used by the cpu_clk have a different purpose (in other words: they don't
control the CPU clock anymore). HHI_SYS_CPU_CLK_CNTL1 bits 31:24 are
reserved according to the public S905 datasheet, while bit 23 is the
"A53_trace_clk_DIS" gate (which according to the datasheet should only
be used in case a silicon bug is discovered) and bits 22:20 are a
divider (A53_trace_clk). The meson clk-cpu code however expects that
bits 28:20 are reserved for a divider (according to the public S805
datasheet this "SCALE_DIV: This value represents an N+1 divider of the
input clock.").
The CPU clock on Meson GX SoCs is provided by the SCPI DVFS clock
driver instead. Two examples from a Meson GXL S905X SoC:
- vcpu (SCPI DVFS clock 0) rate: 1000000000 / cpu_clk rate: 708000000
- vcpu (SCPI DVFS clock 0) rate: 1512000000 / cpu_clk rate: 708000000
Unfortunately the CLKID_CPUCLK was already exported (but is currently
not used) to DT. Due to the removal of this clock definition there is
now a hole in the clk_hw_onecell_data (which is not a problem because
this case is already handled in gxbb_clkc_probe).
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
---
drivers/clk/meson/gxbb.c | 64 ++---------------------------------
drivers/clk/meson/gxbb.h | 2 +-
include/dt-bindings/clock/gxbb-clkc.h | 1 -
3 files changed, 4 insertions(+), 63 deletions(-)
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
index ad5f027af1a2..7cf88ca9bdce 100644
--- a/drivers/clk/meson/gxbb.c
+++ b/drivers/clk/meson/gxbb.c
@@ -278,20 +278,6 @@ static const struct pll_rate_table gxl_gp0_pll_rate_table[] = {
{ /* sentinel */ },
};
-static const struct clk_div_table cpu_div_table[] = {
- { .val = 1, .div = 1 },
- { .val = 2, .div = 2 },
- { .val = 3, .div = 3 },
- { .val = 2, .div = 4 },
- { .val = 3, .div = 6 },
- { .val = 4, .div = 8 },
- { .val = 5, .div = 10 },
- { .val = 6, .div = 12 },
- { .val = 7, .div = 14 },
- { .val = 8, .div = 16 },
- { /* sentinel */ },
-};
-
static struct meson_clk_pll gxbb_fixed_pll = {
.m = {
.reg_off = HHI_MPLL_CNTL,
@@ -612,21 +598,10 @@ static struct meson_clk_mpll gxbb_mpll2 = {
};
/*
- * FIXME cpu clocks and the legacy composite clocks (e.g. clk81) are both PLL
- * post-dividers and should be modeled with their respective PLLs via the
- * forthcoming coordinated clock rates feature
+ * FIXME The legacy composite clocks (e.g. clk81) are both PLL post-dividers
+ * and should be modeled with their respective PLLs via the forthcoming
+ * coordinated clock rates feature
*/
-static struct meson_clk_cpu gxbb_cpu_clk = {
- .reg_off = HHI_SYS_CPU_CLK_CNTL1,
- .div_table = cpu_div_table,
- .clk_nb.notifier_call = meson_clk_cpu_notifier_cb,
- .hw.init = &(struct clk_init_data){
- .name = "cpu_clk",
- .ops = &meson_clk_cpu_ops,
- .parent_names = (const char *[]){ "sys_pll" },
- .num_parents = 1,
- },
-};
static u32 mux_table_clk81[] = { 6, 5, 7 };
@@ -1045,7 +1020,6 @@ static MESON_GATE(gxbb_ao_i2c, HHI_GCLK_AO, 4);
static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
.hws = {
[CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
- [CLKID_CPUCLK] = &gxbb_cpu_clk.hw,
[CLKID_HDMI_PLL] = &gxbb_hdmi_pll.hw,
[CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
[CLKID_FCLK_DIV2] = &gxbb_fclk_div2.hw,
@@ -1165,7 +1139,6 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
static struct clk_hw_onecell_data gxl_hw_onecell_data = {
.hws = {
[CLKID_SYS_PLL] = &gxbb_sys_pll.hw,
- [CLKID_CPUCLK] = &gxbb_cpu_clk.hw,
[CLKID_HDMI_PLL] = &gxbb_hdmi_pll.hw,
[CLKID_FIXED_PLL] = &gxbb_fixed_pll.hw,
[CLKID_FCLK_DIV2] = &gxbb_fclk_div2.hw,
@@ -1430,7 +1403,6 @@ struct clkc_data {
unsigned int clk_dividers_count;
struct meson_clk_audio_divider *const *clk_audio_dividers;
unsigned int clk_audio_dividers_count;
- struct meson_clk_cpu *cpu_clk;
struct clk_hw_onecell_data *hw_onecell_data;
};
@@ -1447,7 +1419,6 @@ static const struct clkc_data gxbb_clkc_data = {
.clk_dividers_count = ARRAY_SIZE(gxbb_clk_dividers),
.clk_audio_dividers = gxbb_audio_dividers,
.clk_audio_dividers_count = ARRAY_SIZE(gxbb_audio_dividers),
- .cpu_clk = &gxbb_cpu_clk,
.hw_onecell_data = &gxbb_hw_onecell_data,
};
@@ -1464,7 +1435,6 @@ static const struct clkc_data gxl_clkc_data = {
.clk_dividers_count = ARRAY_SIZE(gxbb_clk_dividers),
.clk_audio_dividers = gxbb_audio_dividers,
.clk_audio_dividers_count = ARRAY_SIZE(gxbb_audio_dividers),
- .cpu_clk = &gxbb_cpu_clk,
.hw_onecell_data = &gxl_hw_onecell_data,
};
@@ -1479,8 +1449,6 @@ static int gxbb_clkc_probe(struct platform_device *pdev)
const struct clkc_data *clkc_data;
void __iomem *clk_base;
int ret, clkid, i;
- struct clk_hw *parent_hw;
- struct clk *parent_clk;
struct device *dev = &pdev->dev;
clkc_data = of_device_get_match_data(&pdev->dev);
@@ -1502,9 +1470,6 @@ static int gxbb_clkc_probe(struct platform_device *pdev)
for (i = 0; i < clkc_data->clk_mplls_count; i++)
clkc_data->clk_mplls[i]->base = clk_base;
- /* Populate the base address for CPU clk */
- clkc_data->cpu_clk->base = clk_base;
-
/* Populate base address for gates */
for (i = 0; i < clkc_data->clk_gates_count; i++)
clkc_data->clk_gates[i]->reg = clk_base +
@@ -1538,29 +1503,6 @@ static int gxbb_clkc_probe(struct platform_device *pdev)
goto iounmap;
}
- /*
- * Register CPU clk notifier
- *
- * FIXME this is wrong for a lot of reasons. First, the muxes should be
- * struct clk_hw objects. Second, we shouldn't program the muxes in
- * notifier handlers. The tricky programming sequence will be handled
- * by the forthcoming coordinated clock rates mechanism once that
- * feature is released.
- *
- * Furthermore, looking up the parent this way is terrible. At some
- * point we will stop allocating a default struct clk when registering
- * a new clk_hw, and this hack will no longer work. Releasing the ccr
- * feature before that time solves the problem :-)
- */
- parent_hw = clk_hw_get_parent(&clkc_data->cpu_clk->hw);
- parent_clk = parent_hw->clk;
- ret = clk_notifier_register(parent_clk, &clkc_data->cpu_clk->clk_nb);
- if (ret) {
- pr_err("%s: failed to register clock notifier for cpu_clk\n",
- __func__);
- goto iounmap;
- }
-
return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
clkc_data->hw_onecell_data);
diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h
index 17c6aef033ff..36330c2d4433 100644
--- a/drivers/clk/meson/gxbb.h
+++ b/drivers/clk/meson/gxbb.h
@@ -171,7 +171,7 @@
* to be exposed to client nodes in DT: include/dt-bindings/clock/gxbb-clkc.h
*/
#define CLKID_SYS_PLL 0
-/* CLKID_CPUCLK */
+/* ID 1 is unused (it was used by the non-existing CLKID_CPUCLK before) */
/* CLKID_HDMI_PLL */
#define CLKID_FIXED_PLL 3
/* CLKID_FCLK_DIV2 */
diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h
index 4516bc4253b5..54faf83a4851 100644
--- a/include/dt-bindings/clock/gxbb-clkc.h
+++ b/include/dt-bindings/clock/gxbb-clkc.h
@@ -5,7 +5,6 @@
#ifndef __GXBB_CLKC_H
#define __GXBB_CLKC_H
-#define CLKID_CPUCLK 1
#define CLKID_HDMI_PLL 2
#define CLKID_FCLK_DIV2 4
#define CLKID_FCLK_DIV3 5
--
2.12.1
^ permalink raw reply related
* [PATCH 0/1] remove the "cpu_clk" from the GXBB/GXL/GXM driver
From: Martin Blumenstingl @ 2017-04-01 12:55 UTC (permalink / raw)
To: linux-amlogic, jbrunet, narmstrong, linux-clk
Cc: devicetree, khilman, carlo, sboyd, mturquette, linux-arm-kernel,
Martin Blumenstingl
This is the updated version of my RFC patch from [0].
The quick summary for this patch is that the "cpu_clk" seems to have
been copied from the Meson8b clock driver when the GXBB clock driver
was initially added. However, on GXBB (and the other GX SoCs) the
actual CPU clock is provided by a SCPI DVFS clock.
More details can be found in the patch description itself.
This was tested on a Khadas VIM board (GXL S905X).
Changes since the RFC version:
- rebased to the "clk-meson" branch (e65ae3fb97b4 "dt-bindings: clock:
gxbb-clkc: Add GXL compatible variant") and Jerome's audio clock
patches (in version 2: [1])
- remove the now unused cpu_div_table (which was left over in the RFC
version)
- slightly updated the comment for the now unused clock ID 1 in
drivers/clk/meson/gxbb.h
[0] https://patchwork.kernel.org/patch/9644993/
[1] http://lists.infradead.org/pipermail/linux-amlogic/2017-March/003200.html
Martin Blumenstingl (1):
clk: meson: gxbb: remove the "cpu_clk" from the GXBB and GXL driver
drivers/clk/meson/gxbb.c | 64 ++---------------------------------
drivers/clk/meson/gxbb.h | 2 +-
include/dt-bindings/clock/gxbb-clkc.h | 1 -
3 files changed, 4 insertions(+), 63 deletions(-)
--
2.12.1
^ permalink raw reply
* Re: [PATCH v5 1/2] Documentation: dt-bindings: Document bindings for Aspeed ADC
From: Jonathan Cameron @ 2017-04-01 10:51 UTC (permalink / raw)
To: Joel Stanley, Rick Altherr
Cc: OpenBMC Maillist, Linux Kernel Mailing List,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-iio-u79uwXL29TY76Z2rM5mHXA, Hartmut Knaack, Rob Herring,
Lars-Peter Clausen, Mark Rutland, Peter Meerwald-Stadler
In-Reply-To: <CACPK8Xcf2A8RMy7cthJrdi2CA0L_Hfi+2Hy3JBCzLTsofjhEuA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On 29/03/17 03:33, Joel Stanley wrote:
> On Wed, Mar 29, 2017 at 8:22 AM, Rick Altherr <raltherr-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org> wrote:
>> Signed-off-by: Rick Altherr <raltherr-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
>> ---
>
> Acked-by: Joel Stanley <joel-U3u1mxZcP9KHXe+LvDLADg@public.gmane.org>
I can't see why Rob would mind any of the changes made since he
Acked this (and having acked it I doubt he is looking at newer versions!)
so I'm going to take the view his Ack still applies.
Applied to the togreg branch of iio.git which will get pushed out first
as testing for the autobuilders to have a chance to play with it.
Thanks,
Jonathan
>
>>
>> Changes in v5: None
>> Changes in v4: None
>> Changes in v3:
>> - Consistently write hex contstants with lowercase letters
>> - Drop model numbers from description as same IP is used in every generation
>>
>> Changes in v2:
>> - Rewritten as an IIO ADC device
>>
>> .../devicetree/bindings/iio/adc/aspeed_adc.txt | 20 ++++++++++++++++++++
>> 1 file changed, 20 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt
>>
>> diff --git a/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt b/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt
>> new file mode 100644
>> index 000000000000..674e133b7cd7
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt
>> @@ -0,0 +1,20 @@
>> +Aspeed ADC
>> +
>> +This device is a 10-bit converter for 16 voltage channels. All inputs are
>> +single ended.
>> +
>> +Required properties:
>> +- compatible: Should be "aspeed,ast2400-adc" or "aspeed,ast2500-adc"
>> +- reg: memory window mapping address and length
>> +- clocks: Input clock used to derive the sample clock. Expected to be the
>> + SoC's APB clock.
>> +- #io-channel-cells: Must be set to <1> to indicate channels are selected
>> + by index.
>> +
>> +Example:
>> + adc@1e6e9000 {
>> + compatible = "aspeed,ast2400-adc";
>> + reg = <0x1e6e9000 0xb0>;
>> + clocks = <&clk_apb>;
>> + #io-channel-cells = <1>;
>> + };
>> --
>> 2.12.2.564.g063fe858b8-goog
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply
* Re: [PATCH V8 5/6] ACPI: Support the probing on the devices which apply indirect-IO
From: Rafael J. Wysocki @ 2017-04-01 9:52 UTC (permalink / raw)
To: zhichang.yuan
Cc: Rafael J. Wysocki, zhichang.yuan, Rafael J. Wysocki,
Catalin Marinas, Will Deacon, Rob Herring, Frank Rowand,
Bjorn Helgaas, Arnd Bergmann,
linux-arm-kernel@lists.infradead.org, Mark Rutland, Brian Starkey,
Olof Johansson, Lorenzo Pieralisi, Benjamin Herrenschmidt,
Linux Kernel Mailing List, ACPI Devel Maling List, linuxar
In-Reply-To: <bfdf2de0-c309-0139-4075-dfcd678b6d51@gmail.com>
On Sat, Apr 1, 2017 at 4:16 AM, zhichang.yuan <zhichang.yuan02@gmail.com> wrote:
>
>
> On 04/01/2017 07:02 AM, Rafael J. Wysocki wrote:
>> On Fri, Mar 31, 2017 at 8:52 AM, zhichang.yuan
>> <yuanzhichang@hisilicon.com> wrote:
>>> Hi, Rafael,
>>>
>>> Thanks for reviewing this!
>>>
>>> On 2017/3/31 4:31, Rafael J. Wysocki wrote:
>>>> On Thursday, March 30, 2017 11:26:58 PM zhichang.yuan wrote:
>>>>> On some platforms(such as Hip06/Hip07), the legacy ISA/LPC devices access I/O
>>>>> with some special host-local I/O ports known on x86. To access the I/O
>>>>> peripherals, an indirect-IO mechanism is introduced to mapped the host-local
>>>>> I/O to system logical/fake PIO similar the PCI MMIO on architectures where no
>>>>> separate I/O space exists. Just as PCI MMIO, the host I/O range should be
>>>>> registered before probing the downstream devices and set up the I/O mapping.
>>>>> But current ACPI bus probing doesn't support these indirect-IO hosts/devices.
>>>>>
>>>>> This patch introdueces a new ACPI handler for this device category. Through the
>>>>> handler attach callback, the indirect-IO hosts I/O registration is done and
>>>>> all peripherals' I/O resources are translated into logic/fake PIO before
>>>>> starting the enumeration.
>>>>
>>>> Can you explain to me briefly what exactly this code is expected to be doing?
>>>
>>> As you know currently for ARM architecture IO space is memory mapped and
>>> is only used by pci devices. The port number is dynamically allocated
>>> converting the device IO address into a PIO token: i.e.
>>> http://lxr.free-electrons.com/source/drivers/acpi/pci_root.c#L745
>>> This patch is meant to support a new class of IO host controller
>>> that are not PCI based and that still require to have the IO addresses
>>> be translated in the same PIO token space as the PCI controller
>>
>> IOW, this is ARM-specific, right?
>
> Yes. The current host added in this patch with _HID "HISI0191" is on ARM64.
But the underlying mechanism is ARM-specific as well AFAICS.
> But, I think the handler driver is architecture dependent.
I guess you mean "independent"? That doesn't matter.
If ARM64 is the only architecture to use it in foreseeable future
(which is the case for all I can say), it should go into acpi/arm64/
and please ask the maintainers thereof to review it.
Thanks,
Rafael
^ permalink raw reply
* Re: [PATCH v2 2/2] phy: meson: add USB2 PHY support for Meson GXL and GXM
From: Martin Blumenstingl @ 2017-04-01 9:37 UTC (permalink / raw)
To: Kishon Vijay Abraham I
Cc: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
mark.rutland-5wv7dgnIgG8, devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
hendrik-MJglGmTD+GWCT0AhDRffsw, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
carlo-KA+7E9HrN00dnm+yROfE0A, khilman-rdvid1DuHRBWk0Htik3J/w
In-Reply-To: <82edc36e-80ae-3aa2-cd45-664b26a21e4a-l0cyMroinI0@public.gmane.org>
Hi Kishon,
On Wed, Mar 29, 2017 at 12:56 PM, Kishon Vijay Abraham I <kishon-l0cyMroinI0@public.gmane.org> wrote:
> Hi,
>
> On Wednesday 29 March 2017 03:03 AM, Martin Blumenstingl wrote:
>> Hi Kishon,
>>
>> On Sat, Mar 18, 2017 at 2:00 PM, Martin Blumenstingl
>> <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:
>>> This adds a new driver for the USB2 PHYs found on Meson GXL and GXM SoCs
>>> (both SoCs are using the same USB PHY register layout).
>>>
>>> The USB2 PHY is a simple PHY which only has a few registers to configure
>>> the mode (host/device) and a reset register (to enable/disable the PHY).
>>>
>>> Unfortunately there are no datasheets available for this PHY. The driver
>>> was written by reading the code from Amlogic's GPL kernel sources and
>>> by analyzing the registers on an actual GXL and GXM device running the
>>> kernel that was shipped on the boards I have.
>> gentle ping - did you have time to review this patch in v2 yet?
>
> Have a few comments, see below..
thanks for taking the time to review this!
>>
>>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
>>> ---
>>> drivers/phy/Kconfig | 14 ++
>>> drivers/phy/Makefile | 1 +
>>> drivers/phy/phy-meson-gxl-usb2.c | 273 +++++++++++++++++++++++++++++++++++++++
>>> 3 files changed, 288 insertions(+)
>>> create mode 100644 drivers/phy/phy-meson-gxl-usb2.c
>>>
>>> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
>>> index dc5277ad1b5a..2573e139fd17 100644
>>> --- a/drivers/phy/Kconfig
>>> +++ b/drivers/phy/Kconfig
>>> @@ -510,6 +510,19 @@ config PHY_MESON8B_USB2
>>> and GXBB SoCs.
>>> If unsure, say N.
>>>
>>> +config PHY_MESON_GXL_USB
>>> + tristate "Meson GXL and GXM USB2 PHY drivers"
>>> + default ARCH_MESON
>>> + depends on OF && (ARCH_MESON || COMPILE_TEST)
>>> + depends on USB_SUPPORT
>>> + select USB_COMMON
>>> + select GENERIC_PHY
>>> + select REGMAP_MMIO
>>> + help
>>> + Enable this to support the Meson USB2 PHYs found in Meson
>>> + GXL and GXM SoCs.
>>> + If unsure, say N.
>>> +
>>> config PHY_NSP_USB3
>>> tristate "Broadcom NorthStar plus USB3 PHY driver"
>>> depends on OF && (ARCH_BCM_NSP || COMPILE_TEST)
>>> @@ -518,4 +531,5 @@ config PHY_NSP_USB3
>>> help
>>> Enable this to support the Broadcom Northstar plus USB3 PHY.
>>> If unsure, say N.
>>> +
>
> spurious space..
you're right, this shouldn't be here. I'll fix this in the next version
>>> endmenu
>>> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
>>> index e7b0feb1e125..e680b856e38e 100644
>>> --- a/drivers/phy/Makefile
>>> +++ b/drivers/phy/Makefile
>>> @@ -62,4 +62,5 @@ obj-$(CONFIG_PHY_CYGNUS_PCIE) += phy-bcm-cygnus-pcie.o
>>> obj-$(CONFIG_ARCH_TEGRA) += tegra/
>>> obj-$(CONFIG_PHY_NS2_PCIE) += phy-bcm-ns2-pcie.o
>>> obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o
>>> +obj-$(CONFIG_PHY_MESON_GXL_USB) += phy-meson-gxl-usb2.o
>>> obj-$(CONFIG_PHY_NSP_USB3) += phy-bcm-nsp-usb3.o
>>> diff --git a/drivers/phy/phy-meson-gxl-usb2.c b/drivers/phy/phy-meson-gxl-usb2.c
>>> new file mode 100644
>>> index 000000000000..4bf646a52c45
>>> --- /dev/null
>>> +++ b/drivers/phy/phy-meson-gxl-usb2.c
>>> @@ -0,0 +1,273 @@
>>> +/*
>>> + * Meson GXL and GXM USB2 PHY driver
>>> + *
>>> + * Copyright (C) 2017 Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
>>> + *
>>> + * This program is free software; you can redistribute it and/or modify
>>> + * it under the terms of the GNU General Public License version 2 as
>>> + * published by the Free Software Foundation.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
>>> + */
>>> +
>>> +#include <linux/delay.h>
>>> +#include <linux/io.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/regmap.h>
>>> +#include <linux/phy/phy.h>
>>> +#include <linux/platform_device.h>
>>> +#include <linux/usb/of.h>
>>> +
>>> +/* bits [31:27] are read-only */
>>> +#define U2P_R0 0x0
>>> + #define U2P_R0_BYPASS_SEL BIT(0)
>>> + #define U2P_R0_BYPASS_DM_EN BIT(1)
>>> + #define U2P_R0_BYPASS_DP_EN BIT(2)
>>> + #define U2P_R0_TXBITSTUFF_ENH BIT(3)
>>> + #define U2P_R0_TXBITSTUFF_EN BIT(4)
>>> + #define U2P_R0_DM_PULLDOWN BIT(5)
>>> + #define U2P_R0_DP_PULLDOWN BIT(6)
>>> + #define U2P_R0_DP_VBUS_VLD_EXT_SEL BIT(7)
>>> + #define U2P_R0_DP_VBUS_VLD_EXT BIT(8)
>>> + #define U2P_R0_ADP_PRB_EN BIT(9)
>>> + #define U2P_R0_ADP_DISCHARGE BIT(10)
>>> + #define U2P_R0_ADP_CHARGE BIT(11)
>>> + #define U2P_R0_DRV_VBUS BIT(12)
>>> + #define U2P_R0_ID_PULLUP BIT(13)
>>> + #define U2P_R0_LOOPBACK_EN_B BIT(14)
>>> + #define U2P_R0_OTG_DISABLE BIT(15)
>>> + #define U2P_R0_COMMON_ONN BIT(16)
>>> + #define U2P_R0_FSEL_MASK GENMASK(19, 17)
>>> + #define U2P_R0_REF_CLK_SEL_MASK GENMASK(21, 20)
>>> + #define U2P_R0_POWER_ON_RESET BIT(22)
>>> + #define U2P_R0_V_ATE_TEST_EN_B_MASK GENMASK(24, 23)
>>> + #define U2P_R0_ID_SET_ID_DQ BIT(25)
>>> + #define U2P_R0_ATE_RESET BIT(26)
>>> + #define U2P_R0_FSV_MINUS BIT(27)
>>> + #define U2P_R0_FSV_PLUS BIT(28)
>>> + #define U2P_R0_BYPASS_DM_DATA BIT(29)
>>> + #define U2P_R0_BYPASS_DP_DATA BIT(30)
>>> +
>>> +#define U2P_R1 0x4
>>> + #define U2P_R1_BURN_IN_TEST BIT(0)
>>> + #define U2P_R1_ACA_ENABLE BIT(1)
>>> + #define U2P_R1_DCD_ENABLE BIT(2)
>>> + #define U2P_R1_VDAT_SRC_EN_B BIT(3)
>>> + #define U2P_R1_VDAT_DET_EN_B BIT(4)
>>> + #define U2P_R1_CHARGES_SEL BIT(5)
>>> + #define U2P_R1_TX_PREEMP_PULSE_TUNE BIT(6)
>>> + #define U2P_R1_TX_PREEMP_AMP_TUNE_MASK GENMASK(8, 7)
>>> + #define U2P_R1_TX_RES_TUNE_MASK GENMASK(10, 9)
>>> + #define U2P_R1_TX_RISE_TUNE_MASK GENMASK(12, 11)
>>> + #define U2P_R1_TX_VREF_TUNE_MASK GENMASK(16, 13)
>>> + #define U2P_R1_TX_FSLS_TUNE_MASK GENMASK(20, 17)
>>> + #define U2P_R1_TX_HSXV_TUNE_MASK GENMASK(22, 21)
>>> + #define U2P_R1_OTG_TUNE_MASK GENMASK(25, 23)
>>> + #define U2P_R1_SQRX_TUNE_MASK GENMASK(28, 26)
>>> + #define U2P_R1_COMP_DIS_TUNE_MASK GENMASK(31, 29)
>>> +
>>> +/* bits [31:14] are read-only */
>>> +#define U2P_R2 0x8
>>> + #define U2P_R2_DATA_IN_MASK GENMASK(3, 0)
>>> + #define U2P_R2_DATA_IN_EN_MASK GENMASK(7, 4)
>>> + #define U2P_R2_ADDR_MASK GENMASK(11, 8)
>>> + #define U2P_R2_DATA_OUT_SEL BIT(12)
>>> + #define U2P_R2_CLK BIT(13)
>>> + #define U2P_R2_DATA_OUT_MASK GENMASK(17, 14)
>>> + #define U2P_R2_ACA_PIN_RANGE_C BIT(18)
>>> + #define U2P_R2_ACA_PIN_RANGE_B BIT(19)
>>> + #define U2P_R2_ACA_PIN_RANGE_A BIT(20)
>>> + #define U2P_R2_ACA_PIN_GND BIT(21)
>>> + #define U2P_R2_ACA_PIN_FLOAT BIT(22)
>>> + #define U2P_R2_CHARGE_DETECT BIT(23)
>>> + #define U2P_R2_DEVICE_SESSION_VALID BIT(24)
>>> + #define U2P_R2_ADP_PROBE BIT(25)
>>> + #define U2P_R2_ADP_SENSE BIT(26)
>>> + #define U2P_R2_SESSION_END BIT(27)
>>> + #define U2P_R2_VBUS_VALID BIT(28)
>>> + #define U2P_R2_B_VALID BIT(29)
>>> + #define U2P_R2_A_VALID BIT(30)
>>> + #define U2P_R2_ID_DIG BIT(31)
>>> +
>>> +#define U2P_R3 0xc
>>> +
>>> +#define RESET_COMPLETE_TIME 500
>>> +
>>> +struct phy_meson_gxl_usb2_priv {
>>> + struct regmap *regmap;
>>> + enum phy_mode mode;
>>> + int is_enabled;
>>> +};
>>> +
>>> +static const struct regmap_config phy_meson_gxl_usb2_regmap_conf = {
>>> + .reg_bits = 8,
>>> + .val_bits = 32,
>>> + .reg_stride = 4,
>>> + .max_register = U2P_R3,
>>> +};
>>> +
>>> +static int phy_meson_gxl_usb2_reset(struct phy *phy)
>>> +{
>>> + struct phy_meson_gxl_usb2_priv *priv = phy_get_drvdata(phy);
>>> +
>>> + if (priv->is_enabled) {
>>> + /* reset the PHY and wait until settings are stabilized */
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_POWER_ON_RESET,
>>> + U2P_R0_POWER_ON_RESET);
>>> + udelay(RESET_COMPLETE_TIME);
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_POWER_ON_RESET,
>>> + 0);
>>> + udelay(RESET_COMPLETE_TIME);
>>> + }
>
> Instead of having big if condition blocks, it could be
> if (!priv->is_enabled)
> return 0
>
> the configuration when priv->is_enabled is true should go here.
makes sense (and the code easier to read) in this case - I'll fix it
in the next version
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int phy_meson_gxl_usb2_set_mode(struct phy *phy, enum phy_mode mode)
>>> +{
>>> + struct phy_meson_gxl_usb2_priv *priv = phy_get_drvdata(phy);
>>> +
>>> + switch (mode) {
>>> + case PHY_MODE_USB_HOST:
>>> + case PHY_MODE_USB_OTG:
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_DM_PULLDOWN,
>>> + U2P_R0_DM_PULLDOWN);
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_DP_PULLDOWN,
>>> + U2P_R0_DP_PULLDOWN);
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_ID_PULLUP, 0);
>>> + break;
>>> +
>>> + case PHY_MODE_USB_DEVICE:
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_DM_PULLDOWN,
>>> + 0);
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_DP_PULLDOWN,
>>> + 0);
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_ID_PULLUP,
>>> + U2P_R0_ID_PULLUP);
>>> + break;
>>> +
>>> + default:
>>> + return -EINVAL;
>>> + }
>>> +
>>> + phy_meson_gxl_usb2_reset(phy);
>>> +
>>> + priv->mode = mode;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int phy_meson_gxl_usb2_power_off(struct phy *phy)
>>> +{
>>> + struct phy_meson_gxl_usb2_priv *priv = phy_get_drvdata(phy);
>>> +
>>> + priv->is_enabled = 0;
>>> +
>>> + /* power off the PHY by putting it into reset mode */
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_POWER_ON_RESET,
>>> + U2P_R0_POWER_ON_RESET);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static int phy_meson_gxl_usb2_power_on(struct phy *phy)
>>> +{
>>> + struct phy_meson_gxl_usb2_priv *priv = phy_get_drvdata(phy);
>>> + int ret;
>>> +
>>> + priv->is_enabled = 1;
>>> +
>>> + /* power on the PHY by taking it out of reset mode */
>>> + regmap_update_bits(priv->regmap, U2P_R0, U2P_R0_POWER_ON_RESET, 0);
>>> +
>>> + ret = phy_meson_gxl_usb2_set_mode(phy, priv->mode);
>
> Since this is already part of phy_ops, the consumer of this phy will take care
> of setting the mode right?
many USB PHYs are configured through of_usb_get_dr_mode_by_phy()
(which fetches the USB controller DT node and looks up the dr_mode
property). this means that the driver will even work for controller
which did not call phy_set_mode() (currently dwc2 and dwc3 are an
example where phy_set_mode() is not called, and this driver is
probably going to be used by both). are you fine with keeping this or
should we instead investigate why dwc2 and dwc3 are not calling
phy_set_mode yet?
>>> + if (ret) {
>>> + phy_meson_gxl_usb2_power_off(phy);
>
> This would mess up the reference count in phy_core, since this function is also
> part of the phy_ops. The consumer should be responsible for powering off the phy.
actually it shouldn't. it would cause issues if I used
phy_power_off(phy) here, but I'm using the driver-internal callback
here.
if phy_meson_gxl_usb2_power_on() fails then phy_power_on() (from
phy-core) prints a warnings and does not increment the internal
ref-counter (++phy->power_count).
so in my opinion there shouldn't be a problem
could you please have a look at my replies for issue #3 and #4 (both
affecting phy_meson_gxl_usb2_power_on) and let me know what you think?
Regards,
Martin
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH v3 12/37] mtd: nand: denali: support 1024 byte ECC step size
From: Masahiro Yamada @ 2017-04-01 8:43 UTC (permalink / raw)
To: linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Cc: Enrico Jorns, Artem Bityutskiy, Dinh Nguyen, Boris Brezillon,
Marek Vasut, Graham Moore, David Woodhouse, Masami Hiramatsu,
Chuanxiao Dong, Jassi Brar, Masahiro Yamada,
devicetree-u79uwXL29TY76Z2rM5mHXA, Linux Kernel Mailing List,
Brian Norris, Richard Weinberger, Cyrille Pitchen, Rob Herring,
Mark Rutland
In-Reply-To: <1490856383-31560-13-git-send-email-yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org>
2017-03-30 15:45 GMT+09:00 Masahiro Yamada <yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org>:
> This driver was originally written for the Intel MRST platform with
> several platform specific parameters hard-coded. Another thing we
> need to fix is the hard-coded ECC step size. Currently, it is
> defined as follows:
>
> #define ECC_SECTOR_SIZE 512
>
> (somehow, it is defined in both denali.c and denali.h)
>
> This must be avoided because the Denali IP supports 1024B ECC size
> as well. The Denali User's Guide also says supporting both 512B and
> 1024B ECC sectors is possible, though it would require instantiation
> of two different ECC circuits. So, possible cases are:
>
> [1] only 512B ECC size is supported
> [2] only 1024B ECC size is supported
> [3] both 512B and 1024B ECC sizes are supported
>
> Newer versions of this IP need ecc.size and ecc.steps explicitly
> set up via the following registers:
> CFG_DATA_BLOCK_SIZE (0x6b0)
> CFG_LAST_DATA_BLOCK_SIZE (0x6c0)
> CFG_NUM_DATA_BLOCKS (0x6d0)
>
> Older versions do not have such registers (they were reserved), so
> write accesses are safely ignored.
>
> This commit adds new flags DENALI_CAP_ECC_SIZE_{512,1024}.
>
> The DT property "nand-ecc-step-size" is still optional; a reasonable
> default will be chosen for [1] and [2]. For case [3], users can
> force ECC size via DT in case firmware hard-codes ECC settings.
> If not specified, the driver will use chip's ECC requirement as a
> hint to decide the ECC size.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org>
> Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> ---
>
> Changes in v3:
> - Move DENALI_CAP_ define out of struct denali_nand_info
> - Use chip->ecc_step_ds as a hint to choose chip->ecc.size
> where possible
>
Please hold back this patch
until we decide how to handle 14.
--
Best Regards
Masahiro Yamada
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH] ARM: dts: armada-38x: label USB and SATA nodes
From: Ralph Sennhauser @ 2017-04-01 8:09 UTC (permalink / raw)
To: Andrew Lunn
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Jason Cooper,
Gregory Clement, Sebastian Hesselbarth, Rob Herring, Mark Rutland,
Russell King, devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20170331182111.GJ22609-g2DYL2Zd6BY@public.gmane.org>
On Fri, 31 Mar 2017 20:21:11 +0200
Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org> wrote:
> On Fri, Mar 31, 2017 at 07:39:20PM +0200, Ralph Sennhauser wrote:
> > On Fri, 31 Mar 2017 18:50:15 +0200
> > Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org> wrote:
> >
> > > > - sata@a8000 {
> > > > + satac0: sata@a8000 {
> > >
> > > Hi Ralph
> > >
> > > Why the c in satac0?
> >
> > For controller and to not conflict with a use case of sata0 for a
> > port, similarly to pciec and pcie1. See
> > armada-385-synology-ds116.dts.
>
> :~/linux/arch/arm/boot/dts$ ls *ds116*
> ls: cannot access '*ds116*': No such file or directory
Ah, not in mainline yet, from linux-next
commit a58d73340b0ec93fc29a826e45fbbfbc3f81b7eb
Author: Willy Tarreau <w@1wt.eu>
Date: Sun Feb 12 10:30:35 2017 +0100
The arch/arm/boot/dts/armada-388-gp.dts from below was
meant as the example for the conflict I mentioned.
>
> But anyway, a few boards seem to solve this by calling the controller
> node ahci0: and the port sata0:
That's another option I missed.
$ git grep -n ahci.:
arch/arm/boot/dts/spear1310.dtsi:59: ahci0: ahci@b1000000 {
arch/arm/boot/dts/spear1310.dtsi:68: ahci1: ahci@b1800000 {
arch/arm/boot/dts/spear1310.dtsi:77: ahci2: ahci@b4000000 {
arch/arm/boot/dts/spear1340.dtsi:42: ahci0: ahci@b1000000 {
Not a big list which I have here and the nodes themselves are named
ahci@xxxxxxxx.
>
> > > > - usb3@f0000 {
> > > > + usb3_0: usb3@f0000 {
> > > > compatible =
> > > > "marvell,armada-380-xhci"; reg = <0xf0000 0x4000>,<0xf4000
> > > > 0x4000>; interrupts = <GIC_SPI 16
> > > > IRQ_TYPE_LEVEL_HIGH>; @@ -598,7 +598,7 @@
> > > > status = "disabled";
> > > > };
> > > >
> > > > - usb3@f8000 {
> > > > + usb3_1: usb3@f8000 {
> > > > compatible =
> > > > "marvell,armada-380-xhci"; reg = <0xf8000 0x4000>,<0xfc000
> > > > 0x4000>; interrupts = <GIC_SPI 17
> > > > IRQ_TYPE_LEVEL_HIGH>;
> > >
> > > I can understand what you are saying. But does anybody else care?
> > > Are there other .dtsi files differentiating between USB 1.1, 2
> > > and 3?
> >
> > It's handled differently where ever I looked, some do some don't. A
> > case for distinguishing USB 2.0 and USB 3.0 like this is
> > armada-388-gp.dts.
>
> Humm...
>
> /* CON4 */
> usb@58000 {
> vcc-supply = <®_usb2_0_vbus>;
> status = "okay";
> };
>
>
> /* CON5 */
> usb3@f0000 {
> usb-phy = <&usb2_1_phy>;
> status = "okay";
> };
>
> /* CON7 */
> usb3@f8000 {
> usb-phy = <&usb3_phy>;
> status = "okay";
> };
>
> Is this clear? Is CON5 a USB 3 host, but has a USB 2 PHY connected to
> it? CON7 is the only true USB 3 port? I think some comments written in
> schwiizerdütsch would be clearre.:-)
Did you just find a bug? :)
*ufm sprung gxi* (about to head out), sorry for the mix-up. The synology
dts would actually have worked for both usb and sata labels :)
$git grep -hn -A8 usb3_0_phy: arch/arm/boot/dts/armada-385-synology-ds116.dts
191: usb3_0_phy: usb3_0_phy {
192- compatible = "usb-nop-xceiv";
193- vcc-supply = <®_usb3_0_vbus>;
194- };
195-
196- usb3_1_phy: usb3_1_phy {
197- compatible = "usb-nop-xceiv";
198- vcc-supply = <®_usb3_1_vbus>;
199- };
---
Let's add another argument for and against usb3_x type labels:
$ git grep -hn usb arch/arm/boot/dts/armada-38x.dtsi
455: usb0: usb@58000 {
593: usb3_0: usb3@f0000 {
601: usb3_1: usb3@f8000 {
They might actually be considered different types. usb vs. usb3, though
that feels quite arbitrary.
$ git grep -hn usb3_0 Documentation/devicetree/bindings/usb/qcom,dwc3.txt
45: usb3_0: usb30@0 {
usb3_0 could be mistaken for the protocol version. A bit of a stretch as well ...
First thought was using usb0,usb1,usb2. For the individual linksys
boards this meant a potential pit-fall, namely using "usb2:" for the
only USB 3.0 port while "usb0:" for the only USB 2.0 port appears in the
armada-385-linksys.dtsi only, hence the quest for alternatives.
In the end it boils down to I couldn't make out a definitive standard and
made a pick that felt about right.
If there was an obvious choice there wouldn't have been a reason to omit
the labels this patch handles when handling the bulk. Make the bulk a none
discussion item and handle the corner cases later. Guess that's what
happened here.
Thanks
Ralph
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [RFC PATCH 2/5] soc/fsl/qbman: Use shared-dma-pool for QMan private memory allocations
From: Scott Wood @ 2017-04-01 7:25 UTC (permalink / raw)
To: Robin Murphy, Michael Ellerman, roy.pledge-3arQi8VN3Tc,
linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA
Cc: Mark Rutland, madalin.bucur-3arQi8VN3Tc
In-Reply-To: <dfaa1a28-66d8-15fb-7d2d-75e206161770-5wv7dgnIgG8@public.gmane.org>
On Fri, 2017-03-31 at 18:55 +0100, Robin Murphy wrote:
> On 31/03/17 04:27, Michael Ellerman wrote:
> >
> > Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org> writes:
> >
> > >
> > > Hi Roy,
> > >
> > > On 29/03/17 22:13, Roy Pledge wrote:
> > > >
> > > > Use the shared-memory-pool mechanism for frame queue descriptor and
> > > > packed frame descriptor record area allocations.
> > > Thanks for persevering with this - in my opinion it's now looking like
> > > it was worth the effort :)
> > >
> > > AFAICS the ioremap_wc() that this leads to does appear to give back
> > > something non-cacheable on PPC (assuming "pgprot_noncached_wc" isn't
> > > horrendously misnamed), and "no-map" should rule out any cacheable
> > > linear map alias existing, so it would seem that this approach should
> > > avert Scott's concerns about attribute mismatches.
> > How does 'no-map' translate into something being excluded from the
> > linear mapping?
> Reserved regions marked with "no-map" get memblock_remove()d by
> early_init_dt_alloc_reserved_memory_arch(). As I understand things, the
> linear map should only cover memblock areas, and it would be explicitly
> violating the semantics of "no-map" to still cover such a region.
Discontiguous memory isn't supported on these PPC chips. Everything up to
memblock_end_of_DRAM() gets mapped -- and if that were to change, the
fragmentation would waste TLB1 entries.
This also breaks compatibility with existing device trees. I suggest putting
an ifdef in the qbman driver to add the new scheme for non-PPC arches only.
-Scott
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH v3 7/7] ARM: ux500: Add vendor prefix to tps61052 node
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, Rob Herring, Lee Jones, Javier Martinez Canillas,
Mark Rutland, Russell King, linux-arm-kernel
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
The tps61052 device node doesn't have a vendor prefix
in its compatible string, fix it by adding one.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3: None
Changes in v2: None
arch/arm/boot/dts/ste-hrefprev60.dtsi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/boot/dts/ste-hrefprev60.dtsi b/arch/arm/boot/dts/ste-hrefprev60.dtsi
index 5882a2606ac3..3f14b4df69b4 100644
--- a/arch/arm/boot/dts/ste-hrefprev60.dtsi
+++ b/arch/arm/boot/dts/ste-hrefprev60.dtsi
@@ -30,7 +30,7 @@
i2c@80004000 {
tps61052@33 {
- compatible = "tps61052";
+ compatible = "ti,tps61052";
reg = <0x33>;
};
--
2.9.3
^ permalink raw reply related
* [PATCH v3 6/7] mfd: tps6105x: Add OF device ID table
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel; +Cc: devicetree, Rob Herring, Lee Jones, Javier Martinez Canillas
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
The driver doesn't have a struct of_device_id table but supported devices
are registered via Device Trees. This is working on the assumption that a
I2C device registered via OF will always match a legacy I2C device ID and
that the MODALIAS reported will always be of the form i2c:<device>.
But this could change in the future so the correct approach is to have a
OF device ID table if the devices are registered via OF.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3:
- Add a vendor prefix to the compatible string (Rob Herring).
Changes in v2:
- Don't use of_match_ptr() to avoid build warning when CONFIG_OF is disabled.
drivers/mfd/tps6105x.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/mfd/tps6105x.c b/drivers/mfd/tps6105x.c
index baa12ea666fb..187848c93779 100644
--- a/drivers/mfd/tps6105x.c
+++ b/drivers/mfd/tps6105x.c
@@ -173,9 +173,17 @@ static const struct i2c_device_id tps6105x_id[] = {
};
MODULE_DEVICE_TABLE(i2c, tps6105x_id);
+static const struct of_device_id tps6105x_of_match[] = {
+ { .compatible = "ti,tps61050" },
+ { .compatible = "ti,tps61052" },
+ { },
+};
+MODULE_DEVICE_TABLE(of, tps6105x_of_match);
+
static struct i2c_driver tps6105x_driver = {
.driver = {
.name = "tps6105x",
+ .of_match_table = tps6105x_of_match,
},
.probe = tps6105x_probe,
.remove = tps6105x_remove,
--
2.9.3
^ permalink raw reply related
* [PATCH v3 5/7] mfd: Add Device Tree bindings document for TI tps6105x chip
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Rob Herring, Lee Jones,
Javier Martinez Canillas, Mark Rutland
In-Reply-To: <20170401071854.23198-1-javier-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
There are Device Tree source files defining a device node for the
tps61050/61052 I2C chip but there isn't a binding document for it.
Signed-off-by: Javier Martinez Canillas <javier-JPH+aEBZ4P+UEJcrhfAQsw@public.gmane.org>
---
Changes in v3: None
Changes in v2: None
Documentation/devicetree/bindings/mfd/tps6105x.txt | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/tps6105x.txt
diff --git a/Documentation/devicetree/bindings/mfd/tps6105x.txt b/Documentation/devicetree/bindings/mfd/tps6105x.txt
new file mode 100644
index 000000000000..c076f28575fc
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/tps6105x.txt
@@ -0,0 +1,17 @@
+* Device tree bindings for TI TPS61050/61052 Boost Converters
+
+The TP61050/TPS61052 is a high-power "white LED driver". This boost converter
+is also used for other things than white LEDs, and also contains a GPIO pin.
+
+Required properties:
+- compatible: "ti,tps61050" or "ti,tps61052"
+- reg: Specifies the I2C slave address
+
+Example:
+
+i2c0 {
+ tps61052@33 {
+ compatible = "ti,tps61052";
+ reg = <0x33>;
+ };
+};
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* [PATCH v3 4/7] ARM: dts: n8x0: Add vendor prefix to retu node
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel
Cc: Mark Rutland, devicetree, Tony Lindgren, Russell King,
Javier Martinez Canillas, Rob Herring, Benoît Cousson,
linux-omap, Lee Jones, linux-arm-kernel
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
The retu-mfd device node doesn't have a vendor prefix
in its compatible string, fix it by adding one.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3: None
Changes in v2: None
arch/arm/boot/dts/omap2420-n8x0-common.dtsi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/boot/dts/omap2420-n8x0-common.dtsi b/arch/arm/boot/dts/omap2420-n8x0-common.dtsi
index 7e5ffc583c90..a633a55820bb 100644
--- a/arch/arm/boot/dts/omap2420-n8x0-common.dtsi
+++ b/arch/arm/boot/dts/omap2420-n8x0-common.dtsi
@@ -16,7 +16,7 @@
#address-cells = <1>;
#size-cells = <0>;
retu_mfd: retu@1 {
- compatible = "retu-mfd";
+ compatible = "nokia,retu-mfd";
interrupt-parent = <&gpio4>;
interrupts = <12 IRQ_TYPE_EDGE_RISING>;
reg = <0x1>;
--
2.9.3
^ permalink raw reply related
* [PATCH v3 3/7] i2c: i2c-cbus-gpio: Add vendor prefix to retu node in example
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, Rob Herring, Lee Jones, Javier Martinez Canillas,
Wolfram Sang, linux-i2c, Mark Rutland
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
The example contains a device node for a retu-mfd device,
but its compatible string doesn't have a vendor prefix.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3: None
Changes in v2: None
Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt b/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt
index 8ce9cd2855b5..32bcb1943f00 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-cbus-gpio.txt
@@ -21,7 +21,7 @@ i2c@0 {
#size-cells = <0>;
retu-mfd: retu@1 {
- compatible = "retu-mfd";
+ compatible = "nokia,retu-mfd";
reg = <0x1>;
};
};
--
2.9.3
^ permalink raw reply related
* [PATCH v3 2/7] mfd: retu: Add OF device ID table
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel; +Cc: devicetree, Rob Herring, Lee Jones, Javier Martinez Canillas
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
The driver doesn't have a struct of_device_id table but supported devices
are registered via Device Trees. This is working on the assumption that a
I2C device registered via OF will always match a legacy I2C device ID and
that the MODALIAS reported will always be of the form i2c:<device>.
But this could change in the future so the correct approach is to have a
OF device ID table if the devices are registered via OF.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3:
- Add a vendor prefix to the compatible string (Rob Herring).
Changes in v2:
- Don't use of_match_ptr() to avoid build warning when CONFIG_OF is disabled.
drivers/mfd/retu-mfd.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c
index d4c114abeb75..937a1c21eec4 100644
--- a/drivers/mfd/retu-mfd.c
+++ b/drivers/mfd/retu-mfd.c
@@ -308,9 +308,17 @@ static const struct i2c_device_id retu_id[] = {
};
MODULE_DEVICE_TABLE(i2c, retu_id);
+static const struct of_device_id retu_of_match[] = {
+ { .compatible = "nokia,retu-mfd" },
+ { .compatible = "nokia,tahvo-mfd" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, retu_of_match);
+
static struct i2c_driver retu_driver = {
.driver = {
.name = "retu-mfd",
+ .of_match_table = retu_of_match,
},
.probe = retu_probe,
.remove = retu_remove,
--
2.9.3
^ permalink raw reply related
* [PATCH v3 1/7] mfd: Add Device Tree bindings document for retu/tahvo ASIC chips
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel
Cc: devicetree, Rob Herring, Lee Jones, Javier Martinez Canillas,
Mark Rutland
In-Reply-To: <20170401071854.23198-1-javier@osg.samsung.com>
There are Device Tree source files defining a device node for the
retu/tahvo I2C chip, but there isn't a DT binding document for it.
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
---
Changes in v3: None
Changes in v2: None
Documentation/devicetree/bindings/mfd/retu.txt | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/retu.txt
diff --git a/Documentation/devicetree/bindings/mfd/retu.txt b/Documentation/devicetree/bindings/mfd/retu.txt
new file mode 100644
index 000000000000..2309e599a731
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/retu.txt
@@ -0,0 +1,19 @@
+* Device tree bindings for Nokia Retu and Tahvo multi-function device
+
+Retu and Tahvo are a multi-function devices found on Nokia Internet
+Tablets (770, N800 and N810).
+
+Required properties:
+- compatible: "nokia,retu-mfd" or "nokia,tahvo-mfd"
+- reg: Specifies the I2C slave address of the ASIC chip
+
+Example:
+
+i2c0 {
+ retu_mfd: retu@1 {
+ compatible = "nokia,retu-mfd";
+ interrupt-parent = <&gpio4>;
+ interrupts = <12 IRQ_TYPE_EDGE_RISING>;
+ reg = <0x1>;
+ };
+};
--
2.9.3
^ permalink raw reply related
* [PATCH v3 0/7] mfd: Add OF device table to I2C drivers that are missing it
From: Javier Martinez Canillas @ 2017-04-01 7:18 UTC (permalink / raw)
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Rob Herring, Lee Jones,
Javier Martinez Canillas, Benoît Cousson, Wolfram Sang,
linux-i2c-u79uwXL29TY76Z2rM5mHXA, Mark Rutland,
linux-omap-u79uwXL29TY76Z2rM5mHXA, Russell King,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Tony Lindgren
Hello,
This series add OF device ID tables to mfd I2C drivers whose devices are
either used in Device Tree source files or are listed in binding docs as
a compatible string.
That's done because the plan is to change the I2C core to report proper OF
modaliases instead of always reporting a MODALIAS=i2c:<foo> regardless if
a device was registered via DT or using the legacy platform data mechanism.
So these patches will make sure that mfd I2C drivers modules will continue
to be autoloaded once the I2C core is changed to report proper OF modalias.
Users didn't have a vendor prefix in the used compatible strings, but since
there wasn't a DT binding document for these drivers, it can be said that
were working for mere luck and so this series fixes the users and add a DT
binding doc for the drivers.
It's safe to apply the patches independently.
Best regards,
Javier
Changes in v3:
- Add a vendor prefix to the compatible string (Rob Herring).
- Add a vendor prefix to the compatible string (Rob Herring).
Changes in v2:
- Don't use of_match_ptr() to avoid build warning when CONFIG_OF is disabled.
- Don't use of_match_ptr() to avoid build warning when CONFIG_OF is disabled.
Javier Martinez Canillas (7):
mfd: Add Device Tree bindings document for retu/tahvo ASIC chips
mfd: retu: Add OF device ID table
i2c: i2c-cbus-gpio: Add vendor prefix to retu node in example
ARM: dts: n8x0: Add vendor prefix to retu node
mfd: Add Device Tree bindings document for TI tps6105x chip
mfd: tps6105x: Add OF device ID table
ARM: ux500: Add vendor prefix to tps61052 node
.../devicetree/bindings/i2c/i2c-cbus-gpio.txt | 2 +-
Documentation/devicetree/bindings/mfd/retu.txt | 19 +++++++++++++++++++
Documentation/devicetree/bindings/mfd/tps6105x.txt | 17 +++++++++++++++++
arch/arm/boot/dts/omap2420-n8x0-common.dtsi | 2 +-
arch/arm/boot/dts/ste-hrefprev60.dtsi | 2 +-
drivers/mfd/retu-mfd.c | 8 ++++++++
drivers/mfd/tps6105x.c | 8 ++++++++
7 files changed, 55 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/mfd/retu.txt
create mode 100644 Documentation/devicetree/bindings/mfd/tps6105x.txt
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH V8 1/6] LIBIO: Introduce a generic PIO mapping method
From: kbuild test robot @ 2017-04-01 6:31 UTC (permalink / raw)
Cc: kbuild-all, catalin.marinas, will.deacon, robh+dt, frowand.list,
bhelgaas, rafael, arnd, linux-arm-kernel, mark.rutland,
brian.starkey, olof, lorenzo.pieralisi, benh, linux-kernel,
linux-acpi, linuxarm, devicetree, linux-pci, minyard, zourongrong,
john.garry, gabriele.paoloni, zhichang.yuan02, kantyzc, xuwei5,
zhichang.yuan
In-Reply-To: <1490887619-61732-2-git-send-email-yuanzhichang@hisilicon.com>
[-- Attachment #1: Type: text/plain, Size: 29623 bytes --]
Hi zhichang.yuan,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.11-rc4 next-20170331]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/zhichang-yuan/LIBIO-Introduce-a-generic-PIO-mapping-method/20170401-104801
config: m68k-m5475evb_defconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 4.9.0
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=m68k
All error/warnings (new ones prefixed by >>):
lib/logic_pio.c:32:50: error: 'PIO_MAX_SECT' undeclared here (not in a function)
static struct logic_pio_root logic_pio_root_list[PIO_MAX_SECT] = {
^
lib/logic_pio.c:52:3: error: 'PIO_CPU_MMIO' undeclared here (not in a function)
[PIO_CPU_MMIO] = {
^
lib/logic_pio.c:52:2: error: array index in initializer not of integer type
[PIO_CPU_MMIO] = {
^
lib/logic_pio.c:52:2: error: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:53:3: error: field name not in record or union initializer
.sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_CPU_MMIO].sec_head),
^
lib/logic_pio.c:53:3: error: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:54:3: error: field name not in record or union initializer
.sec_min = PIO_SECT_MIN(PIO_CPU_MMIO),
^
lib/logic_pio.c:54:3: error: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:54:3: error: implicit declaration of function 'PIO_SECT_MIN' [-Werror=implicit-function-declaration]
lib/logic_pio.c:55:3: error: field name not in record or union initializer
.sec_max = PIO_SECT_MAX(PIO_CPU_MMIO),
^
lib/logic_pio.c:55:3: error: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:55:3: error: implicit declaration of function 'PIO_SECT_MAX' [-Werror=implicit-function-declaration]
In file included from include/linux/list.h:8:0,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
lib/logic_pio.c: In function 'logic_pio_find_range_byaddr':
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
include/linux/kernel.h:852:18: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/kernel.h:852:48: warning: initialization from incompatible pointer type
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
include/linux/kernel.h:853:3: note: in definition of macro 'container_of'
(type *)( (char *)__mptr - offsetof(type,member) );})
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
In file included from include/linux/compiler.h:62:0,
from include/uapi/linux/stddef.h:1,
from include/linux/stddef.h:4,
from include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/linux/of.h:18,
from lib/logic_pio.c:18:
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
include/linux/compiler-gcc.h:161:21: note: in definition of macro '__compiler_offsetof'
__builtin_offsetof(a, b)
^
include/linux/kernel.h:853:29: note: in expansion of macro 'offsetof'
(type *)( (char *)__mptr - offsetof(type,member) );})
^
include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
In file included from include/linux/pid.h:4:0,
from include/linux/sched.h:13,
from arch/m68k/include/asm/pgtable_mm.h:10,
from arch/m68k/include/asm/pgtable.h:4,
from include/linux/mm.h:68,
from lib/logic_pio.c:20:
include/linux/rculist.h:352:7: error: dereferencing pointer to incomplete type
&pos->member != (head); \
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
In file included from include/linux/list.h:8:0,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
include/linux/rculist.h:353:49: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:18: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:27: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/kernel.h:852:48: warning: initialization makes pointer from integer without a cast
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
include/linux/rculist.h:353:49: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/kernel.h:853:3: note: in definition of macro 'container_of'
(type *)( (char *)__mptr - offsetof(type,member) );})
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
In file included from include/linux/compiler.h:62:0,
from include/uapi/linux/stddef.h:1,
from include/linux/stddef.h:4,
from include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/linux/of.h:18,
from lib/logic_pio.c:18:
include/linux/rculist.h:353:49: error: dereferencing pointer to incomplete type
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
include/linux/compiler-gcc.h:161:21: note: in definition of macro '__compiler_offsetof'
__builtin_offsetof(a, b)
^
include/linux/kernel.h:853:29: note: in expansion of macro 'offsetof'
(type *)( (char *)__mptr - offsetof(type,member) );})
^
include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^
lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^
>> lib/logic_pio.c:78:13: error: dereferencing pointer to incomplete type
if (!range->pio_peer) {
^
In file included from include/linux/kernel.h:13:0,
from include/linux/list.h:8,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
lib/logic_pio.c:80:11: error: dereferencing pointer to incomplete type
&range->hw_start);
^
include/linux/printk.h:303:37: note: in definition of macro 'pr_warning'
printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
^
>> lib/logic_pio.c:79:4: note: in expansion of macro 'pr_warn'
pr_warn("Invalid cpu addr node(%pa) in list!\n",
^
lib/logic_pio.c:83:12: error: dereferencing pointer to incomplete type
if (range->fwnode != fwnode)
^
lib/logic_pio.c:86:21: error: dereferencing pointer to incomplete type
if (start >= range->hw_start + range->size ||
^
lib/logic_pio.c:86:39: error: dereferencing pointer to incomplete type
if (start >= range->hw_start + range->size ||
^
lib/logic_pio.c:87:15: error: dereferencing pointer to incomplete type
end < range->hw_start)
^
lib/logic_pio.c:90:20: error: dereferencing pointer to incomplete type
if (start < range->hw_start ||
^
lib/logic_pio.c:91:16: error: dereferencing pointer to incomplete type
end >= range->hw_start + range->size)
^
lib/logic_pio.c:91:34: error: dereferencing pointer to incomplete type
end >= range->hw_start + range->size)
^
lib/logic_pio.c: In function 'logic_pio_alloc_range':
lib/logic_pio.c:109:19: error: dereferencing pointer to incomplete type
idle_start = root->sec_min;
^
lib/logic_pio.c:110:15: error: dereferencing pointer to incomplete type
*prev = &root->sec_head;
^
In file included from include/linux/list.h:8:0,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
include/linux/kernel.h:852:18: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:111:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(entry, &root->sec_head, list) {
^
lib/logic_pio.c:111:38: error: dereferencing pointer to incomplete type
list_for_each_entry_rcu(entry, &root->sec_head, list) {
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
>> include/linux/rculist.h:277:15: note: in expansion of macro 'lockless_dereference'
container_of(lockless_dereference(ptr), type, member)
^
include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^
lib/logic_pio.c:111:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(entry, &root->sec_head, list) {
^
lib/logic_pio.c:111:38: error: dereferencing pointer to incomplete type
list_for_each_entry_rcu(entry, &root->sec_head, list) {
^
include/linux/kernel.h:852:49: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
include/linux/compiler.h:323:22: note: in expansion of macro '__READ_ONCE'
#define READ_ONCE(x) __READ_ONCE(x, 1)
^
>> include/linux/compiler.h:574:26: note: in expansion of macro 'READ_ONCE'
typeof(p) _________p1 = READ_ONCE(p); \
^
vim +351 include/linux/rculist.h
3943f42c Andrey Utkin 2014-11-14 271 * @member: the name of the list_head within the struct.
72c6a987 Jiri Pirko 2009-04-14 272 *
72c6a987 Jiri Pirko 2009-04-14 273 * This primitive may safely run concurrently with the _rcu list-mutation
72c6a987 Jiri Pirko 2009-04-14 274 * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
72c6a987 Jiri Pirko 2009-04-14 275 */
72c6a987 Jiri Pirko 2009-04-14 276 #define list_entry_rcu(ptr, type, member) \
8db70b13 Patrick Marlier 2015-09-11 @277 container_of(lockless_dereference(ptr), type, member)
72c6a987 Jiri Pirko 2009-04-14 278
72c6a987 Jiri Pirko 2009-04-14 279 /**
f88022a4 Michel Machado 2012-04-10 280 * Where are list_empty_rcu() and list_first_entry_rcu()?
f88022a4 Michel Machado 2012-04-10 281 *
f88022a4 Michel Machado 2012-04-10 282 * Implementing those functions following their counterparts list_empty() and
f88022a4 Michel Machado 2012-04-10 283 * list_first_entry() is not advisable because they lead to subtle race
f88022a4 Michel Machado 2012-04-10 284 * conditions as the following snippet shows:
f88022a4 Michel Machado 2012-04-10 285 *
f88022a4 Michel Machado 2012-04-10 286 * if (!list_empty_rcu(mylist)) {
f88022a4 Michel Machado 2012-04-10 287 * struct foo *bar = list_first_entry_rcu(mylist, struct foo, list_member);
f88022a4 Michel Machado 2012-04-10 288 * do_something(bar);
f88022a4 Michel Machado 2012-04-10 289 * }
f88022a4 Michel Machado 2012-04-10 290 *
f88022a4 Michel Machado 2012-04-10 291 * The list may not be empty when list_empty_rcu checks it, but it may be when
f88022a4 Michel Machado 2012-04-10 292 * list_first_entry_rcu rereads the ->next pointer.
f88022a4 Michel Machado 2012-04-10 293 *
f88022a4 Michel Machado 2012-04-10 294 * Rereading the ->next pointer is not a problem for list_empty() and
f88022a4 Michel Machado 2012-04-10 295 * list_first_entry() because they would be protected by a lock that blocks
f88022a4 Michel Machado 2012-04-10 296 * writers.
f88022a4 Michel Machado 2012-04-10 297 *
f88022a4 Michel Machado 2012-04-10 298 * See list_first_or_null_rcu for an alternative.
f88022a4 Michel Machado 2012-04-10 299 */
f88022a4 Michel Machado 2012-04-10 300
f88022a4 Michel Machado 2012-04-10 301 /**
f88022a4 Michel Machado 2012-04-10 302 * list_first_or_null_rcu - get the first element from a list
72c6a987 Jiri Pirko 2009-04-14 303 * @ptr: the list head to take the element from.
72c6a987 Jiri Pirko 2009-04-14 304 * @type: the type of the struct this is embedded in.
3943f42c Andrey Utkin 2014-11-14 305 * @member: the name of the list_head within the struct.
72c6a987 Jiri Pirko 2009-04-14 306 *
f88022a4 Michel Machado 2012-04-10 307 * Note that if the list is empty, it returns NULL.
72c6a987 Jiri Pirko 2009-04-14 308 *
72c6a987 Jiri Pirko 2009-04-14 309 * This primitive may safely run concurrently with the _rcu list-mutation
72c6a987 Jiri Pirko 2009-04-14 310 * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
72c6a987 Jiri Pirko 2009-04-14 311 */
f88022a4 Michel Machado 2012-04-10 312 #define list_first_or_null_rcu(ptr, type, member) \
0adab9b9 Joe Perches 2013-12-05 313 ({ \
0adab9b9 Joe Perches 2013-12-05 314 struct list_head *__ptr = (ptr); \
7d0ae808 Paul E. McKenney 2015-03-03 315 struct list_head *__next = READ_ONCE(__ptr->next); \
0adab9b9 Joe Perches 2013-12-05 316 likely(__ptr != __next) ? list_entry_rcu(__next, type, member) : NULL; \
f88022a4 Michel Machado 2012-04-10 317 })
72c6a987 Jiri Pirko 2009-04-14 318
82524746 Franck Bui-Huu 2008-05-12 319 /**
ff3c44e6 Tom Herbert 2016-03-07 320 * list_next_or_null_rcu - get the first element from a list
ff3c44e6 Tom Herbert 2016-03-07 321 * @head: the head for the list.
ff3c44e6 Tom Herbert 2016-03-07 322 * @ptr: the list head to take the next element from.
ff3c44e6 Tom Herbert 2016-03-07 323 * @type: the type of the struct this is embedded in.
ff3c44e6 Tom Herbert 2016-03-07 324 * @member: the name of the list_head within the struct.
ff3c44e6 Tom Herbert 2016-03-07 325 *
ff3c44e6 Tom Herbert 2016-03-07 326 * Note that if the ptr is at the end of the list, NULL is returned.
ff3c44e6 Tom Herbert 2016-03-07 327 *
ff3c44e6 Tom Herbert 2016-03-07 328 * This primitive may safely run concurrently with the _rcu list-mutation
ff3c44e6 Tom Herbert 2016-03-07 329 * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock().
ff3c44e6 Tom Herbert 2016-03-07 330 */
ff3c44e6 Tom Herbert 2016-03-07 331 #define list_next_or_null_rcu(head, ptr, type, member) \
ff3c44e6 Tom Herbert 2016-03-07 332 ({ \
ff3c44e6 Tom Herbert 2016-03-07 333 struct list_head *__head = (head); \
ff3c44e6 Tom Herbert 2016-03-07 334 struct list_head *__ptr = (ptr); \
ff3c44e6 Tom Herbert 2016-03-07 335 struct list_head *__next = READ_ONCE(__ptr->next); \
ff3c44e6 Tom Herbert 2016-03-07 336 likely(__next != __head) ? list_entry_rcu(__next, type, \
ff3c44e6 Tom Herbert 2016-03-07 337 member) : NULL; \
ff3c44e6 Tom Herbert 2016-03-07 338 })
ff3c44e6 Tom Herbert 2016-03-07 339
ff3c44e6 Tom Herbert 2016-03-07 340 /**
82524746 Franck Bui-Huu 2008-05-12 341 * list_for_each_entry_rcu - iterate over rcu list of given type
82524746 Franck Bui-Huu 2008-05-12 342 * @pos: the type * to use as a loop cursor.
82524746 Franck Bui-Huu 2008-05-12 343 * @head: the head for your list.
3943f42c Andrey Utkin 2014-11-14 344 * @member: the name of the list_head within the struct.
82524746 Franck Bui-Huu 2008-05-12 345 *
82524746 Franck Bui-Huu 2008-05-12 346 * This list-traversal primitive may safely run concurrently with
82524746 Franck Bui-Huu 2008-05-12 347 * the _rcu list-mutation primitives such as list_add_rcu()
82524746 Franck Bui-Huu 2008-05-12 348 * as long as the traversal is guarded by rcu_read_lock().
82524746 Franck Bui-Huu 2008-05-12 349 */
82524746 Franck Bui-Huu 2008-05-12 350 #define list_for_each_entry_rcu(pos, head, member) \
72c6a987 Jiri Pirko 2009-04-14 @351 for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
e66eed65 Linus Torvalds 2011-05-19 352 &pos->member != (head); \
72c6a987 Jiri Pirko 2009-04-14 @353 pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
82524746 Franck Bui-Huu 2008-05-12 354
82524746 Franck Bui-Huu 2008-05-12 355 /**
69b90729 Alexey Kardashevskiy 2015-12-05 356 * list_entry_lockless - get the struct for this entry
:::::: The code at line 351 was first introduced by commit
:::::: 72c6a9870f901045f2464c3dc6ee8914bfdc07aa rculist.h: introduce list_entry_rcu() and list_first_entry_rcu()
:::::: TO: Jiri Pirko <jpirko@redhat.com>
:::::: CC: Ingo Molnar <mingo@elte.hu>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 6383 bytes --]
^ permalink raw reply
* Re: [PATCH V8 1/6] LIBIO: Introduce a generic PIO mapping method
From: kbuild test robot @ 2017-04-01 5:58 UTC (permalink / raw)
Cc: kbuild-all, catalin.marinas, will.deacon, robh+dt, frowand.list,
bhelgaas, rafael, arnd, linux-arm-kernel, mark.rutland,
brian.starkey, olof, lorenzo.pieralisi, benh, linux-kernel,
linux-acpi, linuxarm, devicetree, linux-pci, minyard, zourongrong,
john.garry, gabriele.paoloni, zhichang.yuan02, kantyzc, xuwei5,
zhichang.yuan
In-Reply-To: <1490887619-61732-2-git-send-email-yuanzhichang@hisilicon.com>
[-- Attachment #1: Type: text/plain, Size: 14599 bytes --]
Hi zhichang.yuan,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.11-rc4 next-20170331]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/zhichang-yuan/LIBIO-Introduce-a-generic-PIO-mapping-method/20170401-104801
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=alpha
All error/warnings (new ones prefixed by >>):
>> lib/logic_pio.c:32:50: error: 'PIO_MAX_SECT' undeclared here (not in a function)
static struct logic_pio_root logic_pio_root_list[PIO_MAX_SECT] = {
^~~~~~~~~~~~
>> lib/logic_pio.c:39:3: error: 'PIO_CPU_MMIO' undeclared here (not in a function)
[PIO_CPU_MMIO ... PIO_INDIRECT - 1] = {
^~~~~~~~~~~~
>> lib/logic_pio.c:39:20: error: 'PIO_INDIRECT' undeclared here (not in a function)
[PIO_CPU_MMIO ... PIO_INDIRECT - 1] = {
^~~~~~~~~~~~
>> lib/logic_pio.c:39:3: error: array index in initializer not of integer type
[PIO_CPU_MMIO ... PIO_INDIRECT - 1] = {
^~~~~~~~~~~~
lib/logic_pio.c:39:3: note: (near initialization for 'logic_pio_root_list')
>> lib/logic_pio.c:40:3: error: field name not in record or union initializer
.sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_CPU_MMIO].sec_head),
^
lib/logic_pio.c:40:3: note: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:41:3: error: field name not in record or union initializer
.sec_min = PIO_SECT_MIN(PIO_CPU_MMIO),
^
lib/logic_pio.c:41:3: note: (near initialization for 'logic_pio_root_list')
>> lib/logic_pio.c:41:14: error: implicit declaration of function 'PIO_SECT_MIN' [-Werror=implicit-function-declaration]
.sec_min = PIO_SECT_MIN(PIO_CPU_MMIO),
^~~~~~~~~~~~
lib/logic_pio.c:42:3: error: field name not in record or union initializer
.sec_max = PIO_SECT_MAX(PIO_INDIRECT - 1),
^
lib/logic_pio.c:42:3: note: (near initialization for 'logic_pio_root_list')
>> lib/logic_pio.c:42:14: error: implicit declaration of function 'PIO_SECT_MAX' [-Werror=implicit-function-declaration]
.sec_max = PIO_SECT_MAX(PIO_INDIRECT - 1),
^~~~~~~~~~~~
lib/logic_pio.c:46:3: error: array index in initializer not of integer type
[PIO_INDIRECT] = {
^~~~~~~~~~~~
lib/logic_pio.c:46:3: note: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:47:3: error: field name not in record or union initializer
.sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_INDIRECT].sec_head),
^
lib/logic_pio.c:47:3: note: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:48:3: error: field name not in record or union initializer
.sec_min = PIO_SECT_MIN(PIO_INDIRECT),
^
lib/logic_pio.c:48:3: note: (near initialization for 'logic_pio_root_list')
lib/logic_pio.c:49:3: error: field name not in record or union initializer
.sec_max = PIO_SECT_MAX(PIO_INDIRECT),
^
lib/logic_pio.c:49:3: note: (near initialization for 'logic_pio_root_list')
In file included from include/linux/list.h:8:0,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
lib/logic_pio.c: In function 'logic_pio_find_range_byaddr':
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type 'struct logic_pio_hwaddr'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
include/linux/kernel.h:852:18: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^~~~
>> include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^~~~~~~~~~~~~~
>> lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^~~~~~~~~~~~~~~~~~~~~~~
include/linux/kernel.h:852:48: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
>> include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^~~~~~~~~~~~
>> include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^~~~~~~~~~~~~~
>> lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^~~~~~~~~~~~~~~~~~~~~~~
>> include/linux/kernel.h:852:48: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
>> include/linux/rculist.h:277:2: note: in expansion of macro 'container_of'
container_of(lockless_dereference(ptr), type, member)
^~~~~~~~~~~~
include/linux/rculist.h:353:9: note: in expansion of macro 'list_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^~~~~~~~~~~~~~
>> lib/logic_pio.c:77:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(range, &io_range_list, list) {
^~~~~~~~~~~~~~~~~~~~~~~
lib/logic_pio.c: In function 'logic_pio_alloc_range':
>> lib/logic_pio.c:109:19: error: dereferencing pointer to incomplete type 'struct logic_pio_root'
idle_start = root->sec_min;
^~
In file included from include/linux/list.h:8:0,
from include/linux/kobject.h:20,
from include/linux/of.h:21,
from lib/logic_pio.c:18:
>> include/linux/rculist.h:351:49: error: dereferencing pointer to incomplete type 'struct logic_pio_sect'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
include/linux/kernel.h:852:18: note: in definition of macro 'container_of'
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^~~~
>> include/linux/rculist.h:351:13: note: in expansion of macro 'list_entry_rcu'
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^~~~~~~~~~~~~~
lib/logic_pio.c:111:2: note: in expansion of macro 'list_for_each_entry_rcu'
list_for_each_entry_rcu(entry, &root->sec_head, list) {
^~~~~~~~~~~~~~~~~~~~~~~
>> include/linux/kernel.h:852:48: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
vim +/PIO_MAX_SECT +32 lib/logic_pio.c
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
> 18 #include <linux/of.h>
19 #include <linux/io.h>
20 #include <linux/mm.h>
21 #include <linux/rculist.h>
22 #include <linux/sizes.h>
23 #include <linux/slab.h>
24
25 /* The unique hardware address list. */
26 static LIST_HEAD(io_range_list);
27 static DEFINE_MUTEX(io_range_mutex);
28
29 /*
30 * These are the lists for PIO. The highest PIO_SECT_BITS of PIO is the index.
31 */
> 32 static struct logic_pio_root logic_pio_root_list[PIO_MAX_SECT] = {
33 #ifdef CONFIG_INDIRECT_PIO
34 /*
35 * At this moment, assign all the other logic PIO space to MMIO.
36 * If more elements added, please adjust the ending index and .sec_max;
37 * Please keep MMIO element started from index ZERO.
38 */
> 39 [PIO_CPU_MMIO ... PIO_INDIRECT - 1] = {
> 40 .sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_CPU_MMIO].sec_head),
> 41 .sec_min = PIO_SECT_MIN(PIO_CPU_MMIO),
> 42 .sec_max = PIO_SECT_MAX(PIO_INDIRECT - 1),
43 },
44
45 /* The last element */
46 [PIO_INDIRECT] = {
47 .sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_INDIRECT].sec_head),
48 .sec_min = PIO_SECT_MIN(PIO_INDIRECT),
49 .sec_max = PIO_SECT_MAX(PIO_INDIRECT),
50 },
51 #else
52 [PIO_CPU_MMIO] = {
53 .sec_head = LIST_HEAD_INIT(logic_pio_root_list[PIO_CPU_MMIO].sec_head),
54 .sec_min = PIO_SECT_MIN(PIO_CPU_MMIO),
55 .sec_max = PIO_SECT_MAX(PIO_CPU_MMIO),
56 },
57
58 #endif
59 };
60
61 /*
62 * Search a io_range registered which match the fwnode and addr.
63 *
64 * @fwnode: the host fwnode which must be valid;
65 * @start: the start hardware address of this search;
66 * @end: the end hardware address of this search. can be equal to @start;
67 *
68 * return NULL when there is no matched node; IS_ERR() means ERROR;
69 * valid virtual address represent a matched node was found.
70 */
71 static struct logic_pio_hwaddr *
72 logic_pio_find_range_byaddr(struct fwnode_handle *fwnode,
73 resource_size_t start, resource_size_t end)
74 {
75 struct logic_pio_hwaddr *range;
76
> 77 list_for_each_entry_rcu(range, &io_range_list, list) {
78 if (!range->pio_peer) {
79 pr_warn("Invalid cpu addr node(%pa) in list!\n",
80 &range->hw_start);
81 continue;
82 }
83 if (range->fwnode != fwnode)
84 continue;
85 /* without any overlap with current range */
86 if (start >= range->hw_start + range->size ||
87 end < range->hw_start)
88 continue;
89 /* overlap is not supported now. */
90 if (start < range->hw_start ||
91 end >= range->hw_start + range->size)
92 return ERR_PTR(-EBUSY);
93 /* had been registered. */
94 return range;
95 }
96
97 return NULL;
98 }
99
100
101 static int logic_pio_alloc_range(struct logic_pio_root *root,
102 resource_size_t size, unsigned long align,
103 struct list_head **prev, resource_size_t *pio_alloc)
104 {
105 struct logic_pio_sect *entry;
106 resource_size_t tmp_start;
107 resource_size_t idle_start, idle_end;
108
> 109 idle_start = root->sec_min;
110 *prev = &root->sec_head;
111 list_for_each_entry_rcu(entry, &root->sec_head, list) {
112 if (!entry->hwpeer ||
113 idle_start > entry->io_start) {
114 WARN(1, "skip an invalid io range during traversal!\n");
115 goto nextentry;
116 }
117 /* set the end edge. */
118 if (idle_start == entry->io_start) {
119 struct logic_pio_sect *next;
120
121 idle_start = entry->io_start + entry->hwpeer->size;
> 122 next = list_next_or_null_rcu(&root->sec_head,
> 123 &entry->list, struct logic_pio_sect, list);
124 if (next) {
125 entry = next;
126 } else {
127 *prev = &entry->list;
128 break;
129 }
130 }
131 idle_end = entry->io_start - 1;
132
133 /* contiguous range... */
134 if (idle_start > idle_end)
135 goto nextentry;
136
137 tmp_start = idle_start;
138 idle_start = ALIGN(idle_start, align);
139 if (idle_start >= tmp_start &&
140 idle_start + size <= idle_end) {
141 *prev = &entry->list;
142 *pio_alloc = idle_start;
143 return 0;
144 }
145
146 nextentry:
147 idle_start = entry->io_start + entry->hwpeer->size;
148 *prev = &entry->list;
149 }
150 /* check the last free gap... */
151 idle_end = root->sec_max;
152
153 tmp_start = idle_start;
154 idle_start = ALIGN(idle_start, align);
155 if (idle_start >= tmp_start &&
156 idle_start + size <= idle_end) {
157 *pio_alloc = idle_start;
158 return 0;
159 }
160
161 return -EBUSY;
162 }
163
164 /*
165 * register a io range node in the io range list.
166 *
167 * @newrange: pointer to the io range to be registered.
168 *
169 * return 'newrange' when success, ERR_VALUE() is for failures.
170 * specially, return a valid pointer which is not equal to 'newrange' when
171 * the io range had been registered before.
172 */
173 struct logic_pio_hwaddr
174 *logic_pio_register_range(struct logic_pio_hwaddr *newrange,
175 unsigned long align)
176 {
177 struct logic_pio_hwaddr *range;
178 struct logic_pio_sect *newsect;
179 resource_size_t pio_alloc;
180 struct list_head *prev, *hwprev;
181 unsigned long sect_id;
182 int err;
183
184 if (!newrange || !newrange->fwnode || !newrange->size)
185 return ERR_PTR(-EINVAL);
186
187 sect_id = newrange->flags;
188 if (sect_id >= PIO_MAX_SECT)
189 return ERR_PTR(-EINVAL);
190
191 mutex_lock(&io_range_mutex);
192 range = logic_pio_find_range_byaddr(newrange->fwnode,
193 newrange->hw_start,
194 newrange->hw_start + newrange->size - 1);
195 if (range) {
196 if (!IS_ERR(range))
197 pr_info("the request IO range had been registered!\n");
198 else
199 pr_err("registering IO[%pa - sz%pa) got failed!\n",
200 &newrange->hw_start, &newrange->size);
201 mutex_unlock(&io_range_mutex);
202 return range;
203 }
204
205 err = logic_pio_alloc_range(&logic_pio_root_list[sect_id],
206 newrange->size, align, &prev, &pio_alloc);
207 if (err) {
208 pr_err("can't find free %pa logical IO range!\n",
209 &newrange->size);
210 goto exitproc;
211 }
212
213 if (prev == &logic_pio_root_list[sect_id].sec_head) {
214 hwprev = &io_range_list;
215 } else {
> 216 newsect = to_pio_sect(prev);
> 217 hwprev = &newsect->hwpeer->list;
218 }
219
220 newsect = kzalloc(sizeof(*newsect), GFP_KERNEL);
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 49584 bytes --]
^ permalink raw reply
* Re: [PATCH 2/2] ARM: dts: imx7: add USDHC NAND clock to SDHC instances
From: Stefan Agner @ 2017-04-01 4:15 UTC (permalink / raw)
To: Dong Aisheng
Cc: shawnguo-DgEjT+Ai2ygdnm+yROfE0A, kernel-bIcnvbaLZ9MEGnE8C9+IrQ,
sboyd-sgV2jX0FEOL9JmXXK+q4OQ, aisheng.dong-3arQi8VN3Tc,
fabio.estevam-3arQi8VN3Tc, robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
mark.rutland-5wv7dgnIgG8,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-clk-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20170401030312.GB24882@b29396-OptiPlex-7040>
On 2017-03-31 20:03, Dong Aisheng wrote:
> On Wed, Mar 29, 2017 at 05:50:29PM -0700, Stefan Agner wrote:
>> The USDHC instances need the USDHC NAND clock in order to operate.
>> Add the clock as ahb bus clock.
>>
>> Signed-off-by: Stefan Agner <stefan-XLVq0VzYD2Y@public.gmane.org>
>> ---
>> arch/arm/boot/dts/imx7s.dtsi | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
>> index 5d3a43b8de20..5794febb19a4 100644
>> --- a/arch/arm/boot/dts/imx7s.dtsi
>> +++ b/arch/arm/boot/dts/imx7s.dtsi
>> @@ -936,7 +936,7 @@
>> reg = <0x30b40000 0x10000>;
>> interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
>> clocks = <&clks IMX7D_CLK_DUMMY>,
>
> Would you please change the left ipg dummy to IMX7D_IPG_ROOT_CLK as well?
IMX7D_IPG_ROOT_CLK is currently not a valid clock in upstream... So we
would have to add it to the clock driver first.
I guess we could/should add it anyway at one point? But probably also as
init on, just to make sure Linux does not disable it since it is
currently used by several IPs implicitly.
--
Stefan
>
> Otherwise,
>
> Acked-by: Dong Aisheng <aisheng.dong-3arQi8VN3Tc@public.gmane.org>
>
> Regards
> Dong Aisheng
>
>> - <&clks IMX7D_CLK_DUMMY>,
>> + <&clks IMX7D_NAND_USDHC_BUS_ROOT_CLK>,
>> <&clks IMX7D_USDHC1_ROOT_CLK>;
>> clock-names = "ipg", "ahb", "per";
>> bus-width = <4>;
>> @@ -948,7 +948,7 @@
>> reg = <0x30b50000 0x10000>;
>> interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
>> clocks = <&clks IMX7D_CLK_DUMMY>,
>> - <&clks IMX7D_CLK_DUMMY>,
>> + <&clks IMX7D_NAND_USDHC_BUS_ROOT_CLK>,
>> <&clks IMX7D_USDHC2_ROOT_CLK>;
>> clock-names = "ipg", "ahb", "per";
>> bus-width = <4>;
>> @@ -960,7 +960,7 @@
>> reg = <0x30b60000 0x10000>;
>> interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
>> clocks = <&clks IMX7D_CLK_DUMMY>,
>> - <&clks IMX7D_CLK_DUMMY>,
>> + <&clks IMX7D_NAND_USDHC_BUS_ROOT_CLK>,
>> <&clks IMX7D_USDHC3_ROOT_CLK>;
>> clock-names = "ipg", "ahb", "per";
>> bus-width = <4>;
>> --
>> 2.12.1
>>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox