Re: [RFC 0/3] drivers/hwmon/pmbus: Use STATUS_WORD and add status sensors

2017-08-07 Thread Guenter Roeck

On 08/07/2017 08:25 PM, Eddie James wrote:

From: "Edward A. James" 

Hi Guenter,

I'm looking for some feedback for some extensions to the pmbus core. We're
looking for some additional functionality, particularly with STATUS_WORD and
obtaining raw status data.

The first two patches enable the use of the STATUS_WORD register in the pmbus
core. This allows the use of more default alarm/fault attributes for default
pmbus sensors by allowing the use of the higher byte status bits.

The third patch adds "status" attributes to each class of hwmon sensor created
by pmbus. For example, in1_status and temp1_status. These will display the
associated raw status register (e.g. STATUS_INPUT and STATUS_TEMPERATURE). I
realize this is not really "normal" for hwmon or pmbus. These are potentially
very useful in hardware diagnostic situations where it might be impossible
to tell the origin of a failure from a simple alarm or fault bit set. We really
want to access the status registers, and for a multi-page pmbus device, this is
pretty tricky from userspace.

Please let me know your thoughts,
Thanks,


I don't mind providing such data with debugfs, for example, but I don't see
the point in providing it as part of the ABI. Which, in part, since it requires
a lot of thought on my side, is part of the reason why I didn't provide
feedback to your earlier patches yet. Sorry, I've been exceptionally busy
lately, and non-standard requests tend to end up at the end of the queue :-(.

Any reason why debugfs is not sufficient and/or acceptable for your use case ?
You _are_ talking about diagnostic situations, which seems to be an exact fit
for debugfs.

Guenter



Edward A. James (3):
   drivers/hwmon/pmbus: Access word data for STATUS_WORD and use it by
 default
   drivers/hmwon/pmbus: store STATUS_WORD in status registers
   drivers/hwmon/pmbus: Add sensor status to pmbus attributes

  drivers/hwmon/pmbus/pmbus_core.c | 153 +--
  1 file changed, 130 insertions(+), 23 deletions(-)



--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC 2/3] drivers/hmwon/pmbus: store STATUS_WORD in status registers

2017-08-07 Thread Eddie James
From: "Edward A. James" 

Higher byte of the status register wasn't available for boolean alarms.
Store the STATUS_WORD register if it's available, and read it out when
queried by boolean attributes.

The method of storing and retrieving the status reg is a bit hacky but
I couldn't work out another way without doubling the storage requirement
of every pmbus device or tearing up more of the pmbus core code.

Signed-off-by: Edward A. James 
---
 drivers/hwmon/pmbus/pmbus_core.c | 37 +++--
 1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index 8511aba..3b53fa7 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -43,7 +43,7 @@
  * Index into status register array, per status register group
  */
 #define PB_STATUS_BASE 0
-#define PB_STATUS_VOUT_BASE(PB_STATUS_BASE + PMBUS_PAGES)
+#define PB_STATUS_VOUT_BASE(PB_STATUS_BASE + (PMBUS_PAGES * 2))
 #define PB_STATUS_IOUT_BASE(PB_STATUS_VOUT_BASE + PMBUS_PAGES)
 #define PB_STATUS_FAN_BASE (PB_STATUS_IOUT_BASE + PMBUS_PAGES)
 #define PB_STATUS_FAN34_BASE   (PB_STATUS_FAN_BASE + PMBUS_PAGES)
@@ -421,11 +421,14 @@ static struct pmbus_data *pmbus_update_device(struct 
device *dev)
 
mutex_lock(>update_lock);
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
-   int i, j;
+   int i, j, status;
 
for (i = 0; i < info->pages; i++) {
-   data->status[PB_STATUS_BASE + i] =
-   data->read_status(client, i);
+   status = data->read_status(client, i);
+   data->status[PB_STATUS_BASE + (i * 2)] = status;
+   data->status[PB_STATUS_BASE + (i * 2) + 1] =
+   status >> 8;
+
for (j = 0; j < ARRAY_SIZE(pmbus_status); j++) {
struct _pmbus_status *s = _status[j];
 
@@ -718,6 +721,18 @@ static u16 pmbus_data2reg(struct pmbus_data *data,
return regval;
 }
 
+static int pmbus_get_status(struct pmbus_data *data, int reg)
+{
+   int ret;
+
+   if (reg < PB_STATUS_BASE + PMBUS_PAGES)
+   ret = data->status[reg * 2] | (data->status[(reg * 2) + 1] << 
8);
+   else
+   ret = data->status[reg];
+
+   return ret;
+}
+
 /*
  * Return boolean calculated from converted data.
  *  defines a status register index and mask.
@@ -746,12 +761,12 @@ static int pmbus_get_boolean(struct pmbus_data *data, 
struct pmbus_boolean *b,
 {
struct pmbus_sensor *s1 = b->s1;
struct pmbus_sensor *s2 = b->s2;
-   u16 reg = (index >> 8) & 0x;
-   u8 mask = index & 0xff;
+   u16 reg = index >> 16;
+   u16 mask = index & 0x;
int ret, status;
u8 regval;
 
-   status = data->status[reg];
+   status = pmbus_get_status(data, reg);
if (status < 0)
return status;
 
@@ -890,7 +905,7 @@ static int pmbus_add_boolean(struct pmbus_data *data,
 const char *name, const char *type, int seq,
 struct pmbus_sensor *s1,
 struct pmbus_sensor *s2,
-u16 reg, u8 mask)
+u16 reg, u16 mask)
 {
struct pmbus_boolean *boolean;
struct sensor_device_attribute *a;
@@ -906,7 +921,7 @@ static int pmbus_add_boolean(struct pmbus_data *data,
boolean->s1 = s1;
boolean->s2 = s2;
pmbus_attr_init(a, boolean->name, S_IRUGO, pmbus_show_boolean, NULL,
-   (reg << 8) | mask);
+   (reg << 16) | mask);
 
return pmbus_add_attribute(data, >dev_attr.attr);
 }
@@ -992,7 +1007,7 @@ struct pmbus_limit_attr {
  */
 struct pmbus_sensor_attr {
u16 reg;/* sensor register */
-   u8 gbit;/* generic status bit */
+   u16 gbit;   /* generic status bit */
u8 nlimit;  /* # of limit registers */
enum pmbus_sensor_classes class;/* sensor class */
const char *label;  /* sensor label */
@@ -1337,6 +1352,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client 
*client,
.func = PMBUS_HAVE_IIN,
.sfunc = PMBUS_HAVE_STATUS_INPUT,
.sbase = PB_STATUS_INPUT_BASE,
+   .gbit = PB_STATUS_INPUT,
.limit = iin_limit_attrs,
.nlimit = ARRAY_SIZE(iin_limit_attrs),
}, {
@@ -1421,6 +1437,7 @@ static int pmbus_add_sensor_attrs(struct i2c_client 
*client,
.func = PMBUS_HAVE_PIN,
.sfunc = PMBUS_HAVE_STATUS_INPUT,
.sbase = PB_STATUS_INPUT_BASE,
+   .gbit = PB_STATUS_INPUT,
 

[RFC 0/3] drivers/hwmon/pmbus: Use STATUS_WORD and add status sensors

2017-08-07 Thread Eddie James
From: "Edward A. James" 

Hi Guenter,

I'm looking for some feedback for some extensions to the pmbus core. We're
looking for some additional functionality, particularly with STATUS_WORD and
obtaining raw status data.

The first two patches enable the use of the STATUS_WORD register in the pmbus
core. This allows the use of more default alarm/fault attributes for default
pmbus sensors by allowing the use of the higher byte status bits.

The third patch adds "status" attributes to each class of hwmon sensor created
by pmbus. For example, in1_status and temp1_status. These will display the
associated raw status register (e.g. STATUS_INPUT and STATUS_TEMPERATURE). I
realize this is not really "normal" for hwmon or pmbus. These are potentially
very useful in hardware diagnostic situations where it might be impossible
to tell the origin of a failure from a simple alarm or fault bit set. We really
want to access the status registers, and for a multi-page pmbus device, this is
pretty tricky from userspace.

Please let me know your thoughts,
Thanks,

Edward A. James (3):
  drivers/hwmon/pmbus: Access word data for STATUS_WORD and use it by
default
  drivers/hmwon/pmbus: store STATUS_WORD in status registers
  drivers/hwmon/pmbus: Add sensor status to pmbus attributes

 drivers/hwmon/pmbus/pmbus_core.c | 153 +--
 1 file changed, 130 insertions(+), 23 deletions(-)

-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC 1/3] drivers/hwmon/pmbus: Access word data for STATUS_WORD and use it by default

2017-08-07 Thread Eddie James
From: "Edward A. James" 

Pmbus core always reads byte data from the status register, even if
configured to use STATUS_WORD. Use a function pointer so we always do
either byte or word access depending on which register we're trying to
access. Also switch to use STATUS_WORD by default.

Signed-off-by: Edward A. James 
---
 drivers/hwmon/pmbus/pmbus_core.c | 69 +++-
 1 file changed, 54 insertions(+), 15 deletions(-)

diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index f1eff6b..8511aba 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -113,7 +113,8 @@ struct pmbus_data {
 * so we keep them all together.
 */
u8 status[PB_NUM_STATUS_REG];
-   u8 status_register;
+
+   int (*read_status)(struct i2c_client *client, int page);
 
u8 currpage;
 };
@@ -324,7 +325,7 @@ static int pmbus_check_status_cml(struct i2c_client *client)
struct pmbus_data *data = i2c_get_clientdata(client);
int status, status2;
 
-   status = _pmbus_read_byte_data(client, -1, data->status_register);
+   status = data->read_status(client, -1);
if (status < 0 || (status & PB_STATUS_CML)) {
status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML);
if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND))
@@ -348,6 +349,36 @@ static bool pmbus_check_register(struct i2c_client *client,
return rv >= 0;
 }
 
+/* Check specified page status register accessibility. Need a separate
+ * function rather than the two above so we can use the correct status
+ * register, and we can optimize out the second status register read.
+ */
+static bool pmbus_check_status_register(struct i2c_client *client, int page)
+{
+   int status, rc = 0;
+   struct pmbus_data *data = i2c_get_clientdata(client);
+
+   status = data->read_status(client, page);
+   if (status < 0)
+   goto out;
+
+   if (!(data->flags & PMBUS_SKIP_STATUS_CHECK)) {
+   if (status & PB_STATUS_CML) {
+   status = _pmbus_read_byte_data(client, -1,
+  PMBUS_STATUS_CML);
+   if (status < 0 ||
+   (status & PB_CML_FAULT_INVALID_COMMAND))
+   goto out;
+   }
+   }
+
+   rc = 1;
+
+out:
+   pmbus_clear_fault_page(client, -1);
+   return rc;
+}
+
 bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)
 {
return pmbus_check_register(client, _pmbus_read_byte_data, page, reg);
@@ -393,9 +424,8 @@ static struct pmbus_data *pmbus_update_device(struct device 
*dev)
int i, j;
 
for (i = 0; i < info->pages; i++) {
-   data->status[PB_STATUS_BASE + i]
-   = _pmbus_read_byte_data(client, i,
-   data->status_register);
+   data->status[PB_STATUS_BASE + i] =
+   data->read_status(client, i);
for (j = 0; j < ARRAY_SIZE(pmbus_status); j++) {
struct _pmbus_status *s = _status[j];
 
@@ -1051,8 +1081,7 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client 
*client,
 * the generic status register for this page is accessible.
 */
if (!ret && attr->gbit &&
-   pmbus_check_byte_register(client, page,
- data->status_register)) {
+   pmbus_check_status_register(client, page)) {
ret = pmbus_add_boolean(data, name, "alarm", index,
NULL, NULL,
PB_STATUS_BASE + page,
@@ -1729,6 +1758,16 @@ static int pmbus_identify_common(struct i2c_client 
*client,
return 0;
 }
 
+static int pmbus_read_status_word(struct i2c_client *client, int page)
+{
+   return _pmbus_read_word_data(client, page, PMBUS_STATUS_WORD);
+}
+
+static int pmbus_read_status_byte(struct i2c_client *client, int page)
+{
+   return _pmbus_read_byte_data(client, page, PMBUS_STATUS_BYTE);
+}
+
 static int pmbus_init_common(struct i2c_client *client, struct pmbus_data 
*data,
 struct pmbus_driver_info *info)
 {
@@ -1736,16 +1775,16 @@ static int pmbus_init_common(struct i2c_client *client, 
struct pmbus_data *data,
int page, ret;
 
/*
-* Some PMBus chips don't support PMBUS_STATUS_BYTE, so try
-* to use PMBUS_STATUS_WORD instead if that is the case.
+* Some PMBus chips don't support PMBUS_STATUS_WORD, so try
+* to use PMBUS_STATUS_BYTE instead if that is the case.
 * Bail out if both registers are not 

Re: [PATCH v2 16/18] hwmon: add support for sensors exported via ARM SCMI

2017-08-07 Thread Sudeep Holla


On 04/08/17 20:32, Guenter Roeck wrote:
> On Fri, Aug 04, 2017 at 03:31:42PM +0100, Sudeep Holla wrote:

[...]

>> +platform_set_drvdata(pdev, scmi_sensors);
>> +
>> +hwdev = devm_hwmon_device_register_with_groups(dev, "scmi_sensors",
>> +   scmi_sensors,
>> +   scmi_sensors->groups);
> 
> Can you rework this to use devm_hwmon_device_register_with_info(),
> and if possible let it handle the thermal registration ? 
> 

Thanks for the pointers. I will check on the possibility and use it if
possible.

-- 
Regards,
Sudeep
--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2] hwmon: adt7475: constify attribute_group structures

2017-08-07 Thread Arvind Yadav
attribute_group are not supposed to change at runtime. All functions
working with attribute_group provided by  work with
const attribute_group. So mark the non-const structs as const.

Signed-off-by: Arvind Yadav 
---
change in v2:
subject was not correct. Removed 'wusbhc' and '.'.

 drivers/hwmon/adt7475.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 1baa213..9ef8499 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -1319,14 +1319,14 @@ static SENSOR_DEVICE_ATTR_2(pwm3_stall_disable, S_IRUGO 
| S_IWUSR,
NULL
 };
 
-static struct attribute_group adt7475_attr_group = { .attrs = adt7475_attrs };
-static struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
-static struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
-static struct attribute_group in0_attr_group = { .attrs = in0_attrs };
-static struct attribute_group in3_attr_group = { .attrs = in3_attrs };
-static struct attribute_group in4_attr_group = { .attrs = in4_attrs };
-static struct attribute_group in5_attr_group = { .attrs = in5_attrs };
-static struct attribute_group vid_attr_group = { .attrs = vid_attrs };
+static const struct attribute_group adt7475_attr_group = { .attrs = 
adt7475_attrs };
+static const struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
+static const struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
+static const struct attribute_group in0_attr_group = { .attrs = in0_attrs };
+static const struct attribute_group in3_attr_group = { .attrs = in3_attrs };
+static const struct attribute_group in4_attr_group = { .attrs = in4_attrs };
+static const struct attribute_group in5_attr_group = { .attrs = in5_attrs };
+static const struct attribute_group vid_attr_group = { .attrs = vid_attrs };
 
 static int adt7475_detect(struct i2c_client *client,
  struct i2c_board_info *info)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] hwmon: adt7475: wusbhc: constify attribute_group structures.

2017-08-07 Thread Arvind Yadav

Hi,


On Monday 07 August 2017 02:55 PM, Jean Delvare wrote:

Hi Arvind,

On lun., 2017-08-07 at 11:49 +0530, Arvind Yadav wrote:

attribute_group are not supposed to change at runtime. All functions
working with attribute_group provided by  work with
const attribute_group. So mark the non-const structs as const.

Confused by the subject. What is "wusbhc:"?

Also please avoid trailing dot in mail subjects.

Thanks for review, I will update.

Signed-off-by: Arvind Yadav 
---
  drivers/hwmon/adt7475.c | 16 
  1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 1baa213..9ef8499 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -1319,14 +1319,14 @@ static SENSOR_DEVICE_ATTR_2(pwm3_stall_disable, S_IRUGO 
| S_IWUSR,
NULL
  };
  
-static struct attribute_group adt7475_attr_group = { .attrs = adt7475_attrs };

-static struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
-static struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
-static struct attribute_group in0_attr_group = { .attrs = in0_attrs };
-static struct attribute_group in3_attr_group = { .attrs = in3_attrs };
-static struct attribute_group in4_attr_group = { .attrs = in4_attrs };
-static struct attribute_group in5_attr_group = { .attrs = in5_attrs };
-static struct attribute_group vid_attr_group = { .attrs = vid_attrs };
+static const struct attribute_group adt7475_attr_group = { .attrs = 
adt7475_attrs };
+static const struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
+static const struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
+static const struct attribute_group in0_attr_group = { .attrs = in0_attrs };
+static const struct attribute_group in3_attr_group = { .attrs = in3_attrs };
+static const struct attribute_group in4_attr_group = { .attrs = in4_attrs };
+static const struct attribute_group in5_attr_group = { .attrs = in5_attrs };
+static const struct attribute_group vid_attr_group = { .attrs = vid_attrs };
  
  static int adt7475_detect(struct i2c_client *client,

  struct i2c_board_info *info)

Looks good to me.

Reviewed-by: Jean Delvare 


~arvind
--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] hwmon: adt7475: wusbhc: constify attribute_group structures.

2017-08-07 Thread Jean Delvare
Hi Arvind,

On lun., 2017-08-07 at 11:49 +0530, Arvind Yadav wrote:
> attribute_group are not supposed to change at runtime. All functions
> working with attribute_group provided by  work with
> const attribute_group. So mark the non-const structs as const.

Confused by the subject. What is "wusbhc:"?

Also please avoid trailing dot in mail subjects.

> Signed-off-by: Arvind Yadav 
> ---
>  drivers/hwmon/adt7475.c | 16 
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
> index 1baa213..9ef8499 100644
> --- a/drivers/hwmon/adt7475.c
> +++ b/drivers/hwmon/adt7475.c
> @@ -1319,14 +1319,14 @@ static SENSOR_DEVICE_ATTR_2(pwm3_stall_disable, 
> S_IRUGO | S_IWUSR,
>   NULL
>  };
>  
> -static struct attribute_group adt7475_attr_group = { .attrs = adt7475_attrs 
> };
> -static struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
> -static struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
> -static struct attribute_group in0_attr_group = { .attrs = in0_attrs };
> -static struct attribute_group in3_attr_group = { .attrs = in3_attrs };
> -static struct attribute_group in4_attr_group = { .attrs = in4_attrs };
> -static struct attribute_group in5_attr_group = { .attrs = in5_attrs };
> -static struct attribute_group vid_attr_group = { .attrs = vid_attrs };
> +static const struct attribute_group adt7475_attr_group = { .attrs = 
> adt7475_attrs };
> +static const struct attribute_group fan4_attr_group = { .attrs = fan4_attrs 
> };
> +static const struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs 
> };
> +static const struct attribute_group in0_attr_group = { .attrs = in0_attrs };
> +static const struct attribute_group in3_attr_group = { .attrs = in3_attrs };
> +static const struct attribute_group in4_attr_group = { .attrs = in4_attrs };
> +static const struct attribute_group in5_attr_group = { .attrs = in5_attrs };
> +static const struct attribute_group vid_attr_group = { .attrs = vid_attrs };
>  
>  static int adt7475_detect(struct i2c_client *client,
> struct i2c_board_info *info)

Looks good to me.

Reviewed-by: Jean Delvare 

-- 
Jean Delvare
SUSE L3 Support
--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] hwmon: adt7475: wusbhc: constify attribute_group structures.

2017-08-07 Thread Arvind Yadav
attribute_group are not supposed to change at runtime. All functions
working with attribute_group provided by  work with
const attribute_group. So mark the non-const structs as const.

Signed-off-by: Arvind Yadav 
---
 drivers/hwmon/adt7475.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 1baa213..9ef8499 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -1319,14 +1319,14 @@ static SENSOR_DEVICE_ATTR_2(pwm3_stall_disable, S_IRUGO 
| S_IWUSR,
NULL
 };
 
-static struct attribute_group adt7475_attr_group = { .attrs = adt7475_attrs };
-static struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
-static struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
-static struct attribute_group in0_attr_group = { .attrs = in0_attrs };
-static struct attribute_group in3_attr_group = { .attrs = in3_attrs };
-static struct attribute_group in4_attr_group = { .attrs = in4_attrs };
-static struct attribute_group in5_attr_group = { .attrs = in5_attrs };
-static struct attribute_group vid_attr_group = { .attrs = vid_attrs };
+static const struct attribute_group adt7475_attr_group = { .attrs = 
adt7475_attrs };
+static const struct attribute_group fan4_attr_group = { .attrs = fan4_attrs };
+static const struct attribute_group pwm2_attr_group = { .attrs = pwm2_attrs };
+static const struct attribute_group in0_attr_group = { .attrs = in0_attrs };
+static const struct attribute_group in3_attr_group = { .attrs = in3_attrs };
+static const struct attribute_group in4_attr_group = { .attrs = in4_attrs };
+static const struct attribute_group in5_attr_group = { .attrs = in5_attrs };
+static const struct attribute_group vid_attr_group = { .attrs = vid_attrs };
 
 static int adt7475_detect(struct i2c_client *client,
  struct i2c_board_info *info)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html