hwmon: a new driver for Synaptics AS370 PVT sensor
Subsystems (2)
v2 cover hwmon: a new driver for Synaptics AS370 PVT sensor
Add a new driver for Synaptics AS370 PVT sensor. Currently only temperature is supported.
Jisheng Zhang (2):
hwmon: Add Synaptics AS370 PVT sensor driver
hwmon: (as370-hwmon) Add DT bindings for Synaptics AS370 PVT
Changes since v1
- remove useless <linux/delay.h>
- use GENMASK
- remove useless bit operation
- remove read_pvt()
- use DIV_ROUND_CLOSEST()
.../devicetree/bindings/hwmon/as370.txt | 11 ++ drivers/hwmon/Kconfig | 10 ++ drivers/hwmon/Makefile | 1 + drivers/hwmon/as370-hwmon.c | 147 ++++++++++++++++++ 4 files changed, 169 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/as370.txt create mode 100644 drivers/hwmon/as370-hwmon.c
Signature · 1 line
2.23.0.rc1
PATCH v2 1/2 hwmon: Add Synaptics AS370 PVT sensor driver
Add a new driver for Synaptics AS370 PVT sensors. Currently, only temperature is supported.
--- drivers/hwmon/Kconfig | 10 +++ drivers/hwmon/Makefile | 1 + drivers/hwmon/as370-hwmon.c | 147 ++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 drivers/hwmon/as370-hwmon.c
drivers/hwmon/Kconfig +10 -0
@@ -246,6 +246,16 @@ config SENSORS_ADT7475 This driver can also be built as a module. If so, the module will be called adt7475. +config SENSORS_AS370 + tristate "Synaptics AS370 SoC hardware monitoring driver" + help + If you say yes here you get support for the PVT sensors of + the Synaptics AS370 SoC + + This driver can also be built as a module. If so, the module + will be called as370-hwmon. + + config SENSORS_ASC7621 tristate "Andigilog aSC7621" depends on I2C
drivers/hwmon/Makefile +1 -0
@@ -48,6 +48,7 @@ obj-$(CONFIG_SENSORS_ADT7475) += adt7475.o obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o obj-$(CONFIG_SENSORS_ARM_SCMI) += scmi-hwmon.o obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o +obj-$(CONFIG_SENSORS_AS370) += as370-hwmon.o obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o obj-$(CONFIG_SENSORS_ASPEED) += aspeed-pwm-tacho.o obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
drivers/hwmon/as370-hwmon.c new file +147 -0
147 lines not on this page · raw message
Signature · 1 line
2.23.0.rc1
Re: [PATCH v2 1/2] hwmon: Add Synaptics AS370 PVT sensor driver
Quoted 4 lines · Jisheng Zhang
Add a new driver for Synaptics AS370 PVT sensors. Currently, only temperature is supported.
Signed-off-by Jisheng Zhang <[email protected]>
For my reference:
(pending dt maintainer dreview for the bindings)
Quoted 193 lines
--- drivers/hwmon/Kconfig | 10 +++ drivers/hwmon/Makefile | 1 + drivers/hwmon/as370-hwmon.c | 147 ++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 drivers/hwmon/as370-hwmon.cdrivers/hwmon/Kconfig +10
-0@@ -246,6 +246,16 @@ config SENSORS_ADT7475 This driver can also be built as a module. If so, the module will be called adt7475. +config SENSORS_AS370 + tristate "Synaptics AS370 SoC hardware monitoring driver" + help + If you say yes here you get support for the PVT sensors of + the Synaptics AS370 SoC + + This driver can also be built as a module. If so, the module + will be called as370-hwmon. + + config SENSORS_ASC7621 tristate "Andigilog aSC7621" depends on I2Cdrivers/hwmon/Makefile +1
-0@@ -48,6 +48,7 @@ obj-$(CONFIG_SENSORS_ADT7475) += adt7475.o obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o obj-$(CONFIG_SENSORS_ARM_SCMI) += scmi-hwmon.o obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o +obj-$(CONFIG_SENSORS_AS370) += as370-hwmon.o obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o obj-$(CONFIG_SENSORS_ASPEED) += aspeed-pwm-tacho.o obj-$(CONFIG_SENSORS_ATXP1) += atxp1.odrivers/hwmon/as370-hwmon.c new file +147
-0@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Synaptics AS370 SoC Hardware Monitoring Driver +* +* Copyright (C) 2018 Synaptics Incorporated +* Author: Jisheng Zhang <[email protected]> +*/ + +#include <linux/bitops.h> +#include <linux/hwmon.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of_device.h> + +#define CTRL 0x0 +#define PD BIT(0) +#define EN BIT(1) +#define T_SEL BIT(2) +#define V_SEL BIT(3) +#define NMOS_SEL BIT(8) +#define PMOS_SEL BIT(9) +#define STS 0x4 +#define BN_MASK GENMASK(11, 0) +#define EOC BIT(12) + +struct as370_hwmon { +void __iomem *base; +}; + +static void init_pvt (struct as370_hwmon *hwmon) +{ +u32 val; +void __iomem *addr = hwmon->base +CTRL ; + + val =PD ; +writel_relaxed (val, addr); + val |=T_SEL ; +writel_relaxed (val, addr); + val |=EN ; +writel_relaxed (val, addr); + val &= ~PD ; +writel_relaxed (val, addr); +} + +static int as370_hwmon_read (struct device *dev,enum hwmon_sensor_types type, +u32 attr,int channel,long *temp) +{ +int val; +struct as370_hwmon *hwmon =dev_get_drvdata (dev); + +switch (attr) { +case hwmon_temp_input: + val =readl_relaxed (hwmon->base +STS ) &BN_MASK ; + *temp =DIV_ROUND_CLOSEST (val *251802 ,4096 ) -85525 ; +break ; +default : +return -EOPNOTSUPP ; + } + +return 0 ; +} + +static umode_t +as370_hwmon_is_visible (const void *data,enum hwmon_sensor_types type, +u32 attr,int channel) +{ +if (type != hwmon_temp) +return 0 ; + +switch (attr) { +case hwmon_temp_input: +return 0444 ; +default : +return 0 ; + } +} + +static const u32 as370_hwmon_temp_config[] = { +HWMON_T_INPUT , +0 +}; + +static const struct hwmon_channel_info as370_hwmon_temp = { + .type = hwmon_temp, + .config = as370_hwmon_temp_config, +}; + +static const struct hwmon_channel_info *as370_hwmon_info[] = { + &as370_hwmon_temp, +NULL +}; + +static const struct hwmon_ops as370_hwmon_ops = { + .is_visible = as370_hwmon_is_visible, + .read = as370_hwmon_read, +}; + +static const struct hwmon_chip_info as370_chip_info = { + .ops = &as370_hwmon_ops, + .info = as370_hwmon_info, +}; + +static int as370_hwmon_probe (struct platform_device *pdev) +{ +struct resource *res; +struct device *hwmon_dev; +struct as370_hwmon *hwmon; +struct device *dev = &pdev->dev; + + hwmon =devm_kzalloc (dev,sizeof (*hwmon),GFP_KERNEL ); +if (!hwmon) +return -ENOMEM ; + + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + hwmon->base =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (hwmon->base)) +return PTR_ERR (hwmon->base); + +init_pvt (hwmon); + + hwmon_dev =devm_hwmon_device_register_with_info (dev, +"as370" , + hwmon, + &as370_chip_info, +NULL ); +return PTR_ERR_OR_ZERO (hwmon_dev); +} + +static const struct of_device_id as370_hwmon_match[] = { + { .compatible ="syna,as370-hwmon" }, + {}, +}; +MODULE_DEVICE_TABLE (of, as370_hwmon_match); + +static struct platform_driver as370_hwmon_driver = { + .probe = as370_hwmon_probe, + .driver = { + .name ="as370-hwmon" , + .of_match_table = as370_hwmon_match, + }, +}; +module_platform_driver (as370_hwmon_driver); + +MODULE_AUTHOR ("Jisheng Zhang<[email protected]>" ); +MODULE_DESCRIPTION ("Synaptics AS370 SoC hardware monitor" ); +MODULE_LICENSE ("GPL v2" );
Re: [PATCH v2 1/2] hwmon: Add Synaptics AS370 PVT sensor driver
In reply to Jisheng ZhangQuoted 5 lines · Jisheng Zhang
Add a new driver for Synaptics AS370 PVT sensors. Currently, only temperature is supported.
Signed-off-by Jisheng Zhang <[email protected]>Reviewed-by Guenter Roeck <[email protected]>
Applied to hwmon-next.
Thanks,
Guenter
Quoted 193 lines
--- drivers/hwmon/Kconfig | 10 +++ drivers/hwmon/Makefile | 1 + drivers/hwmon/as370-hwmon.c | 147 ++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 drivers/hwmon/as370-hwmon.cdrivers/hwmon/Kconfig +10
-0@@ -246,6 +246,16 @@ config SENSORS_ADT7475 This driver can also be built as a module. If so, the module will be called adt7475. +config SENSORS_AS370 + tristate "Synaptics AS370 SoC hardware monitoring driver" + help + If you say yes here you get support for the PVT sensors of + the Synaptics AS370 SoC + + This driver can also be built as a module. If so, the module + will be called as370-hwmon. + + config SENSORS_ASC7621 tristate "Andigilog aSC7621" depends on I2Cdrivers/hwmon/Makefile +1
-0@@ -48,6 +48,7 @@ obj-$(CONFIG_SENSORS_ADT7475) += adt7475.o obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o obj-$(CONFIG_SENSORS_ARM_SCMI) += scmi-hwmon.o obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o +obj-$(CONFIG_SENSORS_AS370) += as370-hwmon.o obj-$(CONFIG_SENSORS_ASC7621) += asc7621.o obj-$(CONFIG_SENSORS_ASPEED) += aspeed-pwm-tacho.o obj-$(CONFIG_SENSORS_ATXP1) += atxp1.odrivers/hwmon/as370-hwmon.c new file +147
-0@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Synaptics AS370 SoC Hardware Monitoring Driver +* +* Copyright (C) 2018 Synaptics Incorporated +* Author: Jisheng Zhang <[email protected]> +*/ + +#include <linux/bitops.h> +#include <linux/hwmon.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of_device.h> + +#define CTRL 0x0 +#define PD BIT(0) +#define EN BIT(1) +#define T_SEL BIT(2) +#define V_SEL BIT(3) +#define NMOS_SEL BIT(8) +#define PMOS_SEL BIT(9) +#define STS 0x4 +#define BN_MASK GENMASK(11, 0) +#define EOC BIT(12) + +struct as370_hwmon { +void __iomem *base; +}; + +static void init_pvt (struct as370_hwmon *hwmon) +{ +u32 val; +void __iomem *addr = hwmon->base +CTRL ; + + val =PD ; +writel_relaxed (val, addr); + val |=T_SEL ; +writel_relaxed (val, addr); + val |=EN ; +writel_relaxed (val, addr); + val &= ~PD ; +writel_relaxed (val, addr); +} + +static int as370_hwmon_read (struct device *dev,enum hwmon_sensor_types type, +u32 attr,int channel,long *temp) +{ +int val; +struct as370_hwmon *hwmon =dev_get_drvdata (dev); + +switch (attr) { +case hwmon_temp_input: + val =readl_relaxed (hwmon->base +STS ) &BN_MASK ; + *temp =DIV_ROUND_CLOSEST (val *251802 ,4096 ) -85525 ; +break ; +default : +return -EOPNOTSUPP ; + } + +return 0 ; +} + +static umode_t +as370_hwmon_is_visible (const void *data,enum hwmon_sensor_types type, +u32 attr,int channel) +{ +if (type != hwmon_temp) +return 0 ; + +switch (attr) { +case hwmon_temp_input: +return 0444 ; +default : +return 0 ; + } +} + +static const u32 as370_hwmon_temp_config[] = { +HWMON_T_INPUT , +0 +}; + +static const struct hwmon_channel_info as370_hwmon_temp = { + .type = hwmon_temp, + .config = as370_hwmon_temp_config, +}; + +static const struct hwmon_channel_info *as370_hwmon_info[] = { + &as370_hwmon_temp, +NULL +}; + +static const struct hwmon_ops as370_hwmon_ops = { + .is_visible = as370_hwmon_is_visible, + .read = as370_hwmon_read, +}; + +static const struct hwmon_chip_info as370_chip_info = { + .ops = &as370_hwmon_ops, + .info = as370_hwmon_info, +}; + +static int as370_hwmon_probe (struct platform_device *pdev) +{ +struct resource *res; +struct device *hwmon_dev; +struct as370_hwmon *hwmon; +struct device *dev = &pdev->dev; + + hwmon =devm_kzalloc (dev,sizeof (*hwmon),GFP_KERNEL ); +if (!hwmon) +return -ENOMEM ; + + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + hwmon->base =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (hwmon->base)) +return PTR_ERR (hwmon->base); + +init_pvt (hwmon); + + hwmon_dev =devm_hwmon_device_register_with_info (dev, +"as370" , + hwmon, + &as370_chip_info, +NULL ); +return PTR_ERR_OR_ZERO (hwmon_dev); +} + +static const struct of_device_id as370_hwmon_match[] = { + { .compatible ="syna,as370-hwmon" }, + {}, +}; +MODULE_DEVICE_TABLE (of, as370_hwmon_match); + +static struct platform_driver as370_hwmon_driver = { + .probe = as370_hwmon_probe, + .driver = { + .name ="as370-hwmon" , + .of_match_table = as370_hwmon_match, + }, +}; +module_platform_driver (as370_hwmon_driver); + +MODULE_AUTHOR ("Jisheng Zhang<[email protected]>" ); +MODULE_DESCRIPTION ("Synaptics AS370 SoC hardware monitor" ); +MODULE_LICENSE ("GPL v2" );
PATCH v2 2/2 hwmon: (as370-hwmon) Add DT bindings for Synaptics AS370 PVT
In reply to Jisheng ZhangAdd device tree bindings for Synaptics AS370 PVT sensors.
--- Documentation/devicetree/bindings/hwmon/as370.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/as370.txt
Documentation/devicetree/bindings/hwmon/as370.txt new file +11 -0
@@ -0,0 +1,11 @@ +Bindings for Synaptics AS370 PVT sensors + +Required properties: +- compatible : "syna,as370-hwmon" +- reg : address and length of the register set. + +Example: + hwmon@ea0810 { + compatible = "syna,as370-hwmon"; + reg = <0xea0810 0xc>; + };
Signature · 1 line
2.23.0.rc1
Re: [PATCH v2 2/2] hwmon: (as370-hwmon) Add DT bindings for Synaptics AS370 PVT
Quoted 3 lines · Jisheng Zhang
Add device tree bindings for Synaptics AS370 PVT sensors.
Signed-off-by Jisheng Zhang <[email protected]>
For my reference:
... but we'll have to wait for DT maintainer review.
Quoted 22 lines
--- Documentation/devicetree/bindings/hwmon/as370.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/as370.txtDocumentation/devicetree/bindings/hwmon/as370.txt new file +11
-0@@ -0,0 +1,11 @@ +Bindings for Synaptics AS370 PVT sensors + +Required properties: +- compatible : "syna,as370-hwmon" +- reg : address and length of the register set. + +Example: + hwmon@ea0810 { + compatible = "syna,as370-hwmon"; + reg = <0xea0810 0xc>; + };
Re: [PATCH v2 2/2] hwmon: (as370-hwmon) Add DT bindings for Synaptics AS370 PVT
In reply to Jisheng ZhangQuoted 8 lines · Jisheng Zhang
Add device tree bindings for Synaptics AS370 PVT sensors.
Signed-off-by Jisheng Zhang <[email protected]>--- Documentation/devicetree/bindings/hwmon/as370.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/as370.txt
Re: [PATCH v2 2/2] hwmon: (as370-hwmon) Add DT bindings for Synaptics AS370 PVT
In reply to Jisheng ZhangQuoted 5 lines · Jisheng Zhang
Add device tree bindings for Synaptics AS370 PVT sensors.
Signed-off-by Jisheng Zhang <[email protected]>Reviewed-by Guenter Roeck <[email protected]>Reviewed-by Rob Herring <[email protected]>
Applied to hwmon-next.
Thanks,
Guenter
Quoted 22 lines
--- Documentation/devicetree/bindings/hwmon/as370.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Documentation/devicetree/bindings/hwmon/as370.txtDocumentation/devicetree/bindings/hwmon/as370.txt new file +11
-0@@ -0,0 +1,11 @@ +Bindings for Synaptics AS370 PVT sensors + +Required properties: +- compatible : "syna,as370-hwmon" +- reg : address and length of the register set. + +Example: + hwmon@ea0810 { + compatible = "syna,as370-hwmon"; + reg = <0xea0810 0xc>; + };