All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
@ 2013-03-26 10:16 ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel, linux-pm
  Cc: Lior Amsalem, Nobuhiro Iwamatsu, Zhang Rui,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper, Ezequiel Garcia

After Andrew Lunn objected the single driver approach [1] that merged
all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
by step. For the time being we are adding support for Armada 370/XP only.
Given both Armada 370 and Armada XP have a similar feature set, it
makes sense to provide a single driver for them.

In the future we can unify this with the other drivers,
if this proves to be worthwhile.

This driver has been influenced by the existing Kirkwood driver,
also taking account of suggestions made by Jason Gunthorpe.

Testing has been done on the following boards:

For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP

This series is based in v3.9-rc2. To make testing easier this patchset
can be found on a github branch [2].

Changes from v1:
  * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
  * Make armada_get_temp() more readable, as requested by Durgadoss R.

Any feedback or comments are welcome!

[1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
[2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2

Ezequiel Garcia (4):
  thermal: Add driver for Armada 370/XP SoC thermal management
  ARM: mvebu: Add thermal support to Armada XP device tree
  ARM: mvebu: Add thermal support to Armada 370 device tree
  ARM: configs: Update mvebu defconfig for thermal

 .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
 arch/arm/boot/dts/armada-370.dtsi                  |    6 +
 arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
 arch/arm/configs/mvebu_defconfig                   |    2 +
 drivers/thermal/Kconfig                            |    8 +
 drivers/thermal/Makefile                           |    1 +
 drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
 7 files changed, 281 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
 create mode 100644 drivers/thermal/armada_thermal.c

-- 
1.7.8.6


^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
@ 2013-03-26 10:16 ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel

After Andrew Lunn objected the single driver approach [1] that merged
all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
by step. For the time being we are adding support for Armada 370/XP only.
Given both Armada 370 and Armada XP have a similar feature set, it
makes sense to provide a single driver for them.

In the future we can unify this with the other drivers,
if this proves to be worthwhile.

This driver has been influenced by the existing Kirkwood driver,
also taking account of suggestions made by Jason Gunthorpe.

Testing has been done on the following boards:

For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP

This series is based in v3.9-rc2. To make testing easier this patchset
can be found on a github branch [2].

Changes from v1:
  * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
  * Make armada_get_temp() more readable, as requested by Durgadoss R.

Any feedback or comments are welcome!

[1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
[2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2

Ezequiel Garcia (4):
  thermal: Add driver for Armada 370/XP SoC thermal management
  ARM: mvebu: Add thermal support to Armada XP device tree
  ARM: mvebu: Add thermal support to Armada 370 device tree
  ARM: configs: Update mvebu defconfig for thermal

 .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
 arch/arm/boot/dts/armada-370.dtsi                  |    6 +
 arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
 arch/arm/configs/mvebu_defconfig                   |    2 +
 drivers/thermal/Kconfig                            |    8 +
 drivers/thermal/Makefile                           |    1 +
 drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
 7 files changed, 281 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
 create mode 100644 drivers/thermal/armada_thermal.c

-- 
1.7.8.6

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-26 10:16   ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel, linux-pm
  Cc: Lior Amsalem, Nobuhiro Iwamatsu, Zhang Rui,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper, Ezequiel Garcia

This driver supports both Armada 370 and Armada XP SoC
thermal management controllers.

Armada 370 has a register to check a valid temperature, whereas
Armada XP does not. Each has a different initialization (i.e. calibration)
function. The temperature conversion formula is the same for both.

The controller present in each SoC have a very similar feature set,
so it corresponds to have one driver to support both of them.

Although this driver may present similarities to Dove and Kirkwood
thermal driver, the exact differences and coincidences are not fully
known. For this reason, support is given through a separate driver.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
Changes from v1:
 * Make armada_get_temp() more readable by reading the register
   on a separate line, as requested by Durgadoss R.

 * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.

 .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
 drivers/thermal/Kconfig                            |    8 +
 drivers/thermal/Makefile                           |    1 +
 drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
 4 files changed, 267 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
 create mode 100644 drivers/thermal/armada_thermal.c

diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
new file mode 100644
index 0000000..fff93d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
@@ -0,0 +1,22 @@
+* Marvell Armada 370/XP thermal management
+
+Required properties:
+
+- compatible:	Should be set to one of the following:
+		marvell,armada370-thermal
+		marvell,armadaxp-thermal
+
+- reg:		Device's register space.
+		Two entries are expected, see the examples below.
+		The first one is required for the sensor register;
+		the second one is required for the control register
+		to be used for sensor initialization (a.k.a. calibration).
+
+Example:
+
+	thermal@d0018300 {
+		compatible = "marvell,armada370-thermal";
+                reg = <0xd0018300 0x4
+		       0xd0018304 0x4>;
+		status = "okay";
+	};
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index a764f16..9eddf74 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -144,6 +144,14 @@ config DB8500_THERMAL
 	  created. Cooling devices can be bound to the trip points to cool this
 	  thermal zone if trip points reached.
 
+config ARMADA_THERMAL
+	tristate "Armada 370/XP thermal management"
+	depends on ARCH_MVEBU
+	depends on OF
+	help
+	  Enable this option if you want to have support for thermal management
+	  controller present in Armada 370 and Armada XP SoC.
+
 config DB8500_CPUFREQ_COOLING
 	tristate "DB8500 cpufreq cooling"
 	depends on ARCH_U8500
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index d3a2b38..7f6509a 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
 obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
 obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
 obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
+obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
 obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
 obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
 
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
new file mode 100644
index 0000000..6743ec2
--- /dev/null
+++ b/drivers/thermal/armada_thermal.c
@@ -0,0 +1,236 @@
+/*
+ * Marvell Armada 370/XP thermal sensor driver
+ *
+ * Copyright (C) 2013 Marvell
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/thermal.h>
+
+#define THERMAL_VALID_OFFSET		9
+#define THERMAL_VALID_MASK		0x1
+#define THERMAL_TEMP_OFFSET		10
+#define THERMAL_TEMP_MASK		0x1ff
+
+/* Thermal Manager Control and Status Register */
+#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
+#define PMU_TM_DISABLE_OFFS		0
+#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
+#define PMU_TDC0_REF_CAL_CNT_OFFS	11
+#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
+#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
+#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
+
+struct armada_thermal_ops;
+
+/* Marvell EBU Thermal Sensor Dev Structure */
+struct armada_thermal_priv {
+	void __iomem *sensor;
+	void __iomem *control;
+	struct armada_thermal_ops *ops;
+};
+
+struct armada_thermal_ops {
+	/* Initialize the sensor */
+	void (*init_sensor)(struct armada_thermal_priv *);
+
+	/* Test for a valid sensor value (optional) */
+	bool (*is_valid)(struct armada_thermal_priv *);
+};
+
+static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	/* ??? */
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* Reset the sensor */
+	reg = readl_relaxed(priv->control);
+	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
+
+	writel(reg, priv->control);
+
+	/* Enable the sensor */
+	reg = readl_relaxed(priv->sensor);
+	reg &= ~PMU_TM_DISABLE_MASK;
+	writel(reg, priv->sensor);
+}
+
+static void armada370_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	/* ??? */
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* ??? */
+	reg &= ~PMU_TDC0_START_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* FIXME: Why do we need this delay? */
+	mdelay(10);
+}
+
+static bool armada_is_valid(struct armada_thermal_priv *priv)
+{
+	unsigned long reg = readl_relaxed(priv->sensor);
+
+	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
+}
+
+static int armada_get_temp(struct thermal_zone_device *thermal,
+			  unsigned long *temp)
+{
+	struct armada_thermal_priv *priv = thermal->devdata;
+	unsigned long reg;
+
+	/* Valid check */
+	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
+		dev_err(&thermal->device,
+			"Temperature sensor reading not valid\n");
+		return -EIO;
+	}
+
+	reg = readl_relaxed(priv->sensor);
+	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
+	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
+	return 0;
+}
+
+static struct thermal_zone_device_ops ops = {
+	.get_temp = armada_get_temp,
+};
+
+static const struct armada_thermal_ops armadaxp_ops = {
+	.init_sensor = armadaxp_init_sensor,
+};
+
+static const struct armada_thermal_ops armada370_ops = {
+	.is_valid = armada_is_valid,
+	.init_sensor = armada370_init_sensor,
+};
+
+static const struct of_device_id armada_thermal_id_table[] = {
+	{
+		.compatible = "marvell,armadaxp-thermal",
+		.data       = &armadaxp_ops,
+	},
+	{
+		.compatible = "marvell,armada370-thermal",
+		.data       = &armada370_ops,
+	},
+	{
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
+
+static int armada_thermal_probe(struct platform_device *pdev)
+{
+	struct thermal_zone_device *thermal;
+	const struct of_device_id *match;
+	struct armada_thermal_priv *priv;
+	struct resource *res;
+
+	match = of_match_device(armada_thermal_id_table, &pdev->dev);
+	if (!match)
+		return -ENODEV;
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->sensor))
+		return PTR_ERR(priv->sensor);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->control = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->control))
+		return PTR_ERR(priv->control);
+
+	priv->ops = (struct armada_thermal_ops *)match->data;
+	priv->ops->init_sensor(priv);
+
+	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
+					       priv, &ops, NULL, 0, 0);
+	if (IS_ERR(thermal)) {
+		dev_err(&pdev->dev,
+			"Failed to register thermal zone device\n");
+		return PTR_ERR(thermal);
+	}
+
+	platform_set_drvdata(pdev, thermal);
+
+	return 0;
+}
+
+static int armada_thermal_exit(struct platform_device *pdev)
+{
+	struct thermal_zone_device *armada_thermal =
+		platform_get_drvdata(pdev);
+
+	thermal_zone_device_unregister(armada_thermal);
+	platform_set_drvdata(pdev, NULL);
+
+	return 0;
+}
+
+static struct platform_driver armada_thermal_driver = {
+	.probe = armada_thermal_probe,
+	.remove = armada_thermal_exit,
+	.driver = {
+		.name = "armada_thermal",
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(armada_thermal_id_table),
+	},
+};
+
+module_platform_driver(armada_thermal_driver);
+
+MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
+MODULE_DESCRIPTION("Armada 370/XP thermal driver");
+MODULE_LICENSE("GPL v2");
-- 
1.7.8.6


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-03-26 10:16   ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel

This driver supports both Armada 370 and Armada XP SoC
thermal management controllers.

Armada 370 has a register to check a valid temperature, whereas
Armada XP does not. Each has a different initialization (i.e. calibration)
function. The temperature conversion formula is the same for both.

The controller present in each SoC have a very similar feature set,
so it corresponds to have one driver to support both of them.

Although this driver may present similarities to Dove and Kirkwood
thermal driver, the exact differences and coincidences are not fully
known. For this reason, support is given through a separate driver.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
Changes from v1:
 * Make armada_get_temp() more readable by reading the register
   on a separate line, as requested by Durgadoss R.

 * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.

 .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
 drivers/thermal/Kconfig                            |    8 +
 drivers/thermal/Makefile                           |    1 +
 drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
 4 files changed, 267 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
 create mode 100644 drivers/thermal/armada_thermal.c

diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
new file mode 100644
index 0000000..fff93d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
@@ -0,0 +1,22 @@
+* Marvell Armada 370/XP thermal management
+
+Required properties:
+
+- compatible:	Should be set to one of the following:
+		marvell,armada370-thermal
+		marvell,armadaxp-thermal
+
+- reg:		Device's register space.
+		Two entries are expected, see the examples below.
+		The first one is required for the sensor register;
+		the second one is required for the control register
+		to be used for sensor initialization (a.k.a. calibration).
+
+Example:
+
+	thermal at d0018300 {
+		compatible = "marvell,armada370-thermal";
+                reg = <0xd0018300 0x4
+		       0xd0018304 0x4>;
+		status = "okay";
+	};
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index a764f16..9eddf74 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -144,6 +144,14 @@ config DB8500_THERMAL
 	  created. Cooling devices can be bound to the trip points to cool this
 	  thermal zone if trip points reached.
 
+config ARMADA_THERMAL
+	tristate "Armada 370/XP thermal management"
+	depends on ARCH_MVEBU
+	depends on OF
+	help
+	  Enable this option if you want to have support for thermal management
+	  controller present in Armada 370 and Armada XP SoC.
+
 config DB8500_CPUFREQ_COOLING
 	tristate "DB8500 cpufreq cooling"
 	depends on ARCH_U8500
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index d3a2b38..7f6509a 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
 obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
 obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
 obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
+obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
 obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
 obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
 
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
new file mode 100644
index 0000000..6743ec2
--- /dev/null
+++ b/drivers/thermal/armada_thermal.c
@@ -0,0 +1,236 @@
+/*
+ * Marvell Armada 370/XP thermal sensor driver
+ *
+ * Copyright (C) 2013 Marvell
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/thermal.h>
+
+#define THERMAL_VALID_OFFSET		9
+#define THERMAL_VALID_MASK		0x1
+#define THERMAL_TEMP_OFFSET		10
+#define THERMAL_TEMP_MASK		0x1ff
+
+/* Thermal Manager Control and Status Register */
+#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
+#define PMU_TM_DISABLE_OFFS		0
+#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
+#define PMU_TDC0_REF_CAL_CNT_OFFS	11
+#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
+#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
+#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
+
+struct armada_thermal_ops;
+
+/* Marvell EBU Thermal Sensor Dev Structure */
+struct armada_thermal_priv {
+	void __iomem *sensor;
+	void __iomem *control;
+	struct armada_thermal_ops *ops;
+};
+
+struct armada_thermal_ops {
+	/* Initialize the sensor */
+	void (*init_sensor)(struct armada_thermal_priv *);
+
+	/* Test for a valid sensor value (optional) */
+	bool (*is_valid)(struct armada_thermal_priv *);
+};
+
+static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	/* ??? */
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* Reset the sensor */
+	reg = readl_relaxed(priv->control);
+	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
+
+	writel(reg, priv->control);
+
+	/* Enable the sensor */
+	reg = readl_relaxed(priv->sensor);
+	reg &= ~PMU_TM_DISABLE_MASK;
+	writel(reg, priv->sensor);
+}
+
+static void armada370_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	/* ??? */
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* ??? */
+	reg &= ~PMU_TDC0_START_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* FIXME: Why do we need this delay? */
+	mdelay(10);
+}
+
+static bool armada_is_valid(struct armada_thermal_priv *priv)
+{
+	unsigned long reg = readl_relaxed(priv->sensor);
+
+	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
+}
+
+static int armada_get_temp(struct thermal_zone_device *thermal,
+			  unsigned long *temp)
+{
+	struct armada_thermal_priv *priv = thermal->devdata;
+	unsigned long reg;
+
+	/* Valid check */
+	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
+		dev_err(&thermal->device,
+			"Temperature sensor reading not valid\n");
+		return -EIO;
+	}
+
+	reg = readl_relaxed(priv->sensor);
+	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
+	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
+	return 0;
+}
+
+static struct thermal_zone_device_ops ops = {
+	.get_temp = armada_get_temp,
+};
+
+static const struct armada_thermal_ops armadaxp_ops = {
+	.init_sensor = armadaxp_init_sensor,
+};
+
+static const struct armada_thermal_ops armada370_ops = {
+	.is_valid = armada_is_valid,
+	.init_sensor = armada370_init_sensor,
+};
+
+static const struct of_device_id armada_thermal_id_table[] = {
+	{
+		.compatible = "marvell,armadaxp-thermal",
+		.data       = &armadaxp_ops,
+	},
+	{
+		.compatible = "marvell,armada370-thermal",
+		.data       = &armada370_ops,
+	},
+	{
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
+
+static int armada_thermal_probe(struct platform_device *pdev)
+{
+	struct thermal_zone_device *thermal;
+	const struct of_device_id *match;
+	struct armada_thermal_priv *priv;
+	struct resource *res;
+
+	match = of_match_device(armada_thermal_id_table, &pdev->dev);
+	if (!match)
+		return -ENODEV;
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->sensor))
+		return PTR_ERR(priv->sensor);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->control = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->control))
+		return PTR_ERR(priv->control);
+
+	priv->ops = (struct armada_thermal_ops *)match->data;
+	priv->ops->init_sensor(priv);
+
+	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
+					       priv, &ops, NULL, 0, 0);
+	if (IS_ERR(thermal)) {
+		dev_err(&pdev->dev,
+			"Failed to register thermal zone device\n");
+		return PTR_ERR(thermal);
+	}
+
+	platform_set_drvdata(pdev, thermal);
+
+	return 0;
+}
+
+static int armada_thermal_exit(struct platform_device *pdev)
+{
+	struct thermal_zone_device *armada_thermal =
+		platform_get_drvdata(pdev);
+
+	thermal_zone_device_unregister(armada_thermal);
+	platform_set_drvdata(pdev, NULL);
+
+	return 0;
+}
+
+static struct platform_driver armada_thermal_driver = {
+	.probe = armada_thermal_probe,
+	.remove = armada_thermal_exit,
+	.driver = {
+		.name = "armada_thermal",
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(armada_thermal_id_table),
+	},
+};
+
+module_platform_driver(armada_thermal_driver);
+
+MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
+MODULE_DESCRIPTION("Armada 370/XP thermal driver");
+MODULE_LICENSE("GPL v2");
-- 
1.7.8.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 2/4] ARM: mvebu: Add thermal support to Armada XP device tree
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-26 10:16   ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel, linux-pm
  Cc: Lior Amsalem, Nobuhiro Iwamatsu, Zhang Rui,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper, Ezequiel Garcia

This patch adds support for the thermal controller available in
all Armada XP boards. This controller has two 4-byte registers:
one to read the thermal sensor, the other for sensor initialization.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
This patch depends on the patch to support Armada XP thermal driver:
'thermal: Add driver for Armada 370/XP SoC thermal management'

 arch/arm/boot/dts/armada-xp.dtsi |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi
index ca00d83..29dfeb6 100644
--- a/arch/arm/boot/dts/armada-xp.dtsi
+++ b/arch/arm/boot/dts/armada-xp.dtsi
@@ -151,5 +151,11 @@
 			status = "disabled";
 		};
 
+		thermal@d00182b0 {
+			compatible = "marvell,armadaxp-thermal";
+			reg = <0xd00182b0 0x4
+			       0xd00184d0 0x4>;
+			status = "okay";
+		};
 	};
 };
-- 
1.7.8.6


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 2/4] ARM: mvebu: Add thermal support to Armada XP device tree
@ 2013-03-26 10:16   ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds support for the thermal controller available in
all Armada XP boards. This controller has two 4-byte registers:
one to read the thermal sensor, the other for sensor initialization.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
This patch depends on the patch to support Armada XP thermal driver:
'thermal: Add driver for Armada 370/XP SoC thermal management'

 arch/arm/boot/dts/armada-xp.dtsi |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi
index ca00d83..29dfeb6 100644
--- a/arch/arm/boot/dts/armada-xp.dtsi
+++ b/arch/arm/boot/dts/armada-xp.dtsi
@@ -151,5 +151,11 @@
 			status = "disabled";
 		};
 
+		thermal at d00182b0 {
+			compatible = "marvell,armadaxp-thermal";
+			reg = <0xd00182b0 0x4
+			       0xd00184d0 0x4>;
+			status = "okay";
+		};
 	};
 };
-- 
1.7.8.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 3/4] ARM: mvebu: Add thermal support to Armada 370 device tree
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-26 10:16   ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel, linux-pm
  Cc: Lior Amsalem, Nobuhiro Iwamatsu, Zhang Rui,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper, Ezequiel Garcia

This patch adds support for the thermal controller available in
all Armada 370 boards. This controller has two 4-byte registers:
one to read the thermal sensor, the other for sensor initialization.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
This patch depends on the patch to support Armada 370 thermal driver:
'thermal: Add driver for Armada 370/XP SoC thermal management'

 arch/arm/boot/dts/armada-370.dtsi |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi
index 8188d13..5831994 100644
--- a/arch/arm/boot/dts/armada-370.dtsi
+++ b/arch/arm/boot/dts/armada-370.dtsi
@@ -153,5 +153,11 @@
 			clocks = <&coreclk 0>;
 		};
 
+		thermal@d0018300 {
+			compatible = "marvell,armada370-thermal";
+			reg = <0xd0018300 0x4
+			       0xd0018304 0x4>;
+			status = "okay";
+		};
 	};
 };
-- 
1.7.8.6


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 3/4] ARM: mvebu: Add thermal support to Armada 370 device tree
@ 2013-03-26 10:16   ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel

This patch adds support for the thermal controller available in
all Armada 370 boards. This controller has two 4-byte registers:
one to read the thermal sensor, the other for sensor initialization.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
This patch depends on the patch to support Armada 370 thermal driver:
'thermal: Add driver for Armada 370/XP SoC thermal management'

 arch/arm/boot/dts/armada-370.dtsi |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi
index 8188d13..5831994 100644
--- a/arch/arm/boot/dts/armada-370.dtsi
+++ b/arch/arm/boot/dts/armada-370.dtsi
@@ -153,5 +153,11 @@
 			clocks = <&coreclk 0>;
 		};
 
+		thermal at d0018300 {
+			compatible = "marvell,armada370-thermal";
+			reg = <0xd0018300 0x4
+			       0xd0018304 0x4>;
+			status = "okay";
+		};
 	};
 };
-- 
1.7.8.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 4/4] ARM: configs: Update mvebu defconfig for thermal
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-26 10:16   ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel, linux-pm
  Cc: Lior Amsalem, Nobuhiro Iwamatsu, Zhang Rui,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper, Ezequiel Garcia

The thermal management driver for Armada XP/370 has been added
so we update the defconfig to reflect this.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
 arch/arm/configs/mvebu_defconfig |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig
index 2ec8119..fc7e8be 100644
--- a/arch/arm/configs/mvebu_defconfig
+++ b/arch/arm/configs/mvebu_defconfig
@@ -49,6 +49,8 @@ CONFIG_MTD_M25P80=y
 CONFIG_SERIAL_8250_DW=y
 CONFIG_GPIOLIB=y
 CONFIG_GPIO_SYSFS=y
+CONFIG_THERMAL=y
+CONFIG_ARMADA_THERMAL=y
 CONFIG_USB_SUPPORT=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
-- 
1.7.8.6


^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 4/4] ARM: configs: Update mvebu defconfig for thermal
@ 2013-03-26 10:16   ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-26 10:16 UTC (permalink / raw)
  To: linux-arm-kernel

The thermal management driver for Armada XP/370 has been added
so we update the defconfig to reflect this.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
---
 arch/arm/configs/mvebu_defconfig |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig
index 2ec8119..fc7e8be 100644
--- a/arch/arm/configs/mvebu_defconfig
+++ b/arch/arm/configs/mvebu_defconfig
@@ -49,6 +49,8 @@ CONFIG_MTD_M25P80=y
 CONFIG_SERIAL_8250_DW=y
 CONFIG_GPIOLIB=y
 CONFIG_GPIO_SYSFS=y
+CONFIG_THERMAL=y
+CONFIG_ARMADA_THERMAL=y
 CONFIG_USB_SUPPORT=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
-- 
1.7.8.6

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-26 16:46   ` Andrew Lunn
  -1 siblings, 0 replies; 26+ messages in thread
From: Andrew Lunn @ 2013-03-26 16:46 UTC (permalink / raw)
  To: Ezequiel Garcia
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Zhang Rui, Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

On Tue, Mar 26, 2013 at 07:16:24AM -0300, Ezequiel Garcia wrote:
> After Andrew Lunn objected the single driver approach [1] that merged
> all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
> by step. For the time being we are adding support for Armada 370/XP only.
> Given both Armada 370 and Armada XP have a similar feature set, it
> makes sense to provide a single driver for them.
> 
> In the future we can unify this with the other drivers,
> if this proves to be worthwhile.
> 
> This driver has been influenced by the existing Kirkwood driver,
> also taking account of suggestions made by Jason Gunthorpe.
> 
> Testing has been done on the following boards:
> 
> For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
> For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP
> 
> This series is based in v3.9-rc2. To make testing easier this patchset
> can be found on a github branch [2].
> 
> Changes from v1:
>   * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
>   * Make armada_get_temp() more readable, as requested by Durgadoss R.
> 
> Any feedback or comments are welcome!

Acked-by: Andrew Lunn <andrew@lunn.ch>

> 
> [1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
> [2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2
> 
> Ezequiel Garcia (4):
>   thermal: Add driver for Armada 370/XP SoC thermal management
>   ARM: mvebu: Add thermal support to Armada XP device tree
>   ARM: mvebu: Add thermal support to Armada 370 device tree
>   ARM: configs: Update mvebu defconfig for thermal
> 
>  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
>  arch/arm/boot/dts/armada-370.dtsi                  |    6 +
>  arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
>  arch/arm/configs/mvebu_defconfig                   |    2 +
>  drivers/thermal/Kconfig                            |    8 +
>  drivers/thermal/Makefile                           |    1 +
>  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
>  7 files changed, 281 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
>  create mode 100644 drivers/thermal/armada_thermal.c
> 
> -- 
> 1.7.8.6
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
@ 2013-03-26 16:46   ` Andrew Lunn
  0 siblings, 0 replies; 26+ messages in thread
From: Andrew Lunn @ 2013-03-26 16:46 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Mar 26, 2013 at 07:16:24AM -0300, Ezequiel Garcia wrote:
> After Andrew Lunn objected the single driver approach [1] that merged
> all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
> by step. For the time being we are adding support for Armada 370/XP only.
> Given both Armada 370 and Armada XP have a similar feature set, it
> makes sense to provide a single driver for them.
> 
> In the future we can unify this with the other drivers,
> if this proves to be worthwhile.
> 
> This driver has been influenced by the existing Kirkwood driver,
> also taking account of suggestions made by Jason Gunthorpe.
> 
> Testing has been done on the following boards:
> 
> For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
> For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP
> 
> This series is based in v3.9-rc2. To make testing easier this patchset
> can be found on a github branch [2].
> 
> Changes from v1:
>   * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
>   * Make armada_get_temp() more readable, as requested by Durgadoss R.
> 
> Any feedback or comments are welcome!

Acked-by: Andrew Lunn <andrew@lunn.ch>

> 
> [1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
> [2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2
> 
> Ezequiel Garcia (4):
>   thermal: Add driver for Armada 370/XP SoC thermal management
>   ARM: mvebu: Add thermal support to Armada XP device tree
>   ARM: mvebu: Add thermal support to Armada 370 device tree
>   ARM: configs: Update mvebu defconfig for thermal
> 
>  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
>  arch/arm/boot/dts/armada-370.dtsi                  |    6 +
>  arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
>  arch/arm/configs/mvebu_defconfig                   |    2 +
>  drivers/thermal/Kconfig                            |    8 +
>  drivers/thermal/Makefile                           |    1 +
>  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
>  7 files changed, 281 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
>  create mode 100644 drivers/thermal/armada_thermal.c
> 
> -- 
> 1.7.8.6
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-03-26 10:16   ` Ezequiel Garcia
@ 2013-03-28  1:43     ` Zhang Rui
  -1 siblings, 0 replies; 26+ messages in thread
From: Zhang Rui @ 2013-03-28  1:43 UTC (permalink / raw)
  To: Ezequiel Garcia
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> This driver supports both Armada 370 and Armada XP SoC
> thermal management controllers.
> 
> Armada 370 has a register to check a valid temperature, whereas
> Armada XP does not. Each has a different initialization (i.e. calibration)
> function. The temperature conversion formula is the same for both.
> 
> The controller present in each SoC have a very similar feature set,
> so it corresponds to have one driver to support both of them.
> 
> Although this driver may present similarities to Dove and Kirkwood
> thermal driver, the exact differences and coincidences are not fully
> known. For this reason, support is given through a separate driver.
> 
> Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> ---
> Changes from v1:
>  * Make armada_get_temp() more readable by reading the register
>    on a separate line, as requested by Durgadoss R.
> 
>  * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.
> 
>  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
>  drivers/thermal/Kconfig                            |    8 +
>  drivers/thermal/Makefile                           |    1 +
>  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
>  4 files changed, 267 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
>  create mode 100644 drivers/thermal/armada_thermal.c
> 
> diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> new file mode 100644
> index 0000000..fff93d5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> @@ -0,0 +1,22 @@
> +* Marvell Armada 370/XP thermal management
> +
> +Required properties:
> +
> +- compatible:	Should be set to one of the following:
> +		marvell,armada370-thermal
> +		marvell,armadaxp-thermal
> +
> +- reg:		Device's register space.
> +		Two entries are expected, see the examples below.
> +		The first one is required for the sensor register;
> +		the second one is required for the control register
> +		to be used for sensor initialization (a.k.a. calibration).
> +
> +Example:
> +
> +	thermal@d0018300 {
> +		compatible = "marvell,armada370-thermal";
> +                reg = <0xd0018300 0x4
> +		       0xd0018304 0x4>;
> +		status = "okay";
> +	};
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index a764f16..9eddf74 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -144,6 +144,14 @@ config DB8500_THERMAL
>  	  created. Cooling devices can be bound to the trip points to cool this
>  	  thermal zone if trip points reached.
>  
> +config ARMADA_THERMAL
> +	tristate "Armada 370/XP thermal management"
> +	depends on ARCH_MVEBU
> +	depends on OF
> +	help
> +	  Enable this option if you want to have support for thermal management
> +	  controller present in Armada 370 and Armada XP SoC.
> +
>  config DB8500_CPUFREQ_COOLING
>  	tristate "DB8500 cpufreq cooling"
>  	depends on ARCH_U8500
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index d3a2b38..7f6509a 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
>  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
>  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
>  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
>  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
>  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
>  
> diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> new file mode 100644
> index 0000000..6743ec2
> --- /dev/null
> +++ b/drivers/thermal/armada_thermal.c
> @@ -0,0 +1,236 @@
> +/*
> + * Marvell Armada 370/XP thermal sensor driver
> + *
> + * Copyright (C) 2013 Marvell
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/of.h>
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_device.h>
> +#include <linux/thermal.h>
> +
> +#define THERMAL_VALID_OFFSET		9
> +#define THERMAL_VALID_MASK		0x1
> +#define THERMAL_TEMP_OFFSET		10
> +#define THERMAL_TEMP_MASK		0x1ff
> +
> +/* Thermal Manager Control and Status Register */
> +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> +#define PMU_TM_DISABLE_OFFS		0
> +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> +
> +struct armada_thermal_ops;
> +
> +/* Marvell EBU Thermal Sensor Dev Structure */
> +struct armada_thermal_priv {
> +	void __iomem *sensor;
> +	void __iomem *control;
> +	struct armada_thermal_ops *ops;
> +};
> +
> +struct armada_thermal_ops {
> +	/* Initialize the sensor */
> +	void (*init_sensor)(struct armada_thermal_priv *);
> +
> +	/* Test for a valid sensor value (optional) */
> +	bool (*is_valid)(struct armada_thermal_priv *);
> +};
> +
> +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	/* ??? */

what does this comment mean?

> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* Reset the sensor */
> +	reg = readl_relaxed(priv->control);
> +	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
> +
> +	writel(reg, priv->control);
> +
> +	/* Enable the sensor */
> +	reg = readl_relaxed(priv->sensor);
> +	reg &= ~PMU_TM_DISABLE_MASK;
> +	writel(reg, priv->sensor);
> +}
> +
> +static void armada370_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	/* ??? */

ditto.

thanks,
rui
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* ??? */
> +	reg &= ~PMU_TDC0_START_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* FIXME: Why do we need this delay? */
> +	mdelay(10);
> +}
> +
> +static bool armada_is_valid(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg = readl_relaxed(priv->sensor);
> +
> +	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
> +}
> +
> +static int armada_get_temp(struct thermal_zone_device *thermal,
> +			  unsigned long *temp)
> +{
> +	struct armada_thermal_priv *priv = thermal->devdata;
> +	unsigned long reg;
> +
> +	/* Valid check */
> +	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
> +		dev_err(&thermal->device,
> +			"Temperature sensor reading not valid\n");
> +		return -EIO;
> +	}
> +
> +	reg = readl_relaxed(priv->sensor);
> +	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
> +	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
> +	return 0;
> +}
> +
> +static struct thermal_zone_device_ops ops = {
> +	.get_temp = armada_get_temp,
> +};
> +
> +static const struct armada_thermal_ops armadaxp_ops = {
> +	.init_sensor = armadaxp_init_sensor,
> +};
> +
> +static const struct armada_thermal_ops armada370_ops = {
> +	.is_valid = armada_is_valid,
> +	.init_sensor = armada370_init_sensor,
> +};
> +
> +static const struct of_device_id armada_thermal_id_table[] = {
> +	{
> +		.compatible = "marvell,armadaxp-thermal",
> +		.data       = &armadaxp_ops,
> +	},
> +	{
> +		.compatible = "marvell,armada370-thermal",
> +		.data       = &armada370_ops,
> +	},
> +	{
> +		/* sentinel */
> +	},
> +};
> +MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
> +
> +static int armada_thermal_probe(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *thermal;
> +	const struct of_device_id *match;
> +	struct armada_thermal_priv *priv;
> +	struct resource *res;
> +
> +	match = of_match_device(armada_thermal_id_table, &pdev->dev);
> +	if (!match)
> +		return -ENODEV;
> +
> +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->sensor))
> +		return PTR_ERR(priv->sensor);
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->control = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->control))
> +		return PTR_ERR(priv->control);
> +
> +	priv->ops = (struct armada_thermal_ops *)match->data;
> +	priv->ops->init_sensor(priv);
> +
> +	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
> +					       priv, &ops, NULL, 0, 0);
> +	if (IS_ERR(thermal)) {
> +		dev_err(&pdev->dev,
> +			"Failed to register thermal zone device\n");
> +		return PTR_ERR(thermal);
> +	}
> +
> +	platform_set_drvdata(pdev, thermal);
> +
> +	return 0;
> +}
> +
> +static int armada_thermal_exit(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *armada_thermal =
> +		platform_get_drvdata(pdev);
> +
> +	thermal_zone_device_unregister(armada_thermal);
> +	platform_set_drvdata(pdev, NULL);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver armada_thermal_driver = {
> +	.probe = armada_thermal_probe,
> +	.remove = armada_thermal_exit,
> +	.driver = {
> +		.name = "armada_thermal",
> +		.owner = THIS_MODULE,
> +		.of_match_table = of_match_ptr(armada_thermal_id_table),
> +	},
> +};
> +
> +module_platform_driver(armada_thermal_driver);
> +
> +MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
> +MODULE_DESCRIPTION("Armada 370/XP thermal driver");
> +MODULE_LICENSE("GPL v2");



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-03-28  1:43     ` Zhang Rui
  0 siblings, 0 replies; 26+ messages in thread
From: Zhang Rui @ 2013-03-28  1:43 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> This driver supports both Armada 370 and Armada XP SoC
> thermal management controllers.
> 
> Armada 370 has a register to check a valid temperature, whereas
> Armada XP does not. Each has a different initialization (i.e. calibration)
> function. The temperature conversion formula is the same for both.
> 
> The controller present in each SoC have a very similar feature set,
> so it corresponds to have one driver to support both of them.
> 
> Although this driver may present similarities to Dove and Kirkwood
> thermal driver, the exact differences and coincidences are not fully
> known. For this reason, support is given through a separate driver.
> 
> Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> ---
> Changes from v1:
>  * Make armada_get_temp() more readable by reading the register
>    on a separate line, as requested by Durgadoss R.
> 
>  * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.
> 
>  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
>  drivers/thermal/Kconfig                            |    8 +
>  drivers/thermal/Makefile                           |    1 +
>  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
>  4 files changed, 267 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
>  create mode 100644 drivers/thermal/armada_thermal.c
> 
> diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> new file mode 100644
> index 0000000..fff93d5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> @@ -0,0 +1,22 @@
> +* Marvell Armada 370/XP thermal management
> +
> +Required properties:
> +
> +- compatible:	Should be set to one of the following:
> +		marvell,armada370-thermal
> +		marvell,armadaxp-thermal
> +
> +- reg:		Device's register space.
> +		Two entries are expected, see the examples below.
> +		The first one is required for the sensor register;
> +		the second one is required for the control register
> +		to be used for sensor initialization (a.k.a. calibration).
> +
> +Example:
> +
> +	thermal at d0018300 {
> +		compatible = "marvell,armada370-thermal";
> +                reg = <0xd0018300 0x4
> +		       0xd0018304 0x4>;
> +		status = "okay";
> +	};
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index a764f16..9eddf74 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -144,6 +144,14 @@ config DB8500_THERMAL
>  	  created. Cooling devices can be bound to the trip points to cool this
>  	  thermal zone if trip points reached.
>  
> +config ARMADA_THERMAL
> +	tristate "Armada 370/XP thermal management"
> +	depends on ARCH_MVEBU
> +	depends on OF
> +	help
> +	  Enable this option if you want to have support for thermal management
> +	  controller present in Armada 370 and Armada XP SoC.
> +
>  config DB8500_CPUFREQ_COOLING
>  	tristate "DB8500 cpufreq cooling"
>  	depends on ARCH_U8500
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index d3a2b38..7f6509a 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
>  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
>  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
>  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
>  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
>  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
>  
> diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> new file mode 100644
> index 0000000..6743ec2
> --- /dev/null
> +++ b/drivers/thermal/armada_thermal.c
> @@ -0,0 +1,236 @@
> +/*
> + * Marvell Armada 370/XP thermal sensor driver
> + *
> + * Copyright (C) 2013 Marvell
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/of.h>
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_device.h>
> +#include <linux/thermal.h>
> +
> +#define THERMAL_VALID_OFFSET		9
> +#define THERMAL_VALID_MASK		0x1
> +#define THERMAL_TEMP_OFFSET		10
> +#define THERMAL_TEMP_MASK		0x1ff
> +
> +/* Thermal Manager Control and Status Register */
> +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> +#define PMU_TM_DISABLE_OFFS		0
> +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> +
> +struct armada_thermal_ops;
> +
> +/* Marvell EBU Thermal Sensor Dev Structure */
> +struct armada_thermal_priv {
> +	void __iomem *sensor;
> +	void __iomem *control;
> +	struct armada_thermal_ops *ops;
> +};
> +
> +struct armada_thermal_ops {
> +	/* Initialize the sensor */
> +	void (*init_sensor)(struct armada_thermal_priv *);
> +
> +	/* Test for a valid sensor value (optional) */
> +	bool (*is_valid)(struct armada_thermal_priv *);
> +};
> +
> +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	/* ??? */

what does this comment mean?

> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* Reset the sensor */
> +	reg = readl_relaxed(priv->control);
> +	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
> +
> +	writel(reg, priv->control);
> +
> +	/* Enable the sensor */
> +	reg = readl_relaxed(priv->sensor);
> +	reg &= ~PMU_TM_DISABLE_MASK;
> +	writel(reg, priv->sensor);
> +}
> +
> +static void armada370_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	/* ??? */

ditto.

thanks,
rui
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* ??? */
> +	reg &= ~PMU_TDC0_START_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* FIXME: Why do we need this delay? */
> +	mdelay(10);
> +}
> +
> +static bool armada_is_valid(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg = readl_relaxed(priv->sensor);
> +
> +	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
> +}
> +
> +static int armada_get_temp(struct thermal_zone_device *thermal,
> +			  unsigned long *temp)
> +{
> +	struct armada_thermal_priv *priv = thermal->devdata;
> +	unsigned long reg;
> +
> +	/* Valid check */
> +	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
> +		dev_err(&thermal->device,
> +			"Temperature sensor reading not valid\n");
> +		return -EIO;
> +	}
> +
> +	reg = readl_relaxed(priv->sensor);
> +	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
> +	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
> +	return 0;
> +}
> +
> +static struct thermal_zone_device_ops ops = {
> +	.get_temp = armada_get_temp,
> +};
> +
> +static const struct armada_thermal_ops armadaxp_ops = {
> +	.init_sensor = armadaxp_init_sensor,
> +};
> +
> +static const struct armada_thermal_ops armada370_ops = {
> +	.is_valid = armada_is_valid,
> +	.init_sensor = armada370_init_sensor,
> +};
> +
> +static const struct of_device_id armada_thermal_id_table[] = {
> +	{
> +		.compatible = "marvell,armadaxp-thermal",
> +		.data       = &armadaxp_ops,
> +	},
> +	{
> +		.compatible = "marvell,armada370-thermal",
> +		.data       = &armada370_ops,
> +	},
> +	{
> +		/* sentinel */
> +	},
> +};
> +MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
> +
> +static int armada_thermal_probe(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *thermal;
> +	const struct of_device_id *match;
> +	struct armada_thermal_priv *priv;
> +	struct resource *res;
> +
> +	match = of_match_device(armada_thermal_id_table, &pdev->dev);
> +	if (!match)
> +		return -ENODEV;
> +
> +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->sensor))
> +		return PTR_ERR(priv->sensor);
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->control = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->control))
> +		return PTR_ERR(priv->control);
> +
> +	priv->ops = (struct armada_thermal_ops *)match->data;
> +	priv->ops->init_sensor(priv);
> +
> +	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
> +					       priv, &ops, NULL, 0, 0);
> +	if (IS_ERR(thermal)) {
> +		dev_err(&pdev->dev,
> +			"Failed to register thermal zone device\n");
> +		return PTR_ERR(thermal);
> +	}
> +
> +	platform_set_drvdata(pdev, thermal);
> +
> +	return 0;
> +}
> +
> +static int armada_thermal_exit(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *armada_thermal =
> +		platform_get_drvdata(pdev);
> +
> +	thermal_zone_device_unregister(armada_thermal);
> +	platform_set_drvdata(pdev, NULL);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver armada_thermal_driver = {
> +	.probe = armada_thermal_probe,
> +	.remove = armada_thermal_exit,
> +	.driver = {
> +		.name = "armada_thermal",
> +		.owner = THIS_MODULE,
> +		.of_match_table = of_match_ptr(armada_thermal_id_table),
> +	},
> +};
> +
> +module_platform_driver(armada_thermal_driver);
> +
> +MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
> +MODULE_DESCRIPTION("Armada 370/XP thermal driver");
> +MODULE_LICENSE("GPL v2");

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-03-28  1:43     ` Zhang Rui
@ 2013-03-28  3:43       ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-28  3:43 UTC (permalink / raw)
  To: Zhang Rui
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > This driver supports both Armada 370 and Armada XP SoC
> > thermal management controllers.
> > 
> > Armada 370 has a register to check a valid temperature, whereas
> > Armada XP does not. Each has a different initialization (i.e. calibration)
> > function. The temperature conversion formula is the same for both.
> > 
> > The controller present in each SoC have a very similar feature set,
> > so it corresponds to have one driver to support both of them.
> > 
> > Although this driver may present similarities to Dove and Kirkwood
> > thermal driver, the exact differences and coincidences are not fully
> > known. For this reason, support is given through a separate driver.
> > 
> > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> > ---
> > Changes from v1:
> >  * Make armada_get_temp() more readable by reading the register
> >    on a separate line, as requested by Durgadoss R.
> > 
> >  * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.
> > 
> >  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
> >  drivers/thermal/Kconfig                            |    8 +
> >  drivers/thermal/Makefile                           |    1 +
> >  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
> >  4 files changed, 267 insertions(+), 0 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
> >  create mode 100644 drivers/thermal/armada_thermal.c
> > 
> > diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> > new file mode 100644
> > index 0000000..fff93d5
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> > @@ -0,0 +1,22 @@
> > +* Marvell Armada 370/XP thermal management
> > +
> > +Required properties:
> > +
> > +- compatible:	Should be set to one of the following:
> > +		marvell,armada370-thermal
> > +		marvell,armadaxp-thermal
> > +
> > +- reg:		Device's register space.
> > +		Two entries are expected, see the examples below.
> > +		The first one is required for the sensor register;
> > +		the second one is required for the control register
> > +		to be used for sensor initialization (a.k.a. calibration).
> > +
> > +Example:
> > +
> > +	thermal@d0018300 {
> > +		compatible = "marvell,armada370-thermal";
> > +                reg = <0xd0018300 0x4
> > +		       0xd0018304 0x4>;
> > +		status = "okay";
> > +	};
> > diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> > index a764f16..9eddf74 100644
> > --- a/drivers/thermal/Kconfig
> > +++ b/drivers/thermal/Kconfig
> > @@ -144,6 +144,14 @@ config DB8500_THERMAL
> >  	  created. Cooling devices can be bound to the trip points to cool this
> >  	  thermal zone if trip points reached.
> >  
> > +config ARMADA_THERMAL
> > +	tristate "Armada 370/XP thermal management"
> > +	depends on ARCH_MVEBU
> > +	depends on OF
> > +	help
> > +	  Enable this option if you want to have support for thermal management
> > +	  controller present in Armada 370 and Armada XP SoC.
> > +
> >  config DB8500_CPUFREQ_COOLING
> >  	tristate "DB8500 cpufreq cooling"
> >  	depends on ARCH_U8500
> > diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> > index d3a2b38..7f6509a 100644
> > --- a/drivers/thermal/Makefile
> > +++ b/drivers/thermal/Makefile
> > @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
> >  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
> >  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
> >  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> > +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
> >  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
> >  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
> >  
> > diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> > new file mode 100644
> > index 0000000..6743ec2
> > --- /dev/null
> > +++ b/drivers/thermal/armada_thermal.c
> > @@ -0,0 +1,236 @@
> > +/*
> > + * Marvell Armada 370/XP thermal sensor driver
> > + *
> > + * Copyright (C) 2013 Marvell
> > + *
> > + * This software is licensed under the terms of the GNU General Public
> > + * License version 2, as published by the Free Software Foundation, and
> > + * may be copied, distributed, and modified under those terms.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +#include <linux/device.h>
> > +#include <linux/err.h>
> > +#include <linux/io.h>
> > +#include <linux/kernel.h>
> > +#include <linux/of.h>
> > +#include <linux/module.h>
> > +#include <linux/delay.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_device.h>
> > +#include <linux/thermal.h>
> > +
> > +#define THERMAL_VALID_OFFSET		9
> > +#define THERMAL_VALID_MASK		0x1
> > +#define THERMAL_TEMP_OFFSET		10
> > +#define THERMAL_TEMP_MASK		0x1ff
> > +
> > +/* Thermal Manager Control and Status Register */
> > +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> > +#define PMU_TM_DISABLE_OFFS		0
> > +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> > +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> > +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> > +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> > +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> > +
> > +struct armada_thermal_ops;
> > +
> > +/* Marvell EBU Thermal Sensor Dev Structure */
> > +struct armada_thermal_priv {
> > +	void __iomem *sensor;
> > +	void __iomem *control;
> > +	struct armada_thermal_ops *ops;
> > +};
> > +
> > +struct armada_thermal_ops {
> > +	/* Initialize the sensor */
> > +	void (*init_sensor)(struct armada_thermal_priv *);
> > +
> > +	/* Test for a valid sensor value (optional) */
> > +	bool (*is_valid)(struct armada_thermal_priv *);
> > +};
> > +
> > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > +{
> > +	unsigned long reg;
> > +
> > +	/* ??? */
> 
> what does this comment mean?
> 

It means I'm not sure entirely sure what the below code does.
Maybe I should remove it?

> > +	reg = readl_relaxed(priv->control);
> > +	reg |= PMU_TDC0_OTF_CAL_MASK;
> > +	writel(reg, priv->control);
> > +

Thanks for the review,
-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-03-28  3:43       ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-03-28  3:43 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > This driver supports both Armada 370 and Armada XP SoC
> > thermal management controllers.
> > 
> > Armada 370 has a register to check a valid temperature, whereas
> > Armada XP does not. Each has a different initialization (i.e. calibration)
> > function. The temperature conversion formula is the same for both.
> > 
> > The controller present in each SoC have a very similar feature set,
> > so it corresponds to have one driver to support both of them.
> > 
> > Although this driver may present similarities to Dove and Kirkwood
> > thermal driver, the exact differences and coincidences are not fully
> > known. For this reason, support is given through a separate driver.
> > 
> > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> > ---
> > Changes from v1:
> >  * Make armada_get_temp() more readable by reading the register
> >    on a separate line, as requested by Durgadoss R.
> > 
> >  * Reorder Kconfig and Makefile entries, as requested by Andrew Lunn.
> > 
> >  .../devicetree/bindings/thermal/armada-thermal.txt |   22 ++
> >  drivers/thermal/Kconfig                            |    8 +
> >  drivers/thermal/Makefile                           |    1 +
> >  drivers/thermal/armada_thermal.c                   |  236 ++++++++++++++++++++
> >  4 files changed, 267 insertions(+), 0 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/thermal/armada-thermal.txt
> >  create mode 100644 drivers/thermal/armada_thermal.c
> > 
> > diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> > new file mode 100644
> > index 0000000..fff93d5
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> > @@ -0,0 +1,22 @@
> > +* Marvell Armada 370/XP thermal management
> > +
> > +Required properties:
> > +
> > +- compatible:	Should be set to one of the following:
> > +		marvell,armada370-thermal
> > +		marvell,armadaxp-thermal
> > +
> > +- reg:		Device's register space.
> > +		Two entries are expected, see the examples below.
> > +		The first one is required for the sensor register;
> > +		the second one is required for the control register
> > +		to be used for sensor initialization (a.k.a. calibration).
> > +
> > +Example:
> > +
> > +	thermal at d0018300 {
> > +		compatible = "marvell,armada370-thermal";
> > +                reg = <0xd0018300 0x4
> > +		       0xd0018304 0x4>;
> > +		status = "okay";
> > +	};
> > diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> > index a764f16..9eddf74 100644
> > --- a/drivers/thermal/Kconfig
> > +++ b/drivers/thermal/Kconfig
> > @@ -144,6 +144,14 @@ config DB8500_THERMAL
> >  	  created. Cooling devices can be bound to the trip points to cool this
> >  	  thermal zone if trip points reached.
> >  
> > +config ARMADA_THERMAL
> > +	tristate "Armada 370/XP thermal management"
> > +	depends on ARCH_MVEBU
> > +	depends on OF
> > +	help
> > +	  Enable this option if you want to have support for thermal management
> > +	  controller present in Armada 370 and Armada XP SoC.
> > +
> >  config DB8500_CPUFREQ_COOLING
> >  	tristate "DB8500 cpufreq cooling"
> >  	depends on ARCH_U8500
> > diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> > index d3a2b38..7f6509a 100644
> > --- a/drivers/thermal/Makefile
> > +++ b/drivers/thermal/Makefile
> > @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
> >  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
> >  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
> >  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> > +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
> >  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
> >  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
> >  
> > diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> > new file mode 100644
> > index 0000000..6743ec2
> > --- /dev/null
> > +++ b/drivers/thermal/armada_thermal.c
> > @@ -0,0 +1,236 @@
> > +/*
> > + * Marvell Armada 370/XP thermal sensor driver
> > + *
> > + * Copyright (C) 2013 Marvell
> > + *
> > + * This software is licensed under the terms of the GNU General Public
> > + * License version 2, as published by the Free Software Foundation, and
> > + * may be copied, distributed, and modified under those terms.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +#include <linux/device.h>
> > +#include <linux/err.h>
> > +#include <linux/io.h>
> > +#include <linux/kernel.h>
> > +#include <linux/of.h>
> > +#include <linux/module.h>
> > +#include <linux/delay.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/of_device.h>
> > +#include <linux/thermal.h>
> > +
> > +#define THERMAL_VALID_OFFSET		9
> > +#define THERMAL_VALID_MASK		0x1
> > +#define THERMAL_TEMP_OFFSET		10
> > +#define THERMAL_TEMP_MASK		0x1ff
> > +
> > +/* Thermal Manager Control and Status Register */
> > +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> > +#define PMU_TM_DISABLE_OFFS		0
> > +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> > +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> > +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> > +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> > +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> > +
> > +struct armada_thermal_ops;
> > +
> > +/* Marvell EBU Thermal Sensor Dev Structure */
> > +struct armada_thermal_priv {
> > +	void __iomem *sensor;
> > +	void __iomem *control;
> > +	struct armada_thermal_ops *ops;
> > +};
> > +
> > +struct armada_thermal_ops {
> > +	/* Initialize the sensor */
> > +	void (*init_sensor)(struct armada_thermal_priv *);
> > +
> > +	/* Test for a valid sensor value (optional) */
> > +	bool (*is_valid)(struct armada_thermal_priv *);
> > +};
> > +
> > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > +{
> > +	unsigned long reg;
> > +
> > +	/* ??? */
> 
> what does this comment mean?
> 

It means I'm not sure entirely sure what the below code does.
Maybe I should remove it?

> > +	reg = readl_relaxed(priv->control);
> > +	reg |= PMU_TDC0_OTF_CAL_MASK;
> > +	writel(reg, priv->control);
> > +

Thanks for the review,
-- 
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
  2013-03-26 10:16 ` Ezequiel Garcia
@ 2013-03-31  0:47   ` Jason Cooper
  -1 siblings, 0 replies; 26+ messages in thread
From: Jason Cooper @ 2013-03-31  0:47 UTC (permalink / raw)
  To: Ezequiel Garcia
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Andrew Lunn,
	Nobuhiro Iwamatsu, Gregory Clement, Zhang Rui, Thomas Petazzoni,
	Sebastian Hesselbarth

On Tue, Mar 26, 2013 at 07:16:24AM -0300, Ezequiel Garcia wrote:
> After Andrew Lunn objected the single driver approach [1] that merged
> all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
> by step. For the time being we are adding support for Armada 370/XP only.
> Given both Armada 370 and Armada XP have a similar feature set, it
> makes sense to provide a single driver for them.
> 
> In the future we can unify this with the other drivers,
> if this proves to be worthwhile.
> 
> This driver has been influenced by the existing Kirkwood driver,
> also taking account of suggestions made by Jason Gunthorpe.
> 
> Testing has been done on the following boards:
> 
> For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
> For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP
> 
> This series is based in v3.9-rc2. To make testing easier this patchset
> can be found on a github branch [2].
> 
> Changes from v1:
>   * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
>   * Make armada_get_temp() more readable, as requested by Durgadoss R.
> 
> Any feedback or comments are welcome!
> 
> [1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
> [2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2
> 
> Ezequiel Garcia (4):
...
>   ARM: mvebu: Add thermal support to Armada XP device tree
>   ARM: mvebu: Add thermal support to Armada 370 device tree
>   ARM: configs: Update mvebu defconfig for thermal
...
>  arch/arm/boot/dts/armada-370.dtsi                  |    6 +
>  arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
>  arch/arm/configs/mvebu_defconfig                   |    2 +

Patches 2 through 4 applied to mvebu/dt

thx,

Jason.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support
@ 2013-03-31  0:47   ` Jason Cooper
  0 siblings, 0 replies; 26+ messages in thread
From: Jason Cooper @ 2013-03-31  0:47 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Mar 26, 2013 at 07:16:24AM -0300, Ezequiel Garcia wrote:
> After Andrew Lunn objected the single driver approach [1] that merged
> all the Marvell EBU SoC thermal drivers, we have agreed to proceed step
> by step. For the time being we are adding support for Armada 370/XP only.
> Given both Armada 370 and Armada XP have a similar feature set, it
> makes sense to provide a single driver for them.
> 
> In the future we can unify this with the other drivers,
> if this proves to be worthwhile.
> 
> This driver has been influenced by the existing Kirkwood driver,
> also taking account of suggestions made by Jason Gunthorpe.
> 
> Testing has been done on the following boards:
> 
> For Armada 370: Globalscale Mirabox and Marvell Armada 370 RD
> For Armada XP:  Plat'home Openblocks AX3 and Marvell Armada XP DB-MV784MP-GP
> 
> This series is based in v3.9-rc2. To make testing easier this patchset
> can be found on a github branch [2].
> 
> Changes from v1:
>   * Reorder Kconfig and Makefiles entries as requested by Andrew Lunn.
>   * Make armada_get_temp() more readable, as requested by Durgadoss R.
> 
> Any feedback or comments are welcome!
> 
> [1] http://permalink.gmane.org/gmane.linux.power-management.general/32123
> [2] https://github.com/MISL-EBU-System-SW/mainline-public/tree/armada-thermal-v2
> 
> Ezequiel Garcia (4):
...
>   ARM: mvebu: Add thermal support to Armada XP device tree
>   ARM: mvebu: Add thermal support to Armada 370 device tree
>   ARM: configs: Update mvebu defconfig for thermal
...
>  arch/arm/boot/dts/armada-370.dtsi                  |    6 +
>  arch/arm/boot/dts/armada-xp.dtsi                   |    6 +
>  arch/arm/configs/mvebu_defconfig                   |    2 +

Patches 2 through 4 applied to mvebu/dt

thx,

Jason.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-03-28  1:43     ` Zhang Rui
@ 2013-04-02  1:37       ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-02  1:37 UTC (permalink / raw)
  To: Zhang Rui
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

Hi Zhang,

On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > This driver supports both Armada 370 and Armada XP SoC
> > thermal management controllers.
> > 
> > Armada 370 has a register to check a valid temperature, whereas
> > Armada XP does not. Each has a different initialization (i.e. calibration)
> > function. The temperature conversion formula is the same for both.
> > 
> > The controller present in each SoC have a very similar feature set,
> > so it corresponds to have one driver to support both of them.
> > 
> > Although this driver may present similarities to Dove and Kirkwood
> > thermal driver, the exact differences and coincidences are not fully
> > known. For this reason, support is given through a separate driver.
> > 
> > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> > ---

[...]

> > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > +{
> > +	unsigned long reg;
> > +
> > +	/* ??? */
> 
> what does this comment mean?
> 

In the case you'd prefer those comments to be removed,
here's a patch that does just that.

Is it possible for you to take it instead of the previous one,
in this form?

------------------------------------8<----------------------------------------
diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
new file mode 100644
index 0000000..fff93d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
@@ -0,0 +1,22 @@
+* Marvell Armada 370/XP thermal management
+
+Required properties:
+
+- compatible:	Should be set to one of the following:
+		marvell,armada370-thermal
+		marvell,armadaxp-thermal
+
+- reg:		Device's register space.
+		Two entries are expected, see the examples below.
+		The first one is required for the sensor register;
+		the second one is required for the control register
+		to be used for sensor initialization (a.k.a. calibration).
+
+Example:
+
+	thermal@d0018300 {
+		compatible = "marvell,armada370-thermal";
+                reg = <0xd0018300 0x4
+		       0xd0018304 0x4>;
+		status = "okay";
+	};
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index a764f16..9eddf74 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -144,6 +144,14 @@ config DB8500_THERMAL
 	  created. Cooling devices can be bound to the trip points to cool this
 	  thermal zone if trip points reached.
 
+config ARMADA_THERMAL
+	tristate "Armada 370/XP thermal management"
+	depends on ARCH_MVEBU
+	depends on OF
+	help
+	  Enable this option if you want to have support for thermal management
+	  controller present in Armada 370 and Armada XP SoC.
+
 config DB8500_CPUFREQ_COOLING
 	tristate "DB8500 cpufreq cooling"
 	depends on ARCH_U8500
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index d3a2b38..7f6509a 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
 obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
 obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
 obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
+obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
 obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
 obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
 
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
new file mode 100644
index 0000000..5b4d75f
--- /dev/null
+++ b/drivers/thermal/armada_thermal.c
@@ -0,0 +1,232 @@
+/*
+ * Marvell Armada 370/XP thermal sensor driver
+ *
+ * Copyright (C) 2013 Marvell
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/thermal.h>
+
+#define THERMAL_VALID_OFFSET		9
+#define THERMAL_VALID_MASK		0x1
+#define THERMAL_TEMP_OFFSET		10
+#define THERMAL_TEMP_MASK		0x1ff
+
+/* Thermal Manager Control and Status Register */
+#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
+#define PMU_TM_DISABLE_OFFS		0
+#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
+#define PMU_TDC0_REF_CAL_CNT_OFFS	11
+#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
+#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
+#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
+
+struct armada_thermal_ops;
+
+/* Marvell EBU Thermal Sensor Dev Structure */
+struct armada_thermal_priv {
+	void __iomem *sensor;
+	void __iomem *control;
+	struct armada_thermal_ops *ops;
+};
+
+struct armada_thermal_ops {
+	/* Initialize the sensor */
+	void (*init_sensor)(struct armada_thermal_priv *);
+
+	/* Test for a valid sensor value (optional) */
+	bool (*is_valid)(struct armada_thermal_priv *);
+};
+
+static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* Reset the sensor */
+	reg = readl_relaxed(priv->control);
+	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
+
+	writel(reg, priv->control);
+
+	/* Enable the sensor */
+	reg = readl_relaxed(priv->sensor);
+	reg &= ~PMU_TM_DISABLE_MASK;
+	writel(reg, priv->sensor);
+}
+
+static void armada370_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	reg &= ~PMU_TDC0_START_CAL_MASK;
+	writel(reg, priv->control);
+
+	mdelay(10);
+}
+
+static bool armada_is_valid(struct armada_thermal_priv *priv)
+{
+	unsigned long reg = readl_relaxed(priv->sensor);
+
+	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
+}
+
+static int armada_get_temp(struct thermal_zone_device *thermal,
+			  unsigned long *temp)
+{
+	struct armada_thermal_priv *priv = thermal->devdata;
+	unsigned long reg;
+
+	/* Valid check */
+	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
+		dev_err(&thermal->device,
+			"Temperature sensor reading not valid\n");
+		return -EIO;
+	}
+
+	reg = readl_relaxed(priv->sensor);
+	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
+	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
+	return 0;
+}
+
+static struct thermal_zone_device_ops ops = {
+	.get_temp = armada_get_temp,
+};
+
+static const struct armada_thermal_ops armadaxp_ops = {
+	.init_sensor = armadaxp_init_sensor,
+};
+
+static const struct armada_thermal_ops armada370_ops = {
+	.is_valid = armada_is_valid,
+	.init_sensor = armada370_init_sensor,
+};
+
+static const struct of_device_id armada_thermal_id_table[] = {
+	{
+		.compatible = "marvell,armadaxp-thermal",
+		.data       = &armadaxp_ops,
+	},
+	{
+		.compatible = "marvell,armada370-thermal",
+		.data       = &armada370_ops,
+	},
+	{
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
+
+static int armada_thermal_probe(struct platform_device *pdev)
+{
+	struct thermal_zone_device *thermal;
+	const struct of_device_id *match;
+	struct armada_thermal_priv *priv;
+	struct resource *res;
+
+	match = of_match_device(armada_thermal_id_table, &pdev->dev);
+	if (!match)
+		return -ENODEV;
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->sensor))
+		return PTR_ERR(priv->sensor);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->control = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->control))
+		return PTR_ERR(priv->control);
+
+	priv->ops = (struct armada_thermal_ops *)match->data;
+	priv->ops->init_sensor(priv);
+
+	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
+					       priv, &ops, NULL, 0, 0);
+	if (IS_ERR(thermal)) {
+		dev_err(&pdev->dev,
+			"Failed to register thermal zone device\n");
+		return PTR_ERR(thermal);
+	}
+
+	platform_set_drvdata(pdev, thermal);
+
+	return 0;
+}
+
+static int armada_thermal_exit(struct platform_device *pdev)
+{
+	struct thermal_zone_device *armada_thermal =
+		platform_get_drvdata(pdev);
+
+	thermal_zone_device_unregister(armada_thermal);
+	platform_set_drvdata(pdev, NULL);
+
+	return 0;
+}
+
+static struct platform_driver armada_thermal_driver = {
+	.probe = armada_thermal_probe,
+	.remove = armada_thermal_exit,
+	.driver = {
+		.name = "armada_thermal",
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(armada_thermal_id_table),
+	},
+};
+
+module_platform_driver(armada_thermal_driver);
+
+MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
+MODULE_DESCRIPTION("Armada 370/XP thermal driver");
+MODULE_LICENSE("GPL v2");
------------------------------------>8----------------------------------------

-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-04-02  1:37       ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-02  1:37 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Zhang,

On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > This driver supports both Armada 370 and Armada XP SoC
> > thermal management controllers.
> > 
> > Armada 370 has a register to check a valid temperature, whereas
> > Armada XP does not. Each has a different initialization (i.e. calibration)
> > function. The temperature conversion formula is the same for both.
> > 
> > The controller present in each SoC have a very similar feature set,
> > so it corresponds to have one driver to support both of them.
> > 
> > Although this driver may present similarities to Dove and Kirkwood
> > thermal driver, the exact differences and coincidences are not fully
> > known. For this reason, support is given through a separate driver.
> > 
> > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> > ---

[...]

> > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > +{
> > +	unsigned long reg;
> > +
> > +	/* ??? */
> 
> what does this comment mean?
> 

In the case you'd prefer those comments to be removed,
here's a patch that does just that.

Is it possible for you to take it instead of the previous one,
in this form?

------------------------------------8<----------------------------------------
diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
new file mode 100644
index 0000000..fff93d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
@@ -0,0 +1,22 @@
+* Marvell Armada 370/XP thermal management
+
+Required properties:
+
+- compatible:	Should be set to one of the following:
+		marvell,armada370-thermal
+		marvell,armadaxp-thermal
+
+- reg:		Device's register space.
+		Two entries are expected, see the examples below.
+		The first one is required for the sensor register;
+		the second one is required for the control register
+		to be used for sensor initialization (a.k.a. calibration).
+
+Example:
+
+	thermal@d0018300 {
+		compatible = "marvell,armada370-thermal";
+                reg = <0xd0018300 0x4
+		       0xd0018304 0x4>;
+		status = "okay";
+	};
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index a764f16..9eddf74 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -144,6 +144,14 @@ config DB8500_THERMAL
 	  created. Cooling devices can be bound to the trip points to cool this
 	  thermal zone if trip points reached.
 
+config ARMADA_THERMAL
+	tristate "Armada 370/XP thermal management"
+	depends on ARCH_MVEBU
+	depends on OF
+	help
+	  Enable this option if you want to have support for thermal management
+	  controller present in Armada 370 and Armada XP SoC.
+
 config DB8500_CPUFREQ_COOLING
 	tristate "DB8500 cpufreq cooling"
 	depends on ARCH_U8500
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
index d3a2b38..7f6509a 100644
--- a/drivers/thermal/Makefile
+++ b/drivers/thermal/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
 obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
 obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
 obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
+obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
 obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
 obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
 
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
new file mode 100644
index 0000000..5b4d75f
--- /dev/null
+++ b/drivers/thermal/armada_thermal.c
@@ -0,0 +1,232 @@
+/*
+ * Marvell Armada 370/XP thermal sensor driver
+ *
+ * Copyright (C) 2013 Marvell
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/of_device.h>
+#include <linux/thermal.h>
+
+#define THERMAL_VALID_OFFSET		9
+#define THERMAL_VALID_MASK		0x1
+#define THERMAL_TEMP_OFFSET		10
+#define THERMAL_TEMP_MASK		0x1ff
+
+/* Thermal Manager Control and Status Register */
+#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
+#define PMU_TM_DISABLE_OFFS		0
+#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
+#define PMU_TDC0_REF_CAL_CNT_OFFS	11
+#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
+#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
+#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
+
+struct armada_thermal_ops;
+
+/* Marvell EBU Thermal Sensor Dev Structure */
+struct armada_thermal_priv {
+	void __iomem *sensor;
+	void __iomem *control;
+	struct armada_thermal_ops *ops;
+};
+
+struct armada_thermal_ops {
+	/* Initialize the sensor */
+	void (*init_sensor)(struct armada_thermal_priv *);
+
+	/* Test for a valid sensor value (optional) */
+	bool (*is_valid)(struct armada_thermal_priv *);
+};
+
+static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	/* Reset the sensor */
+	reg = readl_relaxed(priv->control);
+	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
+
+	writel(reg, priv->control);
+
+	/* Enable the sensor */
+	reg = readl_relaxed(priv->sensor);
+	reg &= ~PMU_TM_DISABLE_MASK;
+	writel(reg, priv->sensor);
+}
+
+static void armada370_init_sensor(struct armada_thermal_priv *priv)
+{
+	unsigned long reg;
+
+	reg = readl_relaxed(priv->control);
+	reg |= PMU_TDC0_OTF_CAL_MASK;
+	writel(reg, priv->control);
+
+	/* Reference calibration value */
+	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
+	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
+	writel(reg, priv->control);
+
+	reg &= ~PMU_TDC0_START_CAL_MASK;
+	writel(reg, priv->control);
+
+	mdelay(10);
+}
+
+static bool armada_is_valid(struct armada_thermal_priv *priv)
+{
+	unsigned long reg = readl_relaxed(priv->sensor);
+
+	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
+}
+
+static int armada_get_temp(struct thermal_zone_device *thermal,
+			  unsigned long *temp)
+{
+	struct armada_thermal_priv *priv = thermal->devdata;
+	unsigned long reg;
+
+	/* Valid check */
+	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
+		dev_err(&thermal->device,
+			"Temperature sensor reading not valid\n");
+		return -EIO;
+	}
+
+	reg = readl_relaxed(priv->sensor);
+	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
+	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
+	return 0;
+}
+
+static struct thermal_zone_device_ops ops = {
+	.get_temp = armada_get_temp,
+};
+
+static const struct armada_thermal_ops armadaxp_ops = {
+	.init_sensor = armadaxp_init_sensor,
+};
+
+static const struct armada_thermal_ops armada370_ops = {
+	.is_valid = armada_is_valid,
+	.init_sensor = armada370_init_sensor,
+};
+
+static const struct of_device_id armada_thermal_id_table[] = {
+	{
+		.compatible = "marvell,armadaxp-thermal",
+		.data       = &armadaxp_ops,
+	},
+	{
+		.compatible = "marvell,armada370-thermal",
+		.data       = &armada370_ops,
+	},
+	{
+		/* sentinel */
+	},
+};
+MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
+
+static int armada_thermal_probe(struct platform_device *pdev)
+{
+	struct thermal_zone_device *thermal;
+	const struct of_device_id *match;
+	struct armada_thermal_priv *priv;
+	struct resource *res;
+
+	match = of_match_device(armada_thermal_id_table, &pdev->dev);
+	if (!match)
+		return -ENODEV;
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->sensor))
+		return PTR_ERR(priv->sensor);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (!res) {
+		dev_err(&pdev->dev, "Failed to get platform resource\n");
+		return -ENODEV;
+	}
+
+	priv->control = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(priv->control))
+		return PTR_ERR(priv->control);
+
+	priv->ops = (struct armada_thermal_ops *)match->data;
+	priv->ops->init_sensor(priv);
+
+	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
+					       priv, &ops, NULL, 0, 0);
+	if (IS_ERR(thermal)) {
+		dev_err(&pdev->dev,
+			"Failed to register thermal zone device\n");
+		return PTR_ERR(thermal);
+	}
+
+	platform_set_drvdata(pdev, thermal);
+
+	return 0;
+}
+
+static int armada_thermal_exit(struct platform_device *pdev)
+{
+	struct thermal_zone_device *armada_thermal =
+		platform_get_drvdata(pdev);
+
+	thermal_zone_device_unregister(armada_thermal);
+	platform_set_drvdata(pdev, NULL);
+
+	return 0;
+}
+
+static struct platform_driver armada_thermal_driver = {
+	.probe = armada_thermal_probe,
+	.remove = armada_thermal_exit,
+	.driver = {
+		.name = "armada_thermal",
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(armada_thermal_id_table),
+	},
+};
+
+module_platform_driver(armada_thermal_driver);
+
+MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
+MODULE_DESCRIPTION("Armada 370/XP thermal driver");
+MODULE_LICENSE("GPL v2");
------------------------------------>8----------------------------------------

-- 
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply related	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-04-02  1:37       ` Ezequiel Garcia
@ 2013-04-02 13:05         ` Zhang Rui
  -1 siblings, 0 replies; 26+ messages in thread
From: Zhang Rui @ 2013-04-02 13:05 UTC (permalink / raw)
  To: Ezequiel Garcia
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> Hi Zhang,
> 
> On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > This driver supports both Armada 370 and Armada XP SoC
> > > thermal management controllers.
> > > 
> > > Armada 370 has a register to check a valid temperature, whereas
> > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > function. The temperature conversion formula is the same for both.
> > > 
> > > The controller present in each SoC have a very similar feature set,
> > > so it corresponds to have one driver to support both of them.
> > > 
> > > Although this driver may present similarities to Dove and Kirkwood
> > > thermal driver, the exact differences and coincidences are not fully
> > > known. For this reason, support is given through a separate driver.
> > > 
> > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>

patch applied.

thanks,
rui
> > > ---
> 
> [...]
> 
> > > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > > +{
> > > +	unsigned long reg;
> > > +
> > > +	/* ??? */
> > 
> > what does this comment mean?
> > 
> 
> In the case you'd prefer those comments to be removed,
> here's a patch that does just that.
> 
> Is it possible for you to take it instead of the previous one,
> in this form?
> 
> ------------------------------------8<----------------------------------------
> diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> new file mode 100644
> index 0000000..fff93d5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> @@ -0,0 +1,22 @@
> +* Marvell Armada 370/XP thermal management
> +
> +Required properties:
> +
> +- compatible:	Should be set to one of the following:
> +		marvell,armada370-thermal
> +		marvell,armadaxp-thermal
> +
> +- reg:		Device's register space.
> +		Two entries are expected, see the examples below.
> +		The first one is required for the sensor register;
> +		the second one is required for the control register
> +		to be used for sensor initialization (a.k.a. calibration).
> +
> +Example:
> +
> +	thermal@d0018300 {
> +		compatible = "marvell,armada370-thermal";
> +                reg = <0xd0018300 0x4
> +		       0xd0018304 0x4>;
> +		status = "okay";
> +	};
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index a764f16..9eddf74 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -144,6 +144,14 @@ config DB8500_THERMAL
>  	  created. Cooling devices can be bound to the trip points to cool this
>  	  thermal zone if trip points reached.
>  
> +config ARMADA_THERMAL
> +	tristate "Armada 370/XP thermal management"
> +	depends on ARCH_MVEBU
> +	depends on OF
> +	help
> +	  Enable this option if you want to have support for thermal management
> +	  controller present in Armada 370 and Armada XP SoC.
> +
>  config DB8500_CPUFREQ_COOLING
>  	tristate "DB8500 cpufreq cooling"
>  	depends on ARCH_U8500
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index d3a2b38..7f6509a 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
>  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
>  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
>  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
>  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
>  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
>  
> diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> new file mode 100644
> index 0000000..5b4d75f
> --- /dev/null
> +++ b/drivers/thermal/armada_thermal.c
> @@ -0,0 +1,232 @@
> +/*
> + * Marvell Armada 370/XP thermal sensor driver
> + *
> + * Copyright (C) 2013 Marvell
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/of.h>
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_device.h>
> +#include <linux/thermal.h>
> +
> +#define THERMAL_VALID_OFFSET		9
> +#define THERMAL_VALID_MASK		0x1
> +#define THERMAL_TEMP_OFFSET		10
> +#define THERMAL_TEMP_MASK		0x1ff
> +
> +/* Thermal Manager Control and Status Register */
> +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> +#define PMU_TM_DISABLE_OFFS		0
> +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> +
> +struct armada_thermal_ops;
> +
> +/* Marvell EBU Thermal Sensor Dev Structure */
> +struct armada_thermal_priv {
> +	void __iomem *sensor;
> +	void __iomem *control;
> +	struct armada_thermal_ops *ops;
> +};
> +
> +struct armada_thermal_ops {
> +	/* Initialize the sensor */
> +	void (*init_sensor)(struct armada_thermal_priv *);
> +
> +	/* Test for a valid sensor value (optional) */
> +	bool (*is_valid)(struct armada_thermal_priv *);
> +};
> +
> +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* Reset the sensor */
> +	reg = readl_relaxed(priv->control);
> +	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
> +
> +	writel(reg, priv->control);
> +
> +	/* Enable the sensor */
> +	reg = readl_relaxed(priv->sensor);
> +	reg &= ~PMU_TM_DISABLE_MASK;
> +	writel(reg, priv->sensor);
> +}
> +
> +static void armada370_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	reg &= ~PMU_TDC0_START_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	mdelay(10);
> +}
> +
> +static bool armada_is_valid(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg = readl_relaxed(priv->sensor);
> +
> +	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
> +}
> +
> +static int armada_get_temp(struct thermal_zone_device *thermal,
> +			  unsigned long *temp)
> +{
> +	struct armada_thermal_priv *priv = thermal->devdata;
> +	unsigned long reg;
> +
> +	/* Valid check */
> +	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
> +		dev_err(&thermal->device,
> +			"Temperature sensor reading not valid\n");
> +		return -EIO;
> +	}
> +
> +	reg = readl_relaxed(priv->sensor);
> +	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
> +	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
> +	return 0;
> +}
> +
> +static struct thermal_zone_device_ops ops = {
> +	.get_temp = armada_get_temp,
> +};
> +
> +static const struct armada_thermal_ops armadaxp_ops = {
> +	.init_sensor = armadaxp_init_sensor,
> +};
> +
> +static const struct armada_thermal_ops armada370_ops = {
> +	.is_valid = armada_is_valid,
> +	.init_sensor = armada370_init_sensor,
> +};
> +
> +static const struct of_device_id armada_thermal_id_table[] = {
> +	{
> +		.compatible = "marvell,armadaxp-thermal",
> +		.data       = &armadaxp_ops,
> +	},
> +	{
> +		.compatible = "marvell,armada370-thermal",
> +		.data       = &armada370_ops,
> +	},
> +	{
> +		/* sentinel */
> +	},
> +};
> +MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
> +
> +static int armada_thermal_probe(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *thermal;
> +	const struct of_device_id *match;
> +	struct armada_thermal_priv *priv;
> +	struct resource *res;
> +
> +	match = of_match_device(armada_thermal_id_table, &pdev->dev);
> +	if (!match)
> +		return -ENODEV;
> +
> +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->sensor))
> +		return PTR_ERR(priv->sensor);
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->control = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->control))
> +		return PTR_ERR(priv->control);
> +
> +	priv->ops = (struct armada_thermal_ops *)match->data;
> +	priv->ops->init_sensor(priv);
> +
> +	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
> +					       priv, &ops, NULL, 0, 0);
> +	if (IS_ERR(thermal)) {
> +		dev_err(&pdev->dev,
> +			"Failed to register thermal zone device\n");
> +		return PTR_ERR(thermal);
> +	}
> +
> +	platform_set_drvdata(pdev, thermal);
> +
> +	return 0;
> +}
> +
> +static int armada_thermal_exit(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *armada_thermal =
> +		platform_get_drvdata(pdev);
> +
> +	thermal_zone_device_unregister(armada_thermal);
> +	platform_set_drvdata(pdev, NULL);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver armada_thermal_driver = {
> +	.probe = armada_thermal_probe,
> +	.remove = armada_thermal_exit,
> +	.driver = {
> +		.name = "armada_thermal",
> +		.owner = THIS_MODULE,
> +		.of_match_table = of_match_ptr(armada_thermal_id_table),
> +	},
> +};
> +
> +module_platform_driver(armada_thermal_driver);
> +
> +MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
> +MODULE_DESCRIPTION("Armada 370/XP thermal driver");
> +MODULE_LICENSE("GPL v2");
> ------------------------------------>8----------------------------------------
> 



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-04-02 13:05         ` Zhang Rui
  0 siblings, 0 replies; 26+ messages in thread
From: Zhang Rui @ 2013-04-02 13:05 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> Hi Zhang,
> 
> On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > This driver supports both Armada 370 and Armada XP SoC
> > > thermal management controllers.
> > > 
> > > Armada 370 has a register to check a valid temperature, whereas
> > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > function. The temperature conversion formula is the same for both.
> > > 
> > > The controller present in each SoC have a very similar feature set,
> > > so it corresponds to have one driver to support both of them.
> > > 
> > > Although this driver may present similarities to Dove and Kirkwood
> > > thermal driver, the exact differences and coincidences are not fully
> > > known. For this reason, support is given through a separate driver.
> > > 
> > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>

patch applied.

thanks,
rui
> > > ---
> 
> [...]
> 
> > > +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> > > +{
> > > +	unsigned long reg;
> > > +
> > > +	/* ??? */
> > 
> > what does this comment mean?
> > 
> 
> In the case you'd prefer those comments to be removed,
> here's a patch that does just that.
> 
> Is it possible for you to take it instead of the previous one,
> in this form?
> 
> ------------------------------------8<----------------------------------------
> diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> new file mode 100644
> index 0000000..fff93d5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt
> @@ -0,0 +1,22 @@
> +* Marvell Armada 370/XP thermal management
> +
> +Required properties:
> +
> +- compatible:	Should be set to one of the following:
> +		marvell,armada370-thermal
> +		marvell,armadaxp-thermal
> +
> +- reg:		Device's register space.
> +		Two entries are expected, see the examples below.
> +		The first one is required for the sensor register;
> +		the second one is required for the control register
> +		to be used for sensor initialization (a.k.a. calibration).
> +
> +Example:
> +
> +	thermal at d0018300 {
> +		compatible = "marvell,armada370-thermal";
> +                reg = <0xd0018300 0x4
> +		       0xd0018304 0x4>;
> +		status = "okay";
> +	};
> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
> index a764f16..9eddf74 100644
> --- a/drivers/thermal/Kconfig
> +++ b/drivers/thermal/Kconfig
> @@ -144,6 +144,14 @@ config DB8500_THERMAL
>  	  created. Cooling devices can be bound to the trip points to cool this
>  	  thermal zone if trip points reached.
>  
> +config ARMADA_THERMAL
> +	tristate "Armada 370/XP thermal management"
> +	depends on ARCH_MVEBU
> +	depends on OF
> +	help
> +	  Enable this option if you want to have support for thermal management
> +	  controller present in Armada 370 and Armada XP SoC.
> +
>  config DB8500_CPUFREQ_COOLING
>  	tristate "DB8500 cpufreq cooling"
>  	depends on ARCH_U8500
> diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile
> index d3a2b38..7f6509a 100644
> --- a/drivers/thermal/Makefile
> +++ b/drivers/thermal/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_KIRKWOOD_THERMAL)  += kirkwood_thermal.o
>  obj-$(CONFIG_EXYNOS_THERMAL)	+= exynos_thermal.o
>  obj-$(CONFIG_DOVE_THERMAL)  	+= dove_thermal.o
>  obj-$(CONFIG_DB8500_THERMAL)	+= db8500_thermal.o
> +obj-$(CONFIG_ARMADA_THERMAL)	+= armada_thermal.o
>  obj-$(CONFIG_DB8500_CPUFREQ_COOLING)	+= db8500_cpufreq_cooling.o
>  obj-$(CONFIG_INTEL_POWERCLAMP)	+= intel_powerclamp.o
>  
> diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
> new file mode 100644
> index 0000000..5b4d75f
> --- /dev/null
> +++ b/drivers/thermal/armada_thermal.c
> @@ -0,0 +1,232 @@
> +/*
> + * Marvell Armada 370/XP thermal sensor driver
> + *
> + * Copyright (C) 2013 Marvell
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/of.h>
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/of_device.h>
> +#include <linux/thermal.h>
> +
> +#define THERMAL_VALID_OFFSET		9
> +#define THERMAL_VALID_MASK		0x1
> +#define THERMAL_TEMP_OFFSET		10
> +#define THERMAL_TEMP_MASK		0x1ff
> +
> +/* Thermal Manager Control and Status Register */
> +#define PMU_TDC0_SW_RST_MASK		(0x1 << 1)
> +#define PMU_TM_DISABLE_OFFS		0
> +#define PMU_TM_DISABLE_MASK		(0x1 << PMU_TM_DISABLE_OFFS)
> +#define PMU_TDC0_REF_CAL_CNT_OFFS	11
> +#define PMU_TDC0_REF_CAL_CNT_MASK	(0x1ff << PMU_TDC0_REF_CAL_CNT_OFFS)
> +#define PMU_TDC0_OTF_CAL_MASK		(0x1 << 30)
> +#define PMU_TDC0_START_CAL_MASK		(0x1 << 25)
> +
> +struct armada_thermal_ops;
> +
> +/* Marvell EBU Thermal Sensor Dev Structure */
> +struct armada_thermal_priv {
> +	void __iomem *sensor;
> +	void __iomem *control;
> +	struct armada_thermal_ops *ops;
> +};
> +
> +struct armada_thermal_ops {
> +	/* Initialize the sensor */
> +	void (*init_sensor)(struct armada_thermal_priv *);
> +
> +	/* Test for a valid sensor value (optional) */
> +	bool (*is_valid)(struct armada_thermal_priv *);
> +};
> +
> +static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	/* Reset the sensor */
> +	reg = readl_relaxed(priv->control);
> +	writel((reg | PMU_TDC0_SW_RST_MASK), priv->control);
> +
> +	writel(reg, priv->control);
> +
> +	/* Enable the sensor */
> +	reg = readl_relaxed(priv->sensor);
> +	reg &= ~PMU_TM_DISABLE_MASK;
> +	writel(reg, priv->sensor);
> +}
> +
> +static void armada370_init_sensor(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg;
> +
> +	reg = readl_relaxed(priv->control);
> +	reg |= PMU_TDC0_OTF_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	/* Reference calibration value */
> +	reg &= ~PMU_TDC0_REF_CAL_CNT_MASK;
> +	reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS);
> +	writel(reg, priv->control);
> +
> +	reg &= ~PMU_TDC0_START_CAL_MASK;
> +	writel(reg, priv->control);
> +
> +	mdelay(10);
> +}
> +
> +static bool armada_is_valid(struct armada_thermal_priv *priv)
> +{
> +	unsigned long reg = readl_relaxed(priv->sensor);
> +
> +	return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
> +}
> +
> +static int armada_get_temp(struct thermal_zone_device *thermal,
> +			  unsigned long *temp)
> +{
> +	struct armada_thermal_priv *priv = thermal->devdata;
> +	unsigned long reg;
> +
> +	/* Valid check */
> +	if (priv->ops->is_valid && !priv->ops->is_valid(priv)) {
> +		dev_err(&thermal->device,
> +			"Temperature sensor reading not valid\n");
> +		return -EIO;
> +	}
> +
> +	reg = readl_relaxed(priv->sensor);
> +	reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
> +	*temp = (3153000000UL - (10000000UL*reg)) / 13825;
> +	return 0;
> +}
> +
> +static struct thermal_zone_device_ops ops = {
> +	.get_temp = armada_get_temp,
> +};
> +
> +static const struct armada_thermal_ops armadaxp_ops = {
> +	.init_sensor = armadaxp_init_sensor,
> +};
> +
> +static const struct armada_thermal_ops armada370_ops = {
> +	.is_valid = armada_is_valid,
> +	.init_sensor = armada370_init_sensor,
> +};
> +
> +static const struct of_device_id armada_thermal_id_table[] = {
> +	{
> +		.compatible = "marvell,armadaxp-thermal",
> +		.data       = &armadaxp_ops,
> +	},
> +	{
> +		.compatible = "marvell,armada370-thermal",
> +		.data       = &armada370_ops,
> +	},
> +	{
> +		/* sentinel */
> +	},
> +};
> +MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
> +
> +static int armada_thermal_probe(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *thermal;
> +	const struct of_device_id *match;
> +	struct armada_thermal_priv *priv;
> +	struct resource *res;
> +
> +	match = of_match_device(armada_thermal_id_table, &pdev->dev);
> +	if (!match)
> +		return -ENODEV;
> +
> +	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->sensor = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->sensor))
> +		return PTR_ERR(priv->sensor);
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +	if (!res) {
> +		dev_err(&pdev->dev, "Failed to get platform resource\n");
> +		return -ENODEV;
> +	}
> +
> +	priv->control = devm_ioremap_resource(&pdev->dev, res);
> +	if (IS_ERR(priv->control))
> +		return PTR_ERR(priv->control);
> +
> +	priv->ops = (struct armada_thermal_ops *)match->data;
> +	priv->ops->init_sensor(priv);
> +
> +	thermal = thermal_zone_device_register("armada_thermal", 0, 0,
> +					       priv, &ops, NULL, 0, 0);
> +	if (IS_ERR(thermal)) {
> +		dev_err(&pdev->dev,
> +			"Failed to register thermal zone device\n");
> +		return PTR_ERR(thermal);
> +	}
> +
> +	platform_set_drvdata(pdev, thermal);
> +
> +	return 0;
> +}
> +
> +static int armada_thermal_exit(struct platform_device *pdev)
> +{
> +	struct thermal_zone_device *armada_thermal =
> +		platform_get_drvdata(pdev);
> +
> +	thermal_zone_device_unregister(armada_thermal);
> +	platform_set_drvdata(pdev, NULL);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver armada_thermal_driver = {
> +	.probe = armada_thermal_probe,
> +	.remove = armada_thermal_exit,
> +	.driver = {
> +		.name = "armada_thermal",
> +		.owner = THIS_MODULE,
> +		.of_match_table = of_match_ptr(armada_thermal_id_table),
> +	},
> +};
> +
> +module_platform_driver(armada_thermal_driver);
> +
> +MODULE_AUTHOR("Ezequiel Garcia <ezequiel.garcia@free-electrons.com>");
> +MODULE_DESCRIPTION("Armada 370/XP thermal driver");
> +MODULE_LICENSE("GPL v2");
> ------------------------------------>8----------------------------------------
> 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-04-02 13:05         ` Zhang Rui
@ 2013-04-02 23:23           ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-02 23:23 UTC (permalink / raw)
  To: Zhang Rui
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

On Tue, Apr 02, 2013 at 09:05:10PM +0800, Zhang Rui wrote:
> On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> > Hi Zhang,
> > 
> > On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > > This driver supports both Armada 370 and Armada XP SoC
> > > > thermal management controllers.
> > > > 
> > > > Armada 370 has a register to check a valid temperature, whereas
> > > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > > function. The temperature conversion formula is the same for both.
> > > > 
> > > > The controller present in each SoC have a very similar feature set,
> > > > so it corresponds to have one driver to support both of them.
> > > > 
> > > > Although this driver may present similarities to Dove and Kirkwood
> > > > thermal driver, the exact differences and coincidences are not fully
> > > > known. For this reason, support is given through a separate driver.
> > > > 
> > > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> 
> patch applied.
> 

Great, thank you! Which branch have you applied this?

-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-04-02 23:23           ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-02 23:23 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Apr 02, 2013 at 09:05:10PM +0800, Zhang Rui wrote:
> On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> > Hi Zhang,
> > 
> > On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > > This driver supports both Armada 370 and Armada XP SoC
> > > > thermal management controllers.
> > > > 
> > > > Armada 370 has a register to check a valid temperature, whereas
> > > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > > function. The temperature conversion formula is the same for both.
> > > > 
> > > > The controller present in each SoC have a very similar feature set,
> > > > so it corresponds to have one driver to support both of them.
> > > > 
> > > > Although this driver may present similarities to Dove and Kirkwood
> > > > thermal driver, the exact differences and coincidences are not fully
> > > > known. For this reason, support is given through a separate driver.
> > > > 
> > > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> 
> patch applied.
> 

Great, thank you! Which branch have you applied this?

-- 
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
  2013-04-02 13:05         ` Zhang Rui
@ 2013-04-08  8:26           ` Ezequiel Garcia
  -1 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-08  8:26 UTC (permalink / raw)
  To: Zhang Rui
  Cc: linux-arm-kernel, linux-pm, Lior Amsalem, Nobuhiro Iwamatsu,
	Sebastian Hesselbarth, Andrew Lunn, Thomas Petazzoni,
	Gregory Clement, Jason Cooper

Hi Zhang,

On Tue, Apr 02, 2013 at 09:05:10PM +0800, Zhang Rui wrote:
> On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> > On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > > This driver supports both Armada 370 and Armada XP SoC
> > > > thermal management controllers.
> > > > 
> > > > Armada 370 has a register to check a valid temperature, whereas
> > > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > > function. The temperature conversion formula is the same for both.
> > > > 
> > > > The controller present in each SoC have a very similar feature set,
> > > > so it corresponds to have one driver to support both of them.
> > > > 
> > > > Although this driver may present similarities to Dove and Kirkwood
> > > > thermal driver, the exact differences and coincidences are not fully
> > > > known. For this reason, support is given through a separate driver.
> > > > 
> > > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> 
> patch applied.
> 

I'm not seeing this patch applied on any branch.

Where have you applied this? Or perhaps there's anything left to fix?

-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management
@ 2013-04-08  8:26           ` Ezequiel Garcia
  0 siblings, 0 replies; 26+ messages in thread
From: Ezequiel Garcia @ 2013-04-08  8:26 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Zhang,

On Tue, Apr 02, 2013 at 09:05:10PM +0800, Zhang Rui wrote:
> On Mon, 2013-04-01 at 22:37 -0300, Ezequiel Garcia wrote:
> > On Thu, Mar 28, 2013 at 09:43:37AM +0800, Zhang Rui wrote:
> > > On Tue, 2013-03-26 at 07:16 -0300, Ezequiel Garcia wrote:
> > > > This driver supports both Armada 370 and Armada XP SoC
> > > > thermal management controllers.
> > > > 
> > > > Armada 370 has a register to check a valid temperature, whereas
> > > > Armada XP does not. Each has a different initialization (i.e. calibration)
> > > > function. The temperature conversion formula is the same for both.
> > > > 
> > > > The controller present in each SoC have a very similar feature set,
> > > > so it corresponds to have one driver to support both of them.
> > > > 
> > > > Although this driver may present similarities to Dove and Kirkwood
> > > > thermal driver, the exact differences and coincidences are not fully
> > > > known. For this reason, support is given through a separate driver.
> > > > 
> > > > Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
> 
> patch applied.
> 

I'm not seeing this patch applied on any branch.

Where have you applied this? Or perhaps there's anything left to fix?

-- 
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2013-04-08  8:26 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-26 10:16 [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support Ezequiel Garcia
2013-03-26 10:16 ` Ezequiel Garcia
2013-03-26 10:16 ` [PATCH v2 1/4] thermal: Add driver for Armada 370/XP SoC thermal management Ezequiel Garcia
2013-03-26 10:16   ` Ezequiel Garcia
2013-03-28  1:43   ` Zhang Rui
2013-03-28  1:43     ` Zhang Rui
2013-03-28  3:43     ` Ezequiel Garcia
2013-03-28  3:43       ` Ezequiel Garcia
2013-04-02  1:37     ` Ezequiel Garcia
2013-04-02  1:37       ` Ezequiel Garcia
2013-04-02 13:05       ` Zhang Rui
2013-04-02 13:05         ` Zhang Rui
2013-04-02 23:23         ` Ezequiel Garcia
2013-04-02 23:23           ` Ezequiel Garcia
2013-04-08  8:26         ` Ezequiel Garcia
2013-04-08  8:26           ` Ezequiel Garcia
2013-03-26 10:16 ` [PATCH v2 2/4] ARM: mvebu: Add thermal support to Armada XP device tree Ezequiel Garcia
2013-03-26 10:16   ` Ezequiel Garcia
2013-03-26 10:16 ` [PATCH v2 3/4] ARM: mvebu: Add thermal support to Armada 370 " Ezequiel Garcia
2013-03-26 10:16   ` Ezequiel Garcia
2013-03-26 10:16 ` [PATCH v2 4/4] ARM: configs: Update mvebu defconfig for thermal Ezequiel Garcia
2013-03-26 10:16   ` Ezequiel Garcia
2013-03-26 16:46 ` [PATCH for 3.10 v2 0/4] thermal: Add Armada 370/XP support Andrew Lunn
2013-03-26 16:46   ` Andrew Lunn
2013-03-31  0:47 ` Jason Cooper
2013-03-31  0:47   ` Jason Cooper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.