* [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers
@ 2022-11-28 23:02 nick.hawkins
2022-11-28 23:02 ` [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller nick.hawkins
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
The GXP SoC can support up to 16 fans through the interface provided by
the CPLD. The fans speeds are controlled via a pwm value 0-255. The fans
are also capable of reporting if they have failed to the CPLD which in
turn reports the status to the GXP SoC. Based on previous feedback the
registers required for fan control have been regmaped individualy to fan
driver. Specifically these registers are the function 2 registers and the
programmable logic registers from the CPLD. Additionally in this patchset
there is support for the SPI driver which already exists as spi-gxp.c in
the SPI driver.
---
Changes since v1:
*Renamed fn2reg to fn2 in dtsi file and documentation
*Renamed plreg to pl in dtsi file and documentation
*Renamed fanctrl to fan-controller in dtsi file and documentation
*Adjusted base register range for fan ctrl in dtsi
*Changed commit description on fan-ctrl device-tree binding
*Changed register description on fan-ctrl device-tree binding
*Changed number of supported fans from 16 to 8 in driver code and
documentation
*Modified commit description of fan code
*Removed support for fan[0-15]_input
*Removed PWM defines in driver code
*Added gxp-fan-ctrl to hwmon's index.rst
*Removed mutex in driver code
*Added fan_enable support in fan code and documentation
*Fixed comment in driver code presents -> present
*Removed unecessary include files in fan code
*Added comments to describe what power state is and
calculations for accessing plreg in fan code
*Removed use of variable offsets in fan code
*Fixed GPL header in fan code
*Changed module description for fan controller
*Added kfree in case of failure to initialize driver
*Added missing yaml file to MAINTAINERS
Nick Hawkins (6):
hwmon: (gxp-fan-ctrl) Add GXP fan controller
ABI: sysfs-class-hwmon: add a description for fanY_fault
dt-bindings: hwmon: Add hpe,gxp-fan-ctrl
ARM: dts: add GXP Support for fans and SPI
ARM: multi_v7_defconfig: Add GXP Fan and SPI support
MAINTAINERS: add gxp fan controller and documents
Documentation/ABI/testing/sysfs-class-hwmon | 9 +
.../bindings/hwmon/hpe,gxp-fan-ctrl.yaml | 41 +++
Documentation/hwmon/gxp-fan-ctrl.rst | 28 ++
Documentation/hwmon/index.rst | 1 +
MAINTAINERS | 3 +
arch/arm/boot/dts/hpe-bmc-dl360gen10.dts | 58 ++++
arch/arm/boot/dts/hpe-gxp.dtsi | 64 ++--
arch/arm/configs/multi_v7_defconfig | 2 +
drivers/hwmon/Kconfig | 9 +
drivers/hwmon/Makefile | 1 +
drivers/hwmon/gxp-fan-ctrl.c | 305 ++++++++++++++++++
11 files changed, 502 insertions(+), 19 deletions(-)
create mode 100644 Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
create mode 100644 Documentation/hwmon/gxp-fan-ctrl.rst
create mode 100644 drivers/hwmon/gxp-fan-ctrl.c
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
2022-11-29 4:02 ` Guenter Roeck
2022-11-28 23:02 ` [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault nick.hawkins
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
The GXP SoC can support up to 16 fans through the interface provided by
the CPLD. The current support is limited to 8 fans. The fans speeds are
controlled via 8 different PWMs which can vary in value from 0-255. The
fans are also capable of reporting if they have failed to the CPLD which
in turn reports the status to the GXP SoC.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*Changed number of supported fans from 16 to 8 in code
*Remove last sentence of commit description
*Removed support for fan[0-15]_input in code and documentation
*Changed documentation to limit fan count to 7
*Changed documentation license
*Removed PWM defines
*Added gxp-fan-ctrl to hwmon's index.rst
*Removed mutex
*Added fan_enable support to report if the fan is enabled
*Changed presents to present
*Removed unnecessary ()
*Add comment for plreg reads and calculations
*Add comment for the use of platform power state in code
*Removed use of variable offsets and went with hardcoding instead
*Rewrote driver to use devm_hwmon_device_register_with_info()
*Remove unused header files
*Fix GPL header
*Changed module description
*Add kfree in case of failure to get regmaps or resource
---
Documentation/hwmon/gxp-fan-ctrl.rst | 28 +++
Documentation/hwmon/index.rst | 1 +
drivers/hwmon/Kconfig | 9 +
drivers/hwmon/Makefile | 1 +
drivers/hwmon/gxp-fan-ctrl.c | 305 +++++++++++++++++++++++++++
5 files changed, 344 insertions(+)
create mode 100644 Documentation/hwmon/gxp-fan-ctrl.rst
create mode 100644 drivers/hwmon/gxp-fan-ctrl.c
diff --git a/Documentation/hwmon/gxp-fan-ctrl.rst b/Documentation/hwmon/gxp-fan-ctrl.rst
new file mode 100644
index 000000000000..ae3397e81c04
--- /dev/null
+++ b/Documentation/hwmon/gxp-fan-ctrl.rst
@@ -0,0 +1,28 @@
+.. SPDX-License-Identifier: GPL-2.0-only
+
+Kernel driver gxp-fan-ctrl
+==========================
+
+Supported chips:
+
+ * HPE GXP SOC
+
+Author: Nick Hawkins <nick.hawkins@hpe.com>
+
+
+Description
+-----------
+
+gxp-fan-ctrl is a driver which provides fan control for the hpe gxp soc.
+The driver allows the gathering of fan status and the use of fan
+PWM control.
+
+
+Sysfs attributes
+----------------
+
+======================= ===========================================================
+pwm[0-7] Fan 0 to 7 respective PWM value (0-255)
+fan[0-7]_fault Fan 0 to 7 respective fault status: 1 fail, 0 ok
+fan[0-7]_enable Fan 0 to 7 respective enabled status: 1 enabled, 0 disabled
+======================= ===========================================================
diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst
index f7113b0f8b2a..b319ab173d1d 100644
--- a/Documentation/hwmon/index.rst
+++ b/Documentation/hwmon/index.rst
@@ -73,6 +73,7 @@ Hardware Monitoring Kernel Drivers
g762
gsc-hwmon
gl518sm
+ gxp-fan-ctrl
hih6130
ibmaem
ibm-cffps
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index e70d9614bec2..9e0427f20141 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -705,6 +705,15 @@ config SENSORS_GPIO_FAN
This driver can also be built as a module. If so, the module
will be called gpio-fan.
+config SENSORS_GXP_FAN_CTRL
+ tristate "HPE GXP fan controller"
+ depends on ARCH_HPE_GXP || COMPILE_TEST
+ help
+ If you say yes here you get support for GXP fan control functionality.
+
+ The GXP controls fan function via the CPLD through the use of PWM
+ registers. This driver reports status and pwm setting of the fans.
+
config SENSORS_HIH6130
tristate "Honeywell Humidicon HIH-6130 humidity/temperature sensor"
depends on I2C
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 007e829d1d0d..b474dcc708c4 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -83,6 +83,7 @@ obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o
obj-$(CONFIG_SENSORS_GSC) += gsc-hwmon.o
obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o
+obj-$(CONFIG_SENSORS_GXP_FAN_CTRL) += gxp-fan-ctrl.o
obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o
obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o
diff --git a/drivers/hwmon/gxp-fan-ctrl.c b/drivers/hwmon/gxp-fan-ctrl.c
new file mode 100644
index 000000000000..0b03d33a3a7b
--- /dev/null
+++ b/drivers/hwmon/gxp-fan-ctrl.c
@@ -0,0 +1,305 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (C) 2022 Hewlett-Packard Enterprise Development Company, L.P. */
+
+#include <linux/err.h>
+#include <linux/hwmon.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#define OFS_FAN_INST 0 /* Is 0 because plreg base will be set at INST */
+#define OFS_FAN_FAIL 2 /* Is 2 bytes after base */
+#define OFS_SEVSTAT 0 /* Is 0 because fn2 base will be set at SEVSTAT */
+#define POWER_BIT 24
+
+struct gxp_fan_ctrl_drvdata {
+ struct device *dev;
+ struct device *hwmon_dev;
+ struct regmap *plreg_map; /* Programmable logic register regmap */
+ struct regmap *fn2_map; /* Function 2 regmap */
+ void __iomem *base;
+};
+
+static bool fan_installed(struct device *dev, int fan)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
+ u32 val;
+
+ regmap_read(drvdata->plreg_map, OFS_FAN_INST, &val);
+ if (val & BIT(fan))
+ return 1;
+ else
+ return 0;
+}
+
+static long fan_failed(struct device *dev, int fan)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
+ u32 val;
+
+ /*
+ * The offset for fan fail is 2 which is not word aligned.
+ * Read from fan installed which is 0 and shift value.
+ */
+
+ regmap_read(drvdata->plreg_map, OFS_FAN_INST, &val);
+
+ if ((val >> (8 * OFS_FAN_FAIL)) & BIT(fan))
+ return 1;
+ else
+ return 0;
+}
+
+static long fan_enabled(struct device *dev, int fan)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
+ unsigned int reg;
+
+ /*
+ * Check the power status as if the platform is off the value
+ * reported for the PWM will be incorrect. Report fan as
+ * disabled.
+ */
+ regmap_read(drvdata->fn2_map, OFS_SEVSTAT, ®);
+
+ /* If Fan is installed and the system is on it is enabled */
+ if ((reg & BIT(POWER_BIT)) && fan_installed(dev, fan))
+ return 1;
+
+ /* Platform power is off, fan is disabled */
+ return 0;
+}
+
+static int gxp_pwm_write(struct device *dev, u32 attr, int channel, long val)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
+
+ switch (attr) {
+ case hwmon_pwm_input:
+ if (val > 255)
+ return -EINVAL;
+ writeb(val, drvdata->base + channel);
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static int gxp_fan_ctrl_write(struct device *dev, enum hwmon_sensor_types type,
+ u32 attr, int channel, long val)
+{
+ switch (type) {
+ case hwmon_pwm:
+ return gxp_pwm_write(dev, attr, channel, val);
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static int gxp_fan_read(struct device *dev, u32 attr, int channel, long *val)
+{
+ switch (attr) {
+ case hwmon_fan_enable:
+ *val = fan_enabled(dev, channel);
+ return 0;
+ case hwmon_fan_fault:
+ *val = fan_failed(dev, channel);
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static int gxp_pwm_read(struct device *dev, u32 attr, int channel, long *val)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
+ unsigned int reg;
+
+ /*
+ * Check the power status of the platform. If the platform is off
+ * the value reported for the PWM will be incorrect. In this case
+ * report a PWM of zero.
+ */
+ regmap_read(drvdata->fn2_map, 0, ®);
+ if (reg & BIT(POWER_BIT)) {
+ /* If Fan present, then read it. */
+ *val = fan_installed(dev, channel) ? readb(drvdata->base + channel) : 0;
+ } else {
+ *val = 0;
+ }
+
+ return 0;
+}
+
+static int gxp_fan_ctrl_read(struct device *dev, enum hwmon_sensor_types type,
+ u32 attr, int channel, long *val)
+{
+ switch (type) {
+ case hwmon_fan:
+ return gxp_fan_read(dev, attr, channel, val);
+ case hwmon_pwm:
+ return gxp_pwm_read(dev, attr, channel, val);
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static umode_t gxp_fan_ctrl_is_visible(const void *_data,
+ enum hwmon_sensor_types type,
+ u32 attr, int channel)
+{
+ umode_t mode = 0;
+
+ switch (type) {
+ case hwmon_fan:
+ switch (attr) {
+ case hwmon_fan_enable:
+ case hwmon_fan_fault:
+ mode = 0444;
+ default:
+ break;
+ }
+ case hwmon_pwm:
+ switch (attr) {
+ case hwmon_pwm_input:
+ mode = 0644;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ return mode;
+}
+
+static const struct hwmon_ops gxp_fan_ctrl_ops = {
+ .is_visible = gxp_fan_ctrl_is_visible,
+ .read = gxp_fan_ctrl_read,
+ .write = gxp_fan_ctrl_write,
+};
+
+static const struct hwmon_channel_info *gxp_fan_ctrl_info[] = {
+ HWMON_CHANNEL_INFO(fan,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE,
+ HWMON_F_FAULT | HWMON_F_ENABLE),
+ HWMON_CHANNEL_INFO(pwm,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
+ HWMON_PWM_INPUT | HWMON_PWM_ENABLE),
+ NULL
+};
+
+static const struct hwmon_chip_info gxp_fan_ctrl_chip_info = {
+ .ops = &gxp_fan_ctrl_ops,
+ .info = gxp_fan_ctrl_info,
+
+};
+
+static struct regmap *gxp_fan_ctrl_init_regmap(struct platform_device *pdev, char *reg_name)
+{
+ struct regmap_config regmap_config = {
+ .reg_bits = 32,
+ .reg_stride = 4,
+ .val_bits = 32,
+ };
+ void __iomem *base;
+
+ base = devm_platform_ioremap_resource_byname(pdev, reg_name);
+ if (IS_ERR(base))
+ return ERR_CAST(base);
+
+ regmap_config.name = reg_name;
+
+ return devm_regmap_init_mmio(&pdev->dev, base, ®map_config);
+}
+
+static int gxp_fan_ctrl_probe(struct platform_device *pdev)
+{
+ struct gxp_fan_ctrl_drvdata *drvdata;
+ struct resource *res;
+ struct device *dev = &pdev->dev;
+ int error;
+
+ drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gxp_fan_ctrl_drvdata),
+ GFP_KERNEL);
+ if (!drvdata)
+ return -ENOMEM;
+
+ drvdata->dev = &pdev->dev;
+
+ platform_set_drvdata(pdev, drvdata);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ drvdata->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(drvdata->base)) {
+ error = dev_err_probe(dev, PTR_ERR(drvdata->base),
+ "failed to map base\n");
+ goto free_mem;
+ }
+ drvdata->plreg_map = gxp_fan_ctrl_init_regmap(pdev, "pl");
+ if (IS_ERR(drvdata->plreg_map)) {
+ error = dev_err_probe(dev, PTR_ERR(drvdata->plreg_map),
+ "failed to map plreg_handle\n");
+ goto free_mem;
+ }
+
+ drvdata->fn2_map = gxp_fan_ctrl_init_regmap(pdev, "fn2");
+ if (IS_ERR(drvdata->fn2_map)) {
+ error = dev_err_probe(dev, PTR_ERR(drvdata->fn2_map),
+ "failed to map fn2_handle\n");
+ goto free_mem;
+ }
+
+ drvdata->hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
+ "fan_ctrl",
+ drvdata,
+ &gxp_fan_ctrl_chip_info,
+ NULL);
+
+ if (IS_ERR(drvdata->hwmon_dev)) {
+ error = dev_err_probe(dev, PTR_ERR(drvdata->hwmon_dev),
+ "failed to register fan ctrl\n");
+
+ goto free_mem;
+ }
+
+ return 0;
+
+free_mem:
+ kfree(drvdata);
+ return error;
+}
+
+static const struct of_device_id gxp_fan_ctrl_of_match[] = {
+ { .compatible = "hpe,gxp-fan-ctrl", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, gxp_fan_ctrl_of_match);
+
+static struct platform_driver gxp_fan_ctrl_driver = {
+ .probe = gxp_fan_ctrl_probe,
+ .driver = {
+ .name = "gxp-fan-ctrl",
+ .of_match_table = gxp_fan_ctrl_of_match,
+ },
+};
+module_platform_driver(gxp_fan_ctrl_driver);
+
+MODULE_AUTHOR("Nick Hawkins <nick.hawkins@hpe.com>");
+MODULE_DESCRIPTION("HPE GXP fan controller");
+MODULE_LICENSE("GPL");
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
2022-11-28 23:02 ` [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
2022-11-29 3:34 ` Guenter Roeck
2022-11-28 23:02 ` [PATCH v2 3/6] dt-bindings: hwmon: Add hpe,gxp-fan-ctrl nick.hawkins
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
The fans are capable of reporting a fault to the CPLD controller which
then reports it to the GXP SoC via PLREGS. This patch enables hwmon to
be able to report these failures up to the HOST OS.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*No change
---
Documentation/ABI/testing/sysfs-class-hwmon | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-class-hwmon b/Documentation/ABI/testing/sysfs-class-hwmon
index 7271781a23b2..638f4c6d4ec7 100644
--- a/Documentation/ABI/testing/sysfs-class-hwmon
+++ b/Documentation/ABI/testing/sysfs-class-hwmon
@@ -276,6 +276,15 @@ Description:
RW
+What: /sys/class/hwmon/hwmonX/fanY_fault
+Description:
+ Reports if a fan has reported failure.
+
+ - 1: Failed
+ - 0: Ok
+
+ RO
+
What: /sys/class/hwmon/hwmonX/pwmY
Description:
Pulse width modulation fan control.
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/6] dt-bindings: hwmon: Add hpe,gxp-fan-ctrl
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
2022-11-28 23:02 ` [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller nick.hawkins
2022-11-28 23:02 ` [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
2022-11-28 23:02 ` [PATCH v2 4/6] ARM: dts: add GXP Support for fans and SPI nick.hawkins
` (2 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
Create documentation for the binding to support control of the fans on
HPE platforms.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*Changed plreg to pl
*Changed fn2reg to reg
*Edited descriptions for all registers
*Changed fanctrl to fan-controller
*Changed commit description
---
.../bindings/hwmon/hpe,gxp-fan-ctrl.yaml | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
diff --git a/Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml b/Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
new file mode 100644
index 000000000000..b4eb7460e277
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwmon/hpe,gxp-fan-ctrl.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: HPE GXP Fan Controller
+
+maintainers:
+ - Nick Hawkins <nick.hawkins@hpe.com>
+
+properties:
+ compatible:
+ const: hpe,gxp-fan-ctrl
+
+ reg:
+ items:
+ - description: Fan controller PWM
+ - description: Programmable logic
+ - description: Function 2
+
+ reg-names:
+ items:
+ - const: base
+ - const: pl
+ - const: fn2
+
+required:
+ - compatible
+ - reg
+ - reg-names
+
+additionalProperties: false
+
+examples:
+ - |
+ fan-controller@1000c00 {
+ compatible = "hpe,gxp-fan-ctrl";
+ reg = <0x1000c00 0x200>, <0xd1000000 0xff>, <0x80200000 0x100000>;
+ reg-names = "base", "pl", "fn2";
+ };
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/6] ARM: dts: add GXP Support for fans and SPI
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
` (2 preceding siblings ...)
2022-11-28 23:02 ` [PATCH v2 3/6] dt-bindings: hwmon: Add hpe,gxp-fan-ctrl nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
2022-11-28 23:02 ` [PATCH v2 5/6] ARM: multi_v7_defconfig: Add GXP Fan and SPI support nick.hawkins
2022-11-28 23:02 ` [PATCH v2 6/6] MAINTAINERS: add gxp fan controller and documents nick.hawkins
5 siblings, 0 replies; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
Reorganize the base address of AHB to accommodate the SPI and fan driver
register requirements. Add the hpe,gxp-spifi and hpe,gxp-fan-ctrl
compatibles. Add comments to make the register range more clear.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*Changed fn2reg to fn2
*Changed plreg to pl
*Changed fanctrl to fan-controller
*Adjusted base register range to elminate need for defines in code
---
arch/arm/boot/dts/hpe-bmc-dl360gen10.dts | 58 +++++++++++++++++++++
arch/arm/boot/dts/hpe-gxp.dtsi | 64 +++++++++++++++++-------
2 files changed, 103 insertions(+), 19 deletions(-)
diff --git a/arch/arm/boot/dts/hpe-bmc-dl360gen10.dts b/arch/arm/boot/dts/hpe-bmc-dl360gen10.dts
index 3a7382ce40ef..d49dcef95c5c 100644
--- a/arch/arm/boot/dts/hpe-bmc-dl360gen10.dts
+++ b/arch/arm/boot/dts/hpe-bmc-dl360gen10.dts
@@ -24,3 +24,61 @@
reg = <0x40000000 0x20000000>;
};
};
+
+&spifi {
+ status = "okay";
+ flash@0 {
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ u-boot@0 {
+ label = "u-boot";
+ reg = <0x0 0x60000>;
+ };
+
+ u-boot-env@60000 {
+ label = "u-boot-env";
+ reg = <0x60000 0x20000>;
+ };
+
+ kernel@80000 {
+ label = "kernel";
+ reg = <0x80000 0x4c0000>;
+ };
+
+ rofs@540000 {
+ label = "rofs";
+ reg = <0x540000 0x1740000>;
+ };
+
+ rwfs@1c80000 {
+ label = "rwfs";
+ reg = <0x1c80000 0x250000>;
+ };
+
+ section@1ed0000{
+ label = "section";
+ reg = <0x1ed0000 0x130000>;
+ };
+ };
+ };
+ flash@1 {
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ host-prime@0 {
+ label = "host-prime";
+ reg = <0x0 0x02000000>;
+ };
+
+ host-second@2000000 {
+ label = "host-second";
+ reg = <0x02000000 0x02000000>;
+ };
+ };
+ };
+};
diff --git a/arch/arm/boot/dts/hpe-gxp.dtsi b/arch/arm/boot/dts/hpe-gxp.dtsi
index cf735b3c4f35..b73b22a93716 100644
--- a/arch/arm/boot/dts/hpe-gxp.dtsi
+++ b/arch/arm/boot/dts/hpe-gxp.dtsi
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
/*
- * Device Tree file for HPE GXP
+ * Device Tree for HPE
*/
/dts-v1/;
@@ -52,76 +52,102 @@
cache-level = <2>;
};
- ahb@c0000000 {
+ ahb@80000000 {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
- ranges = <0x0 0xc0000000 0x30000000>;
+ ranges = <0x0 0x80000000 0xf000000>, /* 0x80000000 - 0x8f000000 */
+ <0x40000000 0xc0000000 0x7fffffff>; /* 0xc0000000 - 0xffffffff */
dma-ranges;
- vic0: interrupt-controller@eff0000 {
+ spifi: spi@40000200 { /* 0xc0000200 */
+ compatible = "hpe,gxp-spifi";
+ reg = <0x40000200 0x80>, <0x4000c000 0x100>, <0x78000000 0x7ff0000>;
+ interrupts = <20>;
+ interrupt-parent = <&vic0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ flash@0 {
+ reg = <0>;
+ compatible = "jedec,spi-nor";
+ };
+
+ flash@1 {
+ reg = <1>;
+ compatible = "jedec,spi-nor";
+ };
+ };
+
+ vic0: interrupt-controller@4eff0000 { /* 0xceff0000 */
compatible = "arm,pl192-vic";
- reg = <0xeff0000 0x1000>;
+ reg = <0x4eff0000 0x1000>;
interrupt-controller;
#interrupt-cells = <1>;
};
- vic1: interrupt-controller@80f00000 {
+ vic1: interrupt-controller@f00000 { /* 0x80f00000 */
compatible = "arm,pl192-vic";
- reg = <0x80f00000 0x1000>;
+ reg = <0xf00000 0x1000>;
interrupt-controller;
#interrupt-cells = <1>;
};
- uarta: serial@e0 {
+ uarta: serial@400000e0 { /* 0xc00000e0 */
compatible = "ns16550a";
- reg = <0xe0 0x8>;
+ reg = <0x400000e0 0x8>;
interrupts = <17>;
interrupt-parent = <&vic0>;
clock-frequency = <1846153>;
reg-shift = <0>;
};
- uartb: serial@e8 {
+ uartb: serial@400000e8 { /* 0xc00000e8 */
compatible = "ns16550a";
- reg = <0xe8 0x8>;
+ reg = <0x400000e8 0x8>;
interrupts = <18>;
interrupt-parent = <&vic0>;
clock-frequency = <1846153>;
reg-shift = <0>;
};
- uartc: serial@f0 {
+ uartc: serial@400000f0 { /* 0xc00000f0 */
compatible = "ns16550a";
- reg = <0xf0 0x8>;
+ reg = <0x400000f0 0x8>;
interrupts = <19>;
interrupt-parent = <&vic0>;
clock-frequency = <1846153>;
reg-shift = <0>;
};
- usb0: usb@efe0000 {
+ usb0: usb@4efe0000 { /* 0xcefe0000 */
compatible = "hpe,gxp-ehci", "generic-ehci";
- reg = <0xefe0000 0x100>;
+ reg = <0x4efe0000 0x100>;
interrupts = <7>;
interrupt-parent = <&vic0>;
};
- st: timer@80 {
+ st: timer@40000080 { /* 0xc0000080 */
compatible = "hpe,gxp-timer";
- reg = <0x80 0x16>;
+ reg = <0x40000080 0x16>;
interrupts = <0>;
interrupt-parent = <&vic0>;
clocks = <&iopclk>;
clock-names = "iop";
};
- usb1: usb@efe0100 {
+ usb1: usb@4efe0100 { /* 0xcefe0100 */
compatible = "hpe,gxp-ohci", "generic-ohci";
- reg = <0xefe0100 0x110>;
+ reg = <0x4efe0100 0x110>;
interrupts = <6>;
interrupt-parent = <&vic0>;
};
+
+ fan-controller@40000c10 { /* 0xc0000c10 */
+ compatible = "hpe,gxp-fan-ctrl";
+ reg = <0x40000c10 0x8>, <0x51000027 0x06>, <0x200070 0x04>;
+ reg-names = "base", "pl", "fn2";
+ };
};
};
};
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/6] ARM: multi_v7_defconfig: Add GXP Fan and SPI support
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
` (3 preceding siblings ...)
2022-11-28 23:02 ` [PATCH v2 4/6] ARM: dts: add GXP Support for fans and SPI nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
2022-11-28 23:02 ` [PATCH v2 6/6] MAINTAINERS: add gxp fan controller and documents nick.hawkins
5 siblings, 0 replies; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
In order for HPE platforms to be supported by linux on GXP it is
necessary for there to be fan and spi driver support. There fan driver
can support up to 16 fans that are driven by pwm through the CPLD. The
SPI driver supports access to the core flash and bios part. The SPI
driver spi-gxp was added previously to linux.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*No change
---
arch/arm/configs/multi_v7_defconfig | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 12b35008571f..92a854e7b01b 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -445,6 +445,7 @@ CONFIG_SPI_CADENCE=y
CONFIG_SPI_DAVINCI=y
CONFIG_SPI_FSL_QUADSPI=m
CONFIG_SPI_GPIO=m
+CONFIG_SPI_GXP=m
CONFIG_SPI_FSL_DSPI=m
CONFIG_SPI_OMAP24XX=y
CONFIG_SPI_ORION=y
@@ -535,6 +536,7 @@ CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_RASPBERRYPI_HWMON=m
CONFIG_SENSORS_INA2XX=m
+CONFIG_SENSORS_GXP_FAN_CTRL=m
CONFIG_CPU_THERMAL=y
CONFIG_DEVFREQ_THERMAL=y
CONFIG_IMX_THERMAL=y
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 6/6] MAINTAINERS: add gxp fan controller and documents
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
` (4 preceding siblings ...)
2022-11-28 23:02 ` [PATCH v2 5/6] ARM: multi_v7_defconfig: Add GXP Fan and SPI support nick.hawkins
@ 2022-11-28 23:02 ` nick.hawkins
5 siblings, 0 replies; 13+ messages in thread
From: nick.hawkins @ 2022-11-28 23:02 UTC (permalink / raw)
To: jdelvare, linux, robh+dt, krzysztof.kozlowski+dt, verdun,
nick.hawkins, corbet, linux, linux-hwmon, linux-kernel,
devicetree, linux-doc, linux-arm-kernel
From: Nick Hawkins <nick.hawkins@hpe.com>
Add the gxp-fan-ctrl.c and gxp-fan-ctrl.rst in hwmon
driver/documentation.
Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
---
v2:
*Added missing gxp-fan-ctrl.yaml
---
MAINTAINERS | 3 +++
1 file changed, 3 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 56ff555ed5a4..00b6ed6dd5cd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2177,13 +2177,16 @@ ARM/HPE GXP ARCHITECTURE
M: Jean-Marie Verdun <verdun@hpe.com>
M: Nick Hawkins <nick.hawkins@hpe.com>
S: Maintained
+F: Documentation/hwmon/gxp-fan-ctrl.rst
F: Documentation/devicetree/bindings/arm/hpe,gxp.yaml
+F: Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
F: Documentation/devicetree/bindings/spi/hpe,gxp-spifi.yaml
F: Documentation/devicetree/bindings/timer/hpe,gxp-timer.yaml
F: arch/arm/boot/dts/hpe-bmc*
F: arch/arm/boot/dts/hpe-gxp*
F: arch/arm/mach-hpe/
F: drivers/clocksource/timer-gxp.c
+F: drivers/hwmon/gxp-fan-ctrl.c
F: drivers/spi/spi-gxp.c
F: drivers/watchdog/gxp-wdt.c
--
2.17.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault
2022-11-28 23:02 ` [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault nick.hawkins
@ 2022-11-29 3:34 ` Guenter Roeck
2022-11-29 16:15 ` Hawkins, Nick
0 siblings, 1 reply; 13+ messages in thread
From: Guenter Roeck @ 2022-11-29 3:34 UTC (permalink / raw)
To: nick.hawkins, jdelvare, robh+dt, krzysztof.kozlowski+dt, verdun,
corbet, linux, linux-hwmon, linux-kernel, devicetree, linux-doc,
linux-arm-kernel
On 11/28/22 15:02, nick.hawkins@hpe.com wrote:
> From: Nick Hawkins <nick.hawkins@hpe.com>
>
> The fans are capable of reporting a fault to the CPLD controller which
> then reports it to the GXP SoC via PLREGS. This patch enables hwmon to
> be able to report these failures up to the HOST OS.
>
This change is really completely unrelated to a CPLD or specific SoC.
The commit description is just confusing. It should simply state that
it documents the existing fanX_fault attribute.
Guenter
> Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
>
> ---
>
> v2:
> *No change
> ---
> Documentation/ABI/testing/sysfs-class-hwmon | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-class-hwmon b/Documentation/ABI/testing/sysfs-class-hwmon
> index 7271781a23b2..638f4c6d4ec7 100644
> --- a/Documentation/ABI/testing/sysfs-class-hwmon
> +++ b/Documentation/ABI/testing/sysfs-class-hwmon
> @@ -276,6 +276,15 @@ Description:
>
> RW
>
> +What: /sys/class/hwmon/hwmonX/fanY_fault
> +Description:
> + Reports if a fan has reported failure.
> +
> + - 1: Failed
> + - 0: Ok
> +
> + RO
> +
> What: /sys/class/hwmon/hwmonX/pwmY
> Description:
> Pulse width modulation fan control.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller
2022-11-28 23:02 ` [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller nick.hawkins
@ 2022-11-29 4:02 ` Guenter Roeck
2022-11-29 17:13 ` Hawkins, Nick
0 siblings, 1 reply; 13+ messages in thread
From: Guenter Roeck @ 2022-11-29 4:02 UTC (permalink / raw)
To: nick.hawkins
Cc: jdelvare, robh+dt, krzysztof.kozlowski+dt, verdun, corbet, linux,
linux-hwmon, linux-kernel, devicetree, linux-doc,
linux-arm-kernel
On Mon, Nov 28, 2022 at 05:02:14PM -0600, nick.hawkins@hpe.com wrote:
> From: Nick Hawkins <nick.hawkins@hpe.com>
>
> The GXP SoC can support up to 16 fans through the interface provided by
> the CPLD. The current support is limited to 8 fans. The fans speeds are
> controlled via 8 different PWMs which can vary in value from 0-255. The
> fans are also capable of reporting if they have failed to the CPLD which
> in turn reports the status to the GXP SoC.
>
> Signed-off-by: Nick Hawkins <nick.hawkins@hpe.com>
> ---
>
> v2:
> *Changed number of supported fans from 16 to 8 in code
> *Remove last sentence of commit description
> *Removed support for fan[0-15]_input in code and documentation
> *Changed documentation to limit fan count to 7
> *Changed documentation license
> *Removed PWM defines
> *Added gxp-fan-ctrl to hwmon's index.rst
> *Removed mutex
> *Added fan_enable support to report if the fan is enabled
> *Changed presents to present
> *Removed unnecessary ()
> *Add comment for plreg reads and calculations
> *Add comment for the use of platform power state in code
> *Removed use of variable offsets and went with hardcoding instead
> *Rewrote driver to use devm_hwmon_device_register_with_info()
> *Remove unused header files
> *Fix GPL header
> *Changed module description
> *Add kfree in case of failure to get regmaps or resource
> ---
> Documentation/hwmon/gxp-fan-ctrl.rst | 28 +++
> Documentation/hwmon/index.rst | 1 +
> drivers/hwmon/Kconfig | 9 +
> drivers/hwmon/Makefile | 1 +
> drivers/hwmon/gxp-fan-ctrl.c | 305 +++++++++++++++++++++++++++
> 5 files changed, 344 insertions(+)
> create mode 100644 Documentation/hwmon/gxp-fan-ctrl.rst
> create mode 100644 drivers/hwmon/gxp-fan-ctrl.c
>
> diff --git a/Documentation/hwmon/gxp-fan-ctrl.rst b/Documentation/hwmon/gxp-fan-ctrl.rst
> new file mode 100644
> index 000000000000..ae3397e81c04
> --- /dev/null
> +++ b/Documentation/hwmon/gxp-fan-ctrl.rst
> @@ -0,0 +1,28 @@
> +.. SPDX-License-Identifier: GPL-2.0-only
> +
> +Kernel driver gxp-fan-ctrl
> +==========================
> +
> +Supported chips:
> +
> + * HPE GXP SOC
> +
> +Author: Nick Hawkins <nick.hawkins@hpe.com>
> +
> +
> +Description
> +-----------
> +
> +gxp-fan-ctrl is a driver which provides fan control for the hpe gxp soc.
> +The driver allows the gathering of fan status and the use of fan
> +PWM control.
> +
> +
> +Sysfs attributes
> +----------------
> +
> +======================= ===========================================================
> +pwm[0-7] Fan 0 to 7 respective PWM value (0-255)
> +fan[0-7]_fault Fan 0 to 7 respective fault status: 1 fail, 0 ok
> +fan[0-7]_enable Fan 0 to 7 respective enabled status: 1 enabled, 0 disabled
> +======================= ===========================================================
> diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst
> index f7113b0f8b2a..b319ab173d1d 100644
> --- a/Documentation/hwmon/index.rst
> +++ b/Documentation/hwmon/index.rst
> @@ -73,6 +73,7 @@ Hardware Monitoring Kernel Drivers
> g762
> gsc-hwmon
> gl518sm
> + gxp-fan-ctrl
> hih6130
> ibmaem
> ibm-cffps
> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index e70d9614bec2..9e0427f20141 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -705,6 +705,15 @@ config SENSORS_GPIO_FAN
> This driver can also be built as a module. If so, the module
> will be called gpio-fan.
>
> +config SENSORS_GXP_FAN_CTRL
> + tristate "HPE GXP fan controller"
> + depends on ARCH_HPE_GXP || COMPILE_TEST
> + help
> + If you say yes here you get support for GXP fan control functionality.
> +
> + The GXP controls fan function via the CPLD through the use of PWM
> + registers. This driver reports status and pwm setting of the fans.
> +
> config SENSORS_HIH6130
> tristate "Honeywell Humidicon HIH-6130 humidity/temperature sensor"
> depends on I2C
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index 007e829d1d0d..b474dcc708c4 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -83,6 +83,7 @@ obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o
> obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o
> obj-$(CONFIG_SENSORS_GSC) += gsc-hwmon.o
> obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o
> +obj-$(CONFIG_SENSORS_GXP_FAN_CTRL) += gxp-fan-ctrl.o
> obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o
> obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
> obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o
> diff --git a/drivers/hwmon/gxp-fan-ctrl.c b/drivers/hwmon/gxp-fan-ctrl.c
> new file mode 100644
> index 000000000000..0b03d33a3a7b
> --- /dev/null
> +++ b/drivers/hwmon/gxp-fan-ctrl.c
> @@ -0,0 +1,305 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/* Copyright (C) 2022 Hewlett-Packard Enterprise Development Company, L.P. */
> +
> +#include <linux/err.h>
> +#include <linux/hwmon.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +#include <linux/slab.h>
> +
> +#define OFS_FAN_INST 0 /* Is 0 because plreg base will be set at INST */
> +#define OFS_FAN_FAIL 2 /* Is 2 bytes after base */
> +#define OFS_SEVSTAT 0 /* Is 0 because fn2 base will be set at SEVSTAT */
> +#define POWER_BIT 24
> +
> +struct gxp_fan_ctrl_drvdata {
> + struct device *dev;
> + struct device *hwmon_dev;
Both dev and hwmon_dev are unused and thus pointless.
> + struct regmap *plreg_map; /* Programmable logic register regmap */
> + struct regmap *fn2_map; /* Function 2 regmap */
> + void __iomem *base;
> +};
> +
> +static bool fan_installed(struct device *dev, int fan)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
> + u32 val;
> +
> + regmap_read(drvdata->plreg_map, OFS_FAN_INST, &val);
> + if (val & BIT(fan))
> + return 1;
> + else
> + return 0;
else after return is unnecessary, and
return !!(val & BIT(fan));
would avoid the conditional.
> +}
> +
> +static long fan_failed(struct device *dev, int fan)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
> + u32 val;
> +
> + /*
> + * The offset for fan fail is 2 which is not word aligned.
> + * Read from fan installed which is 0 and shift value.
> + */
> +
> + regmap_read(drvdata->plreg_map, OFS_FAN_INST, &val);
> +
> + if ((val >> (8 * OFS_FAN_FAIL)) & BIT(fan))
> + return 1;
> + else
> + return 0;
else after return is pointless, and this can be written as
return !!((val >> (8 * OFS_FAN_FAIL)) & BIT(fan));
to avoid the conditional.
> +}
> +
> +static long fan_enabled(struct device *dev, int fan)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
> + unsigned int reg;
> +
> + /*
> + * Check the power status as if the platform is off the value
> + * reported for the PWM will be incorrect. Report fan as
> + * disabled.
> + */
> + regmap_read(drvdata->fn2_map, OFS_SEVSTAT, ®);
> +
> + /* If Fan is installed and the system is on it is enabled */
> + if ((reg & BIT(POWER_BIT)) && fan_installed(dev, fan))
> + return 1;
> +
> + /* Platform power is off, fan is disabled */
> + return 0;
Same as above.
> +}
> +
> +static int gxp_pwm_write(struct device *dev, u32 attr, int channel, long val)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
> +
> + switch (attr) {
> + case hwmon_pwm_input:
> + if (val > 255)
> + return -EINVAL;
Should also check for values < 0.
> + writeb(val, drvdata->base + channel);
The mixed use of direct writes and regmap is odd and confusing.
Why use regmap for plreg_map and for fn2_map but not for base ?
Can this be unified ? If not, why ?
> + return 0;
> + default:
> + return -EOPNOTSUPP;
> + }
> +}
> +
> +static int gxp_fan_ctrl_write(struct device *dev, enum hwmon_sensor_types type,
> + u32 attr, int channel, long val)
> +{
> + switch (type) {
> + case hwmon_pwm:
> + return gxp_pwm_write(dev, attr, channel, val);
> + default:
> + return -EOPNOTSUPP;
> + }
> +}
> +
> +static int gxp_fan_read(struct device *dev, u32 attr, int channel, long *val)
> +{
> + switch (attr) {
> + case hwmon_fan_enable:
> + *val = fan_enabled(dev, channel);
> + return 0;
> + case hwmon_fan_fault:
> + *val = fan_failed(dev, channel);
> + return 0;
> + default:
> + return -EOPNOTSUPP;
> + }
> +}
> +
> +static int gxp_pwm_read(struct device *dev, u32 attr, int channel, long *val)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata = dev_get_drvdata(dev);
> + unsigned int reg;
> +
> + /*
> + * Check the power status of the platform. If the platform is off
> + * the value reported for the PWM will be incorrect. In this case
> + * report a PWM of zero.
> + */
> + regmap_read(drvdata->fn2_map, 0, ®);
> + if (reg & BIT(POWER_BIT)) {
> + /* If Fan present, then read it. */
> + *val = fan_installed(dev, channel) ? readb(drvdata->base + channel) : 0;
> + } else {
> + *val = 0;
> + }
> +
> + return 0;
> +}
> +
> +static int gxp_fan_ctrl_read(struct device *dev, enum hwmon_sensor_types type,
> + u32 attr, int channel, long *val)
> +{
> + switch (type) {
> + case hwmon_fan:
> + return gxp_fan_read(dev, attr, channel, val);
> + case hwmon_pwm:
> + return gxp_pwm_read(dev, attr, channel, val);
> + default:
> + return -EOPNOTSUPP;
> + }
> +}
> +
> +static umode_t gxp_fan_ctrl_is_visible(const void *_data,
> + enum hwmon_sensor_types type,
> + u32 attr, int channel)
> +{
> + umode_t mode = 0;
> +
> + switch (type) {
> + case hwmon_fan:
> + switch (attr) {
> + case hwmon_fan_enable:
> + case hwmon_fan_fault:
> + mode = 0444;
break; missing. Otherwise static analyzers will complain.
> + default:
> + break;
> + }
Same as above (and, in this case, prove in point why break;
should always be added even if it seems unnecessary).
> + case hwmon_pwm:
> + switch (attr) {
> + case hwmon_pwm_input:
> + mode = 0644;
Same as above.
> + default:
> + break;
> + }
Same as above.
> + default:
> + break;
> + }
> +
> + return mode;
> +}
> +
> +static const struct hwmon_ops gxp_fan_ctrl_ops = {
> + .is_visible = gxp_fan_ctrl_is_visible,
> + .read = gxp_fan_ctrl_read,
> + .write = gxp_fan_ctrl_write,
> +};
> +
> +static const struct hwmon_channel_info *gxp_fan_ctrl_info[] = {
> + HWMON_CHANNEL_INFO(fan,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE,
> + HWMON_F_FAULT | HWMON_F_ENABLE),
> + HWMON_CHANNEL_INFO(pwm,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> + HWMON_PWM_INPUT | HWMON_PWM_ENABLE),
> + NULL
> +};
> +
> +static const struct hwmon_chip_info gxp_fan_ctrl_chip_info = {
> + .ops = &gxp_fan_ctrl_ops,
> + .info = gxp_fan_ctrl_info,
> +
> +};
> +
> +static struct regmap *gxp_fan_ctrl_init_regmap(struct platform_device *pdev, char *reg_name)
> +{
> + struct regmap_config regmap_config = {
> + .reg_bits = 32,
> + .reg_stride = 4,
> + .val_bits = 32,
> + };
> + void __iomem *base;
> +
> + base = devm_platform_ioremap_resource_byname(pdev, reg_name);
> + if (IS_ERR(base))
> + return ERR_CAST(base);
> +
> + regmap_config.name = reg_name;
> +
> + return devm_regmap_init_mmio(&pdev->dev, base, ®map_config);
> +}
> +
> +static int gxp_fan_ctrl_probe(struct platform_device *pdev)
> +{
> + struct gxp_fan_ctrl_drvdata *drvdata;
> + struct resource *res;
> + struct device *dev = &pdev->dev;
> + int error;
> +
> + drvdata = devm_kzalloc(&pdev->dev, sizeof(struct gxp_fan_ctrl_drvdata),
> + GFP_KERNEL);
There is a local variable (dev) pointing to &pdev->dev.
I would suggest to use it.
> + if (!drvdata)
> + return -ENOMEM;
> +
> + drvdata->dev = &pdev->dev;
> +
> + platform_set_drvdata(pdev, drvdata);
There is no platform_get_drvdata() in this code, meaning
platform_set_drvdata() is unnecessary.
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + drvdata->base = devm_ioremap_resource(&pdev->dev, res);
> + if (IS_ERR(drvdata->base)) {
> + error = dev_err_probe(dev, PTR_ERR(drvdata->base),
> + "failed to map base\n");
> + goto free_mem;
> + }
> + drvdata->plreg_map = gxp_fan_ctrl_init_regmap(pdev, "pl");
> + if (IS_ERR(drvdata->plreg_map)) {
> + error = dev_err_probe(dev, PTR_ERR(drvdata->plreg_map),
> + "failed to map plreg_handle\n");
> + goto free_mem;
> + }
> +
> + drvdata->fn2_map = gxp_fan_ctrl_init_regmap(pdev, "fn2");
> + if (IS_ERR(drvdata->fn2_map)) {
> + error = dev_err_probe(dev, PTR_ERR(drvdata->fn2_map),
> + "failed to map fn2_handle\n");
> + goto free_mem;
> + }
> +
> + drvdata->hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
> + "fan_ctrl",
fan_ctrl is a bit generic. Normally this reflects the driver name.
> + drvdata,
> + &gxp_fan_ctrl_chip_info,
> + NULL);
> +
> + if (IS_ERR(drvdata->hwmon_dev)) {
> + error = dev_err_probe(dev, PTR_ERR(drvdata->hwmon_dev),
> + "failed to register fan ctrl\n");
> +
> + goto free_mem;
> + }
> +
> + return 0;
> +
> +free_mem:
> + kfree(drvdata);
drvdata was allocated with a devm function. Releasing it with kfree
results in a double free. This goto and error handling is not only
unnecessary but wrong.
> + return error;
> +}
> +
> +static const struct of_device_id gxp_fan_ctrl_of_match[] = {
> + { .compatible = "hpe,gxp-fan-ctrl", },
> + {},
> +};
> +MODULE_DEVICE_TABLE(of, gxp_fan_ctrl_of_match);
> +
> +static struct platform_driver gxp_fan_ctrl_driver = {
> + .probe = gxp_fan_ctrl_probe,
> + .driver = {
> + .name = "gxp-fan-ctrl",
> + .of_match_table = gxp_fan_ctrl_of_match,
> + },
> +};
> +module_platform_driver(gxp_fan_ctrl_driver);
> +
> +MODULE_AUTHOR("Nick Hawkins <nick.hawkins@hpe.com>");
> +MODULE_DESCRIPTION("HPE GXP fan controller");
> +MODULE_LICENSE("GPL");
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault
2022-11-29 3:34 ` Guenter Roeck
@ 2022-11-29 16:15 ` Hawkins, Nick
2022-11-29 16:38 ` Guenter Roeck
0 siblings, 1 reply; 13+ messages in thread
From: Hawkins, Nick @ 2022-11-29 16:15 UTC (permalink / raw)
To: Guenter Roeck
Cc: jdelvare@suse.com, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, Verdun, Jean-Marie,
corbet@lwn.net, linux@armlinux.org.uk,
linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
> This change is really completely unrelated to a CPLD or specific SoC.
> The commit description is just confusing. It should simply state that
> it documents the existing fanX_fault attribute.
Understood. Just to confirm should I change fanY_fault to fanX_fault
in documentation as well as the patch description? For instance:
/sys/class/hwmon/hwmonX/fanX_fault
It seems that the documentation around it uses fanY_ format.
Thanks,
-Nick Hawkins
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault
2022-11-29 16:15 ` Hawkins, Nick
@ 2022-11-29 16:38 ` Guenter Roeck
0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2022-11-29 16:38 UTC (permalink / raw)
To: Hawkins, Nick
Cc: jdelvare@suse.com, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, Verdun, Jean-Marie,
corbet@lwn.net, linux@armlinux.org.uk,
linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
On 11/29/22 08:15, Hawkins, Nick wrote:
>> This change is really completely unrelated to a CPLD or specific SoC.
>> The commit description is just confusing. It should simply state that
>> it documents the existing fanX_fault attribute.
>
> Understood. Just to confirm should I change fanY_fault to fanX_fault
> in documentation as well as the patch description? For instance:
> /sys/class/hwmon/hwmonX/fanX_fault
>
> It seems that the documentation around it uses fanY_ format.
>
Now you start splitting hairs ;-). I wanted to point out that
fan[X,Y,Z,A,B,C,...]_fault is a generic attribute, not that I want you
to change fanY to fanX.
Guenter
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller
2022-11-29 4:02 ` Guenter Roeck
@ 2022-11-29 17:13 ` Hawkins, Nick
2022-11-29 18:26 ` Guenter Roeck
0 siblings, 1 reply; 13+ messages in thread
From: Hawkins, Nick @ 2022-11-29 17:13 UTC (permalink / raw)
To: Guenter Roeck
Cc: jdelvare@suse.com, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, Verdun, Jean-Marie,
corbet@lwn.net, linux@armlinux.org.uk,
linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
> > + writeb(val, drvdata->base + channel);
> The mixed use of direct writes and regmap is odd and confusing.
> Why use regmap for plreg_map and for fn2_map but not for base ?
> Can this be unified ? If not, why ?
I will still require three separate areas to access these registers as they
are spaced far apart (> 0x20000000). I will create a comment to
explain this. As for being unified methods I believe they can be
all __iomem's or regmaps.
Thanks,
-Nick Hawkins
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller
2022-11-29 17:13 ` Hawkins, Nick
@ 2022-11-29 18:26 ` Guenter Roeck
0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2022-11-29 18:26 UTC (permalink / raw)
To: Hawkins, Nick
Cc: jdelvare@suse.com, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, Verdun, Jean-Marie,
corbet@lwn.net, linux@armlinux.org.uk,
linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
On 11/29/22 09:13, Hawkins, Nick wrote:
>>> + writeb(val, drvdata->base + channel);
>
>> The mixed use of direct writes and regmap is odd and confusing.
>> Why use regmap for plreg_map and for fn2_map but not for base ?
>> Can this be unified ? If not, why ?
>
> I will still require three separate areas to access these registers as they
> are spaced far apart (> 0x20000000). I will create a comment to
> explain this. As for being unified methods I believe they can be
> all __iomem's or regmaps.
>
I understand that there are three regions. What I don't understand is
that two of them are accessed through regmap and one directly. Either
access all regions using regmap, or all regions using iomem accessors
directly. If regmap does not support access to the base region,
don't use regmap at all, explain why regmap doesn't support this kind
of access, and make sure to copy the regmap maintainer.
Thanks,
Guenter
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2022-11-29 18:27 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-28 23:02 [PATCH v2 0/6] ARM: Add GXP Fan and SPI controllers nick.hawkins
2022-11-28 23:02 ` [PATCH v2 1/6] hwmon: (gxp-fan-ctrl) Add GXP fan controller nick.hawkins
2022-11-29 4:02 ` Guenter Roeck
2022-11-29 17:13 ` Hawkins, Nick
2022-11-29 18:26 ` Guenter Roeck
2022-11-28 23:02 ` [PATCH v2 2/6] ABI: sysfs-class-hwmon: add a description for fanY_fault nick.hawkins
2022-11-29 3:34 ` Guenter Roeck
2022-11-29 16:15 ` Hawkins, Nick
2022-11-29 16:38 ` Guenter Roeck
2022-11-28 23:02 ` [PATCH v2 3/6] dt-bindings: hwmon: Add hpe,gxp-fan-ctrl nick.hawkins
2022-11-28 23:02 ` [PATCH v2 4/6] ARM: dts: add GXP Support for fans and SPI nick.hawkins
2022-11-28 23:02 ` [PATCH v2 5/6] ARM: multi_v7_defconfig: Add GXP Fan and SPI support nick.hawkins
2022-11-28 23:02 ` [PATCH v2 6/6] MAINTAINERS: add gxp fan controller and documents nick.hawkins
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).