public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] hwmon: (nct7802) Add autopoint attributes
@ 2015-07-08 22:49 Constantine Shulyupin
  2015-07-09 21:30 ` Guenter Roeck
  0 siblings, 1 reply; 3+ messages in thread
From: Constantine Shulyupin @ 2015-07-08 22:49 UTC (permalink / raw)
  To: Jean Delvare, Guenter Roeck, open list:HARDWARE MONITORING,
	open list
  Cc: Constantine Shulyupin

Introduced PWM_REG, TEMP_REG, auto_pointX_temp, auto_pointX_pwm,
nct7802_auto_point_attrs, nct7802_auto_point_group.

Signed-off-by: Constantine Shulyupin <const@MakeLinux.com>
---
 drivers/hwmon/nct7802.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c
index 2f6bbe5..a3f3063 100644
--- a/drivers/hwmon/nct7802.c
+++ b/drivers/hwmon/nct7802.c
@@ -153,6 +153,10 @@ static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
 	return err ? : count;
 }
 
+#define PWM_REG(_name, _reg) \
+	SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, \
+				  show_pwm, store_pwm, _reg)
+
 static ssize_t show_pwm_enable(struct device *dev,
 			       struct device_attribute *attr, char *buf)
 {
@@ -404,6 +408,10 @@ static ssize_t store_temp(struct device *dev, struct device_attribute *attr,
 	return err ? : count;
 }
 
+#define TEMP_REG(_name, _high, _low) \
+	SENSOR_DEVICE_ATTR_2(_name, S_IRUGO | S_IWUSR, \
+				    show_temp, store_temp, _high, _low)
+
 static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
 			char *buf)
 {
@@ -890,11 +898,44 @@ static struct attribute_group nct7802_pwm_group = {
 	.attrs = nct7802_pwm_attrs,
 };
 
+/* 7.2.115... 0x80-0x83, 0x84 Temperature (X-axis) transition */
+static TEMP_REG(auto_point1_temp, 0x80, 0);
+static TEMP_REG(auto_point2_temp, 0x81, 0);
+static TEMP_REG(auto_point3_temp, 0x82, 0);
+static TEMP_REG(auto_point4_temp, 0x83, 0);
+static TEMP_REG(auto_point_crit_temp, 0x84, 0);
+
+/* 7.2.120... 0x85-0x88 PWM (Y-axis) transition */
+static PWM_REG(auto_point1_pwm, 0x85);
+static PWM_REG(auto_point2_pwm, 0x86);
+static PWM_REG(auto_point3_pwm, 0x87);
+static PWM_REG(auto_point4_pwm, 0x88);
+
+static struct attribute *nct7802_auto_point_attrs[] = {
+	&sensor_dev_attr_auto_point1_temp.dev_attr.attr,
+	&sensor_dev_attr_auto_point2_temp.dev_attr.attr,
+	&sensor_dev_attr_auto_point3_temp.dev_attr.attr,
+	&sensor_dev_attr_auto_point4_temp.dev_attr.attr,
+	&sensor_dev_attr_auto_point_crit_temp.dev_attr.attr,
+
+	&sensor_dev_attr_auto_point1_pwm.dev_attr.attr,
+	&sensor_dev_attr_auto_point2_pwm.dev_attr.attr,
+	&sensor_dev_attr_auto_point3_pwm.dev_attr.attr,
+	&sensor_dev_attr_auto_point4_pwm.dev_attr.attr,
+
+	NULL
+};
+
+static struct attribute_group nct7802_auto_point_group = {
+	.attrs = nct7802_auto_point_attrs,
+};
+
 static const struct attribute_group *nct7802_groups[] = {
 	&nct7802_temp_group,
 	&nct7802_in_group,
 	&nct7802_fan_group,
 	&nct7802_pwm_group,
+	&nct7802_auto_point_group,
 	NULL
 };
 
-- 
1.9.1


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

* Re: [PATCH] hwmon: (nct7802) Add autopoint attributes
  2015-07-08 22:49 Constantine Shulyupin
@ 2015-07-09 21:30 ` Guenter Roeck
  0 siblings, 0 replies; 3+ messages in thread
From: Guenter Roeck @ 2015-07-09 21:30 UTC (permalink / raw)
  To: Constantine Shulyupin
  Cc: Jean Delvare, open list:HARDWARE MONITORING, open list

Hi Constantine,

On Thu, Jul 09, 2015 at 01:49:08AM +0300, Constantine Shulyupin wrote:
> Introduced PWM_REG, TEMP_REG, auto_pointX_temp, auto_pointX_pwm,
> nct7802_auto_point_attrs, nct7802_auto_point_group.
> 
> Signed-off-by: Constantine Shulyupin <const@MakeLinux.com>
> ---
>  drivers/hwmon/nct7802.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c
> index 2f6bbe5..a3f3063 100644
> --- a/drivers/hwmon/nct7802.c
> +++ b/drivers/hwmon/nct7802.c
> @@ -153,6 +153,10 @@ static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr,
>  	return err ? : count;
>  }
>  
> +#define PWM_REG(_name, _reg) \
> +	SENSOR_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, \
> +				  show_pwm, store_pwm, _reg)
> +
>  static ssize_t show_pwm_enable(struct device *dev,
>  			       struct device_attribute *attr, char *buf)
>  {
> @@ -404,6 +408,10 @@ static ssize_t store_temp(struct device *dev, struct device_attribute *attr,
>  	return err ? : count;
>  }
>  
> +#define TEMP_REG(_name, _high, _low) \
> +	SENSOR_DEVICE_ATTR_2(_name, S_IRUGO | S_IWUSR, \
> +				    show_temp, store_temp, _high, _low)
> +

Please drop those macros and use SENSOR_DEVICE_ATTR.. directly.

>  static ssize_t show_fan(struct device *dev, struct device_attribute *attr,
>  			char *buf)
>  {
> @@ -890,11 +898,44 @@ static struct attribute_group nct7802_pwm_group = {
>  	.attrs = nct7802_pwm_attrs,
>  };
>  
> +/* 7.2.115... 0x80-0x83, 0x84 Temperature (X-axis) transition */
> +static TEMP_REG(auto_point1_temp, 0x80, 0);
> +static TEMP_REG(auto_point2_temp, 0x81, 0);
> +static TEMP_REG(auto_point3_temp, 0x82, 0);
> +static TEMP_REG(auto_point4_temp, 0x83, 0);
> +static TEMP_REG(auto_point_crit_temp, 0x84, 0);

I am not really happy with the crit_temp attribute.
Usually we have just gave this another index, ie point5_temp.

Your code is missing the other two tables at register addresses 0x90+
and 0xa0+. Any reason for not including those ?

It might be better to use the attribute names we have used in other
drivers, ie pwm[123]_auto_point[1-5]_pwm and pwm[1-3]_auto_point[1-5]_temp
and support the other two tables as well. One option for the critical
pwm value might be to make it read-only and always report it as 255
for consistency.

Thanks,
Guenter

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

* [PATCH] hwmon: (nct7802) Add autopoint attributes
@ 2015-07-11 16:42 Constantine Shulyupin
  0 siblings, 0 replies; 3+ messages in thread
From: Constantine Shulyupin @ 2015-07-11 16:42 UTC (permalink / raw)
  To: Jean Delvare, Guenter Roeck, open list:HARDWARE MONITORING,
	open list
  Cc: Constantine Shulyupin

Introduced pwm[1..3]_auto_point[1..5]_temp, pwm[1..3]_auto_point[1..5]_pwm,
nct7802_auto_point_attrs, nct7802_auto_point_group.
nct7802_auto_point_is_visible,

---

Changed in v2:
- Removed PWM_REG, TEMP_REG
- auto_point[1..4]_temp, auto_point[1..4]_pwm and auto_point_crit_temp
expanded and replaced with pwm[1..3]_auto_point[1..5]_temp
and pwm[1..3]_auto_point[1..5]_pwm.
- Introduced nct7802_auto_point_is_visible
- added used sysfs_update_group in store_pwm_enable

Signed-off-by: Constantine Shulyupin <const@MakeLinux.com>
---
 drivers/hwmon/nct7802.c | 179 +++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 162 insertions(+), 17 deletions(-)

diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c
index 2f6bbe5..e1bc7a6 100644
--- a/drivers/hwmon/nct7802.c
+++ b/drivers/hwmon/nct7802.c
@@ -130,6 +130,9 @@ static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
 	unsigned int val;
 	int ret;
 
+	if (!attr->index)
+		return sprintf(buf, "255\n");
+
 	ret = regmap_read(data->regmap, attr->index, &val);
 	if (ret < 0)
 		return ret;
@@ -170,23 +173,7 @@ static ssize_t show_pwm_enable(struct device *dev,
 
 static ssize_t store_pwm_enable(struct device *dev,
 				struct device_attribute *attr,
-				const char *buf, size_t count)
-{
-	struct nct7802_data *data = dev_get_drvdata(dev);
-	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
-	u8 val;
-	int ret;
-
-	ret = kstrtou8(buf, 0, &val);
-	if (ret < 0)
-		return ret;
-	if (val < 1 || val > 2)
-		return -EINVAL;
-	ret = regmap_update_bits(data->regmap, REG_SMARTFAN_EN(sattr->index),
-				 1 << SMARTFAN_EN_SHIFT(sattr->index),
-				 (val - 1) << SMARTFAN_EN_SHIFT(sattr->index));
-	return ret ? : count;
-}
+				const char *buf, size_t count);
 
 static int nct7802_read_temp(struct nct7802_data *data,
 			     u8 reg_temp, u8 reg_temp_low, int *temp)
@@ -890,11 +877,169 @@ static struct attribute_group nct7802_pwm_group = {
 	.attrs = nct7802_pwm_attrs,
 };
 
+/* 7.2.115... 0x80-0x83, 0x84 Temperature (X-axis) transition */
+static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x80, 0);
+static SENSOR_DEVICE_ATTR_2(pwm1_auto_point2_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x81, 0);
+static SENSOR_DEVICE_ATTR_2(pwm1_auto_point3_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x82, 0);
+static SENSOR_DEVICE_ATTR_2(pwm1_auto_point4_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x83, 0);
+static SENSOR_DEVICE_ATTR_2(pwm1_auto_point5_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x84, 0);
+
+/* 7.2.120... 0x85-0x88 PWM (Y-axis) transition */
+static SENSOR_DEVICE_ATTR(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x85);
+static SENSOR_DEVICE_ATTR(pwm1_auto_point2_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x86);
+static SENSOR_DEVICE_ATTR(pwm1_auto_point3_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x87);
+static SENSOR_DEVICE_ATTR(pwm1_auto_point4_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x88);
+static SENSOR_DEVICE_ATTR(pwm1_auto_point5_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, NULL, 0);
+
+/* 7.2.124 Table 2 X-axis Transition Point 1 Register */
+static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x90, 0);
+static SENSOR_DEVICE_ATTR_2(pwm2_auto_point2_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x91, 0);
+static SENSOR_DEVICE_ATTR_2(pwm2_auto_point3_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x92, 0);
+static SENSOR_DEVICE_ATTR_2(pwm2_auto_point4_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x93, 0);
+static SENSOR_DEVICE_ATTR_2(pwm2_auto_point5_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0x94, 0);
+
+/* 7.2.129 Table 2 Y-axis Transition Point 1 Register */
+static SENSOR_DEVICE_ATTR(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x95);
+static SENSOR_DEVICE_ATTR(pwm2_auto_point2_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x96);
+static SENSOR_DEVICE_ATTR(pwm2_auto_point3_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x97);
+static SENSOR_DEVICE_ATTR(pwm2_auto_point4_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0x98);
+static SENSOR_DEVICE_ATTR(pwm2_auto_point5_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, NULL, 0);
+
+/* 7.2.133 Table 3 X-axis Transition Point 1 Register */
+static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0xA0, 0);
+static SENSOR_DEVICE_ATTR_2(pwm3_auto_point2_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0xA1, 0);
+static SENSOR_DEVICE_ATTR_2(pwm3_auto_point3_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0xA2, 0);
+static SENSOR_DEVICE_ATTR_2(pwm3_auto_point4_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0xA3, 0);
+static SENSOR_DEVICE_ATTR_2(pwm3_auto_point5_temp, S_IRUGO | S_IWUSR,
+			    show_temp, store_temp, 0xA4, 0);
+
+/* 7.2.138 Table 3 Y-axis Transition Point 1 Register */
+static SENSOR_DEVICE_ATTR(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0xA5);
+static SENSOR_DEVICE_ATTR(pwm3_auto_point2_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0xA6);
+static SENSOR_DEVICE_ATTR(pwm3_auto_point3_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0xA7);
+static SENSOR_DEVICE_ATTR(pwm3_auto_point4_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, store_pwm, 0xA8);
+static SENSOR_DEVICE_ATTR(pwm3_auto_point5_pwm, S_IRUGO | S_IWUSR,
+			  show_pwm, NULL, 0);
+
+
+static struct attribute *nct7802_auto_point_attrs[] = {
+	&sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point5_temp.dev_attr.attr,
+
+	&sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm1_auto_point5_pwm.dev_attr.attr,
+
+	&sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point5_temp.dev_attr.attr,
+
+	&sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm2_auto_point5_pwm.dev_attr.attr,
+
+	&sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point5_temp.dev_attr.attr,
+
+	&sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
+	&sensor_dev_attr_pwm3_auto_point5_pwm.dev_attr.attr,
+
+	NULL
+};
+
+static umode_t nct7802_auto_point_is_visible(struct kobject *kobj,
+					     struct attribute *attr, int index)
+{
+	struct device *dev = container_of(kobj, struct device, kobj);
+	struct nct7802_data *data = dev_get_drvdata(dev);
+	unsigned int reg, enabled;
+	int ret;
+
+	ret = regmap_read(data->regmap, REG_SMARTFAN_EN(index / 10), &reg);
+	if (ret < 0)
+		return 0;
+
+	enabled = reg >> SMARTFAN_EN_SHIFT(index / 10) & 1;
+
+	return enabled ? attr->mode : 0;
+}
+
+static struct attribute_group nct7802_auto_point_group = {
+	.attrs = nct7802_auto_point_attrs,
+	.is_visible = nct7802_auto_point_is_visible,
+};
+
+static ssize_t store_pwm_enable(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t count)
+{
+	struct nct7802_data *data = dev_get_drvdata(dev);
+	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
+	u8 val;
+	int ret;
+
+	ret = kstrtou8(buf, 0, &val);
+	if (ret < 0)
+		return ret;
+	if (val < 1 || val > 2)
+		return -EINVAL;
+	ret = regmap_update_bits(data->regmap, REG_SMARTFAN_EN(sattr->index),
+				 1 << SMARTFAN_EN_SHIFT(sattr->index),
+				 (val - 1) << SMARTFAN_EN_SHIFT(sattr->index));
+
+	sysfs_update_group(&dev->kobj, &nct7802_auto_point_group);
+	return ret ? : count;
+}
+
 static const struct attribute_group *nct7802_groups[] = {
 	&nct7802_temp_group,
 	&nct7802_in_group,
 	&nct7802_fan_group,
 	&nct7802_pwm_group,
+	&nct7802_auto_point_group,
 	NULL
 };
 
-- 
1.9.1


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

end of thread, other threads:[~2015-07-11 16:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-11 16:42 [PATCH] hwmon: (nct7802) Add autopoint attributes Constantine Shulyupin
  -- strict thread matches above, loose matches on Subject: below --
2015-07-08 22:49 Constantine Shulyupin
2015-07-09 21:30 ` Guenter Roeck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox