All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
  2014-08-26 17:46   ` Andreas Werner
@ 2014-08-26 17:15     ` Guenter Roeck
  -1 siblings, 0 replies; 42+ messages in thread
From: Guenter Roeck @ 2014-08-26 17:15 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, lee.jones, wim, linux-watchdog, cooloney,
	rpurdie, linux-leds, jdelvare, lm-sensors, johannes.thumshirn

On Tue, Aug 26, 2014 at 07:46:53PM +0200, Andreas Werner wrote:
> Added driver to support the 14F021P00 BMC Hardware Monitoring.
> The BMC is a Board Management Controller including monitoring of the
> board voltages.
> 
> Signed-off-by: Andreas Werner <andreas.werner@men.de>

Hi Andreas,

Couple of additional comments below. Sorry I didn't notice earlier.

Guenter

> ---
>  Documentation/hwmon/menf21bmc   |  49 +++++++++
>  drivers/hwmon/Kconfig           |   7 ++
>  drivers/hwmon/Makefile          |   1 +
>  drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 287 insertions(+)
>  create mode 100644 Documentation/hwmon/menf21bmc
>  create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
> 
> diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
> new file mode 100644
> index 0000000..22b6840
> --- /dev/null
> +++ b/Documentation/hwmon/menf21bmc
> @@ -0,0 +1,49 @@
> +Kernel driver menf21bmc_hwmon
> +=============================
> +
> +Supported chips:
> +	* MEN 14F021P00
> +	  Prefix: 'menf21bmc_hwmon'
> +	  Adresses scanned: -
> +
> +Author: Andreas Werner <andreas.werner@men.de>
> +
> +Description
> +-----------
> +
> +The menf21bmc is a Board Management Controller (BMC) which provides an I2C
> +interface to the host to access the features implemented in the BMC.
> +
> +This driver gives access to the voltage monitoring feature of the main
> +voltages of the board.
> +The voltage sensors are connected to the ADC inputs of the BMC which is
> +a PIC16F917 Mikrocontroller.
> +
> +Usage Notes
> +-----------
> +
> +This driver does not auto-detect devices. You will have to instantiate the
> +devices explicitly. Please see Documentation/i2c/instantiating-devices for
> +details.
> +
> +Sysfs entries
> +-------------
> +
> +The following attributes are supported. All attributes are read only
> +The Limits are read once by the driver.
> +
> +in0_input	+3.3V input voltage
> +in1_input	+5.0V input voltage
> +in2_input	+12.0V input voltage
> +in3_input	+5V Standby input voltage
> +in4_input	VBAT (on board battery)
> +
> +in[0-4]_min	Minimum voltage limit
> +in[0-4]_max	Maximum voltage limit
> +
> +in0_label	"MON_3_3V"
> +in1_label	"MON_5V"
> +in2_label	"MON_12V"
> +in3_label	"5V_STANDBY"
> +in4_label	"VBAT"
> +

The empty line adds a whitespace error when applying the patch.

> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index 37908ff..db3a6eb 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -828,6 +828,13 @@ config SENSORS_MCP3021
>  	  This driver can also be built as a module.  If so, the module
>  	  will be called mcp3021.
>  
> +config SENSORS_MENF21BMC_HWMON
> +	tristate "MEN 14F021P00 BMC Hardware Monitoring"
> +	depends on MFD_MENF21BMC
> +	help
> +	  Say Y here to include support for the MEN 14F021P00 BMC
> +	  hardware monitoring.
> +
It is customary to add a note describing how the module is called
if the driver is built as module.

>  config SENSORS_ADCXX
>  	tristate "National Semiconductor ADCxxxSxxx"
>  	depends on SPI_MASTER
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index 1362382..56ab872 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
>  obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
>  obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
>  obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
> +obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
>  obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
>  obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
>  obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
> diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
> new file mode 100644
> index 0000000..2eaec6a
> --- /dev/null
> +++ b/drivers/hwmon/menf21bmc_hwmon.c
> @@ -0,0 +1,230 @@
> +/*
> + *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
> + *
> + *  This is the core hwmon driver of the MEN 14F021P00 BMC.
> + *  The BMC monitors the board voltages which can be access with this
> + *  driver through sysfs.
> + *
> + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> + *
> + *  This program is free software; you can redistribute  it and/or modify it
> + *  under  the terms of  the GNU General  Public License as published by the
> + *  Free Software Foundation;  either version 2 of the  License, or (at your
> + *  option) any later version.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/jiffies.h>
> +#include <linux/slab.h>
> +#include <linux/i2c.h>
> +
> +#define DRV_NAME  "menf21bmc_hwmon"
> +
> +#define BMC_VOLT_COUNT	5
> +#define MENF21BMC_V33	0
> +#define MENF21BMC_V5	1
> +#define MENF21BMC_V12	2
> +#define MENF21BMC_V5_SB	3
> +#define MENF21BMC_VBAT	4
> +
> +#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
> +#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
> +#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
> +
> +struct menf21bmc_hwmon {
> +	char valid;

Please use bool (and true / false to set it). char doesn't
save anything and may actually increase code size depending
on the architecture.

> +	struct i2c_client *i2c_client;
> +	unsigned long last_update;
> +	u16 in_val[BMC_VOLT_COUNT];
> +	u16 in_min[BMC_VOLT_COUNT];
> +	u16 in_max[BMC_VOLT_COUNT];
> +};
> +
> +static const char *const input_names[] = {
> +	[MENF21BMC_V33]		= "MON_3_3V",
> +	[MENF21BMC_V5]		= "MON_5V",
> +	[MENF21BMC_V12]		= "MON_12V",
> +	[MENF21BMC_V5_SB]	= "5V_STANDBY",
> +	[MENF21BMC_VBAT]	= "VBAT"
> +};
> +
> +static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
> +{
> +	int i;
> +	uint16_t val;

That doesn't work well with the checks against < 0.
Please compile with W=1 to find all instances of this problem
(there is another one below).

> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +	struct menf21bmc_hwmon *data_ret = drv_data;
> +
> +	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {

Line over 80 characters.

> +		for (i = 0; i < BMC_VOLT_COUNT; i++) {
> +			val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +						       IDX_TO_VOLT_INP_CMD(i));
> +			if (val < 0) {
> +				data_ret = ERR_PTR(val);
> +				goto abort;
> +			}
> +			drv_data->in_val[i] = val;
> +		}
> +		drv_data->last_update = jiffies;
> +		drv_data->valid = 1;
> +	}
> +abort:
> +	return data_ret;
> +}
> +
> +static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
> +{
> +	int i;
> +	uint16_t val;
> +
> +	for (i = 0; i < BMC_VOLT_COUNT; i++) {
> +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +					       IDX_TO_VOLT_MIN_CMD(i));
> +		if (val < 0)
> +			return val;
> +
> +		drv_data->in_min[i] = val;
> +
> +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +					       IDX_TO_VOLT_MAX_CMD(i));
> +		if (val < 0)
> +			return val;
> +
> +		drv_data->in_max[i] = val;
> +	}
> +	return 0;
> +}
> +
> +static ssize_t
> +show_label(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +
> +	return sprintf(buf, "%s\n", input_names[attr->index]);
> +}
> +
> +static ssize_t
> +show_in(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
> +
> +	if (IS_ERR(drv_data))
> +		return PTR_ERR(drv_data);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
> +}
> +
> +static ssize_t
> +show_min(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
> +}
> +
> +static ssize_t
> +show_max(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
> +}
> +
> +#define create_voltage_sysfs(idx)			\
> +static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
> +			show_in, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
> +			show_min, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
> +			show_max, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
> +			show_label, NULL, idx);
> +
> +create_voltage_sysfs(0);
> +create_voltage_sysfs(1);
> +create_voltage_sysfs(2);
> +create_voltage_sysfs(3);
> +create_voltage_sysfs(4);
> +
> +static struct attribute *menf21bmc_hwmon_attrs[] = {
> +	&sensor_dev_attr_in0_input.dev_attr.attr,
> +	&sensor_dev_attr_in0_min.dev_attr.attr,
> +	&sensor_dev_attr_in0_max.dev_attr.attr,
> +	&sensor_dev_attr_in0_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in1_input.dev_attr.attr,
> +	&sensor_dev_attr_in1_min.dev_attr.attr,
> +	&sensor_dev_attr_in1_max.dev_attr.attr,
> +	&sensor_dev_attr_in1_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in2_input.dev_attr.attr,
> +	&sensor_dev_attr_in2_min.dev_attr.attr,
> +	&sensor_dev_attr_in2_max.dev_attr.attr,
> +	&sensor_dev_attr_in2_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in3_input.dev_attr.attr,
> +	&sensor_dev_attr_in3_min.dev_attr.attr,
> +	&sensor_dev_attr_in3_max.dev_attr.attr,
> +	&sensor_dev_attr_in3_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in4_input.dev_attr.attr,
> +	&sensor_dev_attr_in4_min.dev_attr.attr,
> +	&sensor_dev_attr_in4_max.dev_attr.attr,
> +	&sensor_dev_attr_in4_label.dev_attr.attr,
> +	NULL
> +};
> +
> +ATTRIBUTE_GROUPS(menf21bmc_hwmon);
> +
> +static int menf21bmc_hwmon_probe(struct platform_device *pdev)
> +{
> +	int ret;
> +	struct menf21bmc_hwmon *drv_data;
> +	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
> +	struct device *hwmon_dev;
> +
> +	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
> +				GFP_KERNEL);
> +	if (!drv_data)
> +		return -ENOMEM;
> +
> +	drv_data->i2c_client = i2c_client;
> +
> +	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
> +	if (ret) {
> +		dev_err(&pdev->dev, "failed to read sensor limits");
> +		return ret;
> +	}
> +
> +	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
> +							   "menf21bmc", drv_data,
> +							   menf21bmc_hwmon_groups);

Line over 80 characters. Just use less indentation for the continuation lines.

> +	if (IS_ERR(hwmon_dev))
> +		return PTR_ERR(hwmon_dev);
> +
> +	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
> +
> +	return 0;
> +}
> +
> +static struct platform_driver menf21bmc_hwmon = {
> +	.probe		= menf21bmc_hwmon_probe,
> +	.driver		= {
> +		.name		= DRV_NAME,
> +		.owner		= THIS_MODULE,
> +	},
> +};
> +
> +module_platform_driver(menf21bmc_hwmon);
> +
> +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> +MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:menf21bmc_hwmon");
> -- 
> 2.0.4
> 
> 

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

* Re: [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driv
@ 2014-08-26 17:15     ` Guenter Roeck
  0 siblings, 0 replies; 42+ messages in thread
From: Guenter Roeck @ 2014-08-26 17:15 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, lee.jones, wim, linux-watchdog, cooloney,
	rpurdie, linux-leds, jdelvare, lm-sensors, johannes.thumshirn

On Tue, Aug 26, 2014 at 07:46:53PM +0200, Andreas Werner wrote:
> Added driver to support the 14F021P00 BMC Hardware Monitoring.
> The BMC is a Board Management Controller including monitoring of the
> board voltages.
> 
> Signed-off-by: Andreas Werner <andreas.werner@men.de>

Hi Andreas,

Couple of additional comments below. Sorry I didn't notice earlier.

Guenter

> ---
>  Documentation/hwmon/menf21bmc   |  49 +++++++++
>  drivers/hwmon/Kconfig           |   7 ++
>  drivers/hwmon/Makefile          |   1 +
>  drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 287 insertions(+)
>  create mode 100644 Documentation/hwmon/menf21bmc
>  create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
> 
> diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
> new file mode 100644
> index 0000000..22b6840
> --- /dev/null
> +++ b/Documentation/hwmon/menf21bmc
> @@ -0,0 +1,49 @@
> +Kernel driver menf21bmc_hwmon
> +==============> +
> +Supported chips:
> +	* MEN 14F021P00
> +	  Prefix: 'menf21bmc_hwmon'
> +	  Adresses scanned: -
> +
> +Author: Andreas Werner <andreas.werner@men.de>
> +
> +Description
> +-----------
> +
> +The menf21bmc is a Board Management Controller (BMC) which provides an I2C
> +interface to the host to access the features implemented in the BMC.
> +
> +This driver gives access to the voltage monitoring feature of the main
> +voltages of the board.
> +The voltage sensors are connected to the ADC inputs of the BMC which is
> +a PIC16F917 Mikrocontroller.
> +
> +Usage Notes
> +-----------
> +
> +This driver does not auto-detect devices. You will have to instantiate the
> +devices explicitly. Please see Documentation/i2c/instantiating-devices for
> +details.
> +
> +Sysfs entries
> +-------------
> +
> +The following attributes are supported. All attributes are read only
> +The Limits are read once by the driver.
> +
> +in0_input	+3.3V input voltage
> +in1_input	+5.0V input voltage
> +in2_input	+12.0V input voltage
> +in3_input	+5V Standby input voltage
> +in4_input	VBAT (on board battery)
> +
> +in[0-4]_min	Minimum voltage limit
> +in[0-4]_max	Maximum voltage limit
> +
> +in0_label	"MON_3_3V"
> +in1_label	"MON_5V"
> +in2_label	"MON_12V"
> +in3_label	"5V_STANDBY"
> +in4_label	"VBAT"
> +

The empty line adds a whitespace error when applying the patch.

> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index 37908ff..db3a6eb 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -828,6 +828,13 @@ config SENSORS_MCP3021
>  	  This driver can also be built as a module.  If so, the module
>  	  will be called mcp3021.
>  
> +config SENSORS_MENF21BMC_HWMON
> +	tristate "MEN 14F021P00 BMC Hardware Monitoring"
> +	depends on MFD_MENF21BMC
> +	help
> +	  Say Y here to include support for the MEN 14F021P00 BMC
> +	  hardware monitoring.
> +
It is customary to add a note describing how the module is called
if the driver is built as module.

>  config SENSORS_ADCXX
>  	tristate "National Semiconductor ADCxxxSxxx"
>  	depends on SPI_MASTER
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index 1362382..56ab872 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
>  obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
>  obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
>  obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
> +obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
>  obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
>  obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
>  obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
> diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
> new file mode 100644
> index 0000000..2eaec6a
> --- /dev/null
> +++ b/drivers/hwmon/menf21bmc_hwmon.c
> @@ -0,0 +1,230 @@
> +/*
> + *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
> + *
> + *  This is the core hwmon driver of the MEN 14F021P00 BMC.
> + *  The BMC monitors the board voltages which can be access with this
> + *  driver through sysfs.
> + *
> + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> + *
> + *  This program is free software; you can redistribute  it and/or modify it
> + *  under  the terms of  the GNU General  Public License as published by the
> + *  Free Software Foundation;  either version 2 of the  License, or (at your
> + *  option) any later version.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/jiffies.h>
> +#include <linux/slab.h>
> +#include <linux/i2c.h>
> +
> +#define DRV_NAME  "menf21bmc_hwmon"
> +
> +#define BMC_VOLT_COUNT	5
> +#define MENF21BMC_V33	0
> +#define MENF21BMC_V5	1
> +#define MENF21BMC_V12	2
> +#define MENF21BMC_V5_SB	3
> +#define MENF21BMC_VBAT	4
> +
> +#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
> +#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
> +#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
> +
> +struct menf21bmc_hwmon {
> +	char valid;

Please use bool (and true / false to set it). char doesn't
save anything and may actually increase code size depending
on the architecture.

> +	struct i2c_client *i2c_client;
> +	unsigned long last_update;
> +	u16 in_val[BMC_VOLT_COUNT];
> +	u16 in_min[BMC_VOLT_COUNT];
> +	u16 in_max[BMC_VOLT_COUNT];
> +};
> +
> +static const char *const input_names[] = {
> +	[MENF21BMC_V33]		= "MON_3_3V",
> +	[MENF21BMC_V5]		= "MON_5V",
> +	[MENF21BMC_V12]		= "MON_12V",
> +	[MENF21BMC_V5_SB]	= "5V_STANDBY",
> +	[MENF21BMC_VBAT]	= "VBAT"
> +};
> +
> +static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
> +{
> +	int i;
> +	uint16_t val;

That doesn't work well with the checks against < 0.
Please compile with W=1 to find all instances of this problem
(there is another one below).

> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +	struct menf21bmc_hwmon *data_ret = drv_data;
> +
> +	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {

Line over 80 characters.

> +		for (i = 0; i < BMC_VOLT_COUNT; i++) {
> +			val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +						       IDX_TO_VOLT_INP_CMD(i));
> +			if (val < 0) {
> +				data_ret = ERR_PTR(val);
> +				goto abort;
> +			}
> +			drv_data->in_val[i] = val;
> +		}
> +		drv_data->last_update = jiffies;
> +		drv_data->valid = 1;
> +	}
> +abort:
> +	return data_ret;
> +}
> +
> +static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
> +{
> +	int i;
> +	uint16_t val;
> +
> +	for (i = 0; i < BMC_VOLT_COUNT; i++) {
> +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +					       IDX_TO_VOLT_MIN_CMD(i));
> +		if (val < 0)
> +			return val;
> +
> +		drv_data->in_min[i] = val;
> +
> +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> +					       IDX_TO_VOLT_MAX_CMD(i));
> +		if (val < 0)
> +			return val;
> +
> +		drv_data->in_max[i] = val;
> +	}
> +	return 0;
> +}
> +
> +static ssize_t
> +show_label(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +
> +	return sprintf(buf, "%s\n", input_names[attr->index]);
> +}
> +
> +static ssize_t
> +show_in(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
> +
> +	if (IS_ERR(drv_data))
> +		return PTR_ERR(drv_data);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
> +}
> +
> +static ssize_t
> +show_min(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
> +}
> +
> +static ssize_t
> +show_max(struct device *dev, struct device_attribute *devattr, char *buf)
> +{
> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> +
> +	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
> +}
> +
> +#define create_voltage_sysfs(idx)			\
> +static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
> +			show_in, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
> +			show_min, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
> +			show_max, NULL, idx);		\
> +static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
> +			show_label, NULL, idx);
> +
> +create_voltage_sysfs(0);
> +create_voltage_sysfs(1);
> +create_voltage_sysfs(2);
> +create_voltage_sysfs(3);
> +create_voltage_sysfs(4);
> +
> +static struct attribute *menf21bmc_hwmon_attrs[] = {
> +	&sensor_dev_attr_in0_input.dev_attr.attr,
> +	&sensor_dev_attr_in0_min.dev_attr.attr,
> +	&sensor_dev_attr_in0_max.dev_attr.attr,
> +	&sensor_dev_attr_in0_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in1_input.dev_attr.attr,
> +	&sensor_dev_attr_in1_min.dev_attr.attr,
> +	&sensor_dev_attr_in1_max.dev_attr.attr,
> +	&sensor_dev_attr_in1_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in2_input.dev_attr.attr,
> +	&sensor_dev_attr_in2_min.dev_attr.attr,
> +	&sensor_dev_attr_in2_max.dev_attr.attr,
> +	&sensor_dev_attr_in2_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in3_input.dev_attr.attr,
> +	&sensor_dev_attr_in3_min.dev_attr.attr,
> +	&sensor_dev_attr_in3_max.dev_attr.attr,
> +	&sensor_dev_attr_in3_label.dev_attr.attr,
> +
> +	&sensor_dev_attr_in4_input.dev_attr.attr,
> +	&sensor_dev_attr_in4_min.dev_attr.attr,
> +	&sensor_dev_attr_in4_max.dev_attr.attr,
> +	&sensor_dev_attr_in4_label.dev_attr.attr,
> +	NULL
> +};
> +
> +ATTRIBUTE_GROUPS(menf21bmc_hwmon);
> +
> +static int menf21bmc_hwmon_probe(struct platform_device *pdev)
> +{
> +	int ret;
> +	struct menf21bmc_hwmon *drv_data;
> +	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
> +	struct device *hwmon_dev;
> +
> +	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
> +				GFP_KERNEL);
> +	if (!drv_data)
> +		return -ENOMEM;
> +
> +	drv_data->i2c_client = i2c_client;
> +
> +	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
> +	if (ret) {
> +		dev_err(&pdev->dev, "failed to read sensor limits");
> +		return ret;
> +	}
> +
> +	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
> +							   "menf21bmc", drv_data,
> +							   menf21bmc_hwmon_groups);

Line over 80 characters. Just use less indentation for the continuation lines.

> +	if (IS_ERR(hwmon_dev))
> +		return PTR_ERR(hwmon_dev);
> +
> +	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
> +
> +	return 0;
> +}
> +
> +static struct platform_driver menf21bmc_hwmon = {
> +	.probe		= menf21bmc_hwmon_probe,
> +	.driver		= {
> +		.name		= DRV_NAME,
> +		.owner		= THIS_MODULE,
> +	},
> +};
> +
> +module_platform_driver(menf21bmc_hwmon);
> +
> +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> +MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:menf21bmc_hwmon");
> -- 
> 2.0.4
> 
> 

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* [PATCH v5 0/4] Introduce MEN 14F021P00 BMC driver series
@ 2014-08-26 17:45 ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

This patch set add support for the MEN 14F021P00 Board Management called BMC.

The BMC is a PIC Mikrocontroller which assembled on almost all of our
3U Compact PCI CPU board and a few Box PCs.
main part of the BMC is to start and monitor the board, but there are a
lot more features which can be accessed using an I2C Host interface

Features supported in this Patchset:
        - Watchdog
        - LEDs
        - HWMON

The Patchset includes a MFD Core driver, Watchdog, hwmon  and LEDs driver.

Changes in v5:
	- fixed I2C dependency in MFD Kconfig
	- added correct error handling in update function of the hwmon slave
	  (Use of ERR_PTR)
	- add ATTRIBUTE_GROUP Macro in hwmon slave
	  and deleted platform_set_drvdata

Changes in v4:
        - fixed some style issues
        - fixed GPL license version
        - added hwmon voltage monitoring slave driver

Changes in v3:
        - deleted i2c_smbus wrapper functions and use native one
        - some cosmentics and variable renaming to be more clear
        - renamed "leave production" mode to "exit production mode"

Changes in v2:
        - changed i2c_smbus_read wrapper function to return both, value
          and error.
        - moved "leave production mode" from Watchdog driver to mfd core.
        - fixed some return values in the watchdog driver to return the original
          error value instead of -EIO.


Andreas Werner (4):
  drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog
    driver
  drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
  drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver

 Documentation/hwmon/menf21bmc    |  49 +++++++++
 drivers/hwmon/Kconfig            |   7 ++
 drivers/hwmon/Makefile           |   1 +
 drivers/hwmon/menf21bmc_hwmon.c  | 230 +++++++++++++++++++++++++++++++++++++++
 drivers/leds/Kconfig             |   6 +
 drivers/leds/Makefile            |   1 +
 drivers/leds/leds-menf21bmc.c    | 131 ++++++++++++++++++++++
 drivers/mfd/Kconfig              |  12 ++
 drivers/mfd/Makefile             |   1 +
 drivers/mfd/menf21bmc.c          | 132 ++++++++++++++++++++++
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 ++++++++++++++++++++++++++++++++++
 13 files changed, 781 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
 create mode 100644 drivers/leds/leds-menf21bmc.c
 create mode 100644 drivers/mfd/menf21bmc.c
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

-- 
2.0.4

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

* [PATCH v5 0/4] Introduce MEN 14F021P00 BMC driver series
@ 2014-08-26 17:45 ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

This patch set add support for the MEN 14F021P00 Board Management called BMC.

The BMC is a PIC Mikrocontroller which assembled on almost all of our
3U Compact PCI CPU board and a few Box PCs.
main part of the BMC is to start and monitor the board, but there are a
lot more features which can be accessed using an I2C Host interface

Features supported in this Patchset:
        - Watchdog
        - LEDs
        - HWMON

The Patchset includes a MFD Core driver, Watchdog, hwmon  and LEDs driver.

Changes in v5:
	- fixed I2C dependency in MFD Kconfig
	- added correct error handling in update function of the hwmon slave
	  (Use of ERR_PTR)
	- add ATTRIBUTE_GROUP Macro in hwmon slave
	  and deleted platform_set_drvdata

Changes in v4:
        - fixed some style issues
        - fixed GPL license version
        - added hwmon voltage monitoring slave driver

Changes in v3:
        - deleted i2c_smbus wrapper functions and use native one
        - some cosmentics and variable renaming to be more clear
        - renamed "leave production" mode to "exit production mode"

Changes in v2:
        - changed i2c_smbus_read wrapper function to return both, value
          and error.
        - moved "leave production mode" from Watchdog driver to mfd core.
        - fixed some return values in the watchdog driver to return the original
          error value instead of -EIO.


Andreas Werner (4):
  drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog
    driver
  drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
  drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver

 Documentation/hwmon/menf21bmc    |  49 +++++++++
 drivers/hwmon/Kconfig            |   7 ++
 drivers/hwmon/Makefile           |   1 +
 drivers/hwmon/menf21bmc_hwmon.c  | 230 +++++++++++++++++++++++++++++++++++++++
 drivers/leds/Kconfig             |   6 +
 drivers/leds/Makefile            |   1 +
 drivers/leds/leds-menf21bmc.c    | 131 ++++++++++++++++++++++
 drivers/mfd/Kconfig              |  12 ++
 drivers/mfd/Makefile             |   1 +
 drivers/mfd/menf21bmc.c          | 132 ++++++++++++++++++++++
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 ++++++++++++++++++++++++++++++++++
 13 files changed, 781 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
 create mode 100644 drivers/leds/leds-menf21bmc.c
 create mode 100644 drivers/mfd/menf21bmc.c
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

-- 
2.0.4


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

* [lm-sensors] [PATCH v5 0/4] Introduce MEN 14F021P00 BMC driver series
@ 2014-08-26 17:45 ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

This patch set add support for the MEN 14F021P00 Board Management called BMC.

The BMC is a PIC Mikrocontroller which assembled on almost all of our
3U Compact PCI CPU board and a few Box PCs.
main part of the BMC is to start and monitor the board, but there are a
lot more features which can be accessed using an I2C Host interface

Features supported in this Patchset:
        - Watchdog
        - LEDs
        - HWMON

The Patchset includes a MFD Core driver, Watchdog, hwmon  and LEDs driver.

Changes in v5:
	- fixed I2C dependency in MFD Kconfig
	- added correct error handling in update function of the hwmon slave
	  (Use of ERR_PTR)
	- add ATTRIBUTE_GROUP Macro in hwmon slave
	  and deleted platform_set_drvdata

Changes in v4:
        - fixed some style issues
        - fixed GPL license version
        - added hwmon voltage monitoring slave driver

Changes in v3:
        - deleted i2c_smbus wrapper functions and use native one
        - some cosmentics and variable renaming to be more clear
        - renamed "leave production" mode to "exit production mode"

Changes in v2:
        - changed i2c_smbus_read wrapper function to return both, value
          and error.
        - moved "leave production mode" from Watchdog driver to mfd core.
        - fixed some return values in the watchdog driver to return the original
          error value instead of -EIO.


Andreas Werner (4):
  drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog
    driver
  drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
  drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver

 Documentation/hwmon/menf21bmc    |  49 +++++++++
 drivers/hwmon/Kconfig            |   7 ++
 drivers/hwmon/Makefile           |   1 +
 drivers/hwmon/menf21bmc_hwmon.c  | 230 +++++++++++++++++++++++++++++++++++++++
 drivers/leds/Kconfig             |   6 +
 drivers/leds/Makefile            |   1 +
 drivers/leds/leds-menf21bmc.c    | 131 ++++++++++++++++++++++
 drivers/mfd/Kconfig              |  12 ++
 drivers/mfd/Makefile             |   1 +
 drivers/mfd/menf21bmc.c          | 132 ++++++++++++++++++++++
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 ++++++++++++++++++++++++++++++++++
 13 files changed, 781 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
 create mode 100644 drivers/leds/leds-menf21bmc.c
 create mode 100644 drivers/mfd/menf21bmc.c
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

-- 
2.0.4


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-26 17:45 ` Andreas Werner
  (?)
@ 2014-08-26 17:45   ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

The MEN 14F021P00 Board Management Controller provides an
I2C interface to the host to access the feature implemented in the BMC.
The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
and on a few Box/Display Computer.

Added MFD Core driver, supporting the I2C communication to the device.

The MFD driver currently supports the following features:
 	- Watchdog
 	- LEDs
	- Hwmon (voltage monitoring)

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/Kconfig     |  12 +++++
 drivers/mfd/Makefile    |   1 +
 drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 145 insertions(+)
 create mode 100644 drivers/mfd/menf21bmc.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b8d9ca0..6a9f101 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -453,6 +453,18 @@ config MFD_MAX8998
 	  additional drivers must be enabled in order to use the functionality
 	  of the device.
 
+config MFD_MENF21BMC
+	tristate "MEN 14F021P00 Board Management Controller Support"
+	depends on I2C
+	select MFD_CORE
+	help
+	  Say yes here to add support for the MEN 14F021P00 BMC
+	  which is a Board Management Controller connected to the I2C bus.
+	  The device supports multiple sub-devices like LED, HWMON  and WDT.
+	  This driver provides common support for accessing the devices;
+	  additional drivers must be enabled in order to use the
+	  functionality of the BMC device.
+
 config EZX_PCAP
 	bool "Motorola EZXPCAP Support"
 	depends on SPI_MASTER
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4e2bc25..37bf336 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
 obj-$(CONFIG_MFD_AS3722)	+= as3722.o
 obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
+obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
 
 intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
 obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
new file mode 100644
index 0000000..a6eb03f
--- /dev/null
+++ b/drivers/mfd/menf21bmc.c
@@ -0,0 +1,132 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/mfd/core.h>
+
+#define BMC_CMD_WDT_EXIT_PROD	0x18
+#define BMC_CMD_WDT_PROD_STAT	0x19
+#define BMC_CMD_REV_MAJOR	0x80
+#define BMC_CMD_REV_MINOR	0x81
+#define BMC_CMD_REV_MAIN	0x82
+
+static struct mfd_cell menf21bmc_cell[] = {
+	{ .name = "menf21bmc_wdt", },
+	{ .name = "menf21bmc_led", },
+	{ .name = "menf21bmc_hwmon", }
+};
+
+static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
+{
+	int val, ret;
+
+	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
+	if (val < 0)
+		return val;
+
+	/*
+	 * Production mode should be not active after delivery of the Board.
+	 * To be sure we check it, inform the user and exit the mode
+	 * if active.
+	 */
+	if (val == 0x00) {
+		dev_info(&client->dev,
+			"BMC in production mode. Exit production mode\n");
+
+		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
+		if (ret < 0)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int
+menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
+{
+	int ret;
+	int rev_major, rev_minor, rev_main;
+
+	ret = i2c_check_functionality(client->adapter,
+				      I2C_FUNC_SMBUS_BYTE_DATA |
+				      I2C_FUNC_SMBUS_WORD_DATA |
+				      I2C_FUNC_SMBUS_BYTE);
+	if (!ret)
+		return -ENODEV;
+
+	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
+	if (rev_major < 0) {
+		dev_err(&client->dev, "failed to get BMC major revision\n");
+		return rev_major;
+	}
+
+	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
+	if (rev_minor < 0) {
+		dev_err(&client->dev, "failed to get BMC minor revision\n");
+		return rev_minor;
+	}
+
+	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
+	if (rev_main < 0) {
+		dev_err(&client->dev, "failed to get BMC main revision\n");
+		return rev_main;
+	}
+
+	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
+					rev_major, rev_minor, rev_main);
+
+	/*
+	 * We have to exit the Production Mode of the BMC to activate the
+	 * Watchdog functionality and the BIOS life sign monitoring.
+	 */
+	ret = menf21bmc_wdt_exit_prod_mode(client);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to leave production mode\n");
+		return ret;
+	}
+
+	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
+				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to add BMC sub-devices\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static int menf21bmc_remove(struct i2c_client *client)
+{
+	mfd_remove_devices(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id menf21bmc_id_table[] = {
+	{ "menf21bmc", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
+
+static struct i2c_driver menf21bmc_driver = {
+	.driver.name	= "menf21bmc",
+	.id_table	= menf21bmc_id_table,
+	.probe		= menf21bmc_probe,
+	.remove		= menf21bmc_remove,
+};
+
+module_i2c_driver(menf21bmc_driver);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
-- 
2.0.4

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

* [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-26 17:45   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

The MEN 14F021P00 Board Management Controller provides an
I2C interface to the host to access the feature implemented in the BMC.
The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
and on a few Box/Display Computer.

Added MFD Core driver, supporting the I2C communication to the device.

The MFD driver currently supports the following features:
 	- Watchdog
 	- LEDs
	- Hwmon (voltage monitoring)

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/Kconfig     |  12 +++++
 drivers/mfd/Makefile    |   1 +
 drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 145 insertions(+)
 create mode 100644 drivers/mfd/menf21bmc.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b8d9ca0..6a9f101 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -453,6 +453,18 @@ config MFD_MAX8998
 	  additional drivers must be enabled in order to use the functionality
 	  of the device.
 
+config MFD_MENF21BMC
+	tristate "MEN 14F021P00 Board Management Controller Support"
+	depends on I2C
+	select MFD_CORE
+	help
+	  Say yes here to add support for the MEN 14F021P00 BMC
+	  which is a Board Management Controller connected to the I2C bus.
+	  The device supports multiple sub-devices like LED, HWMON  and WDT.
+	  This driver provides common support for accessing the devices;
+	  additional drivers must be enabled in order to use the
+	  functionality of the BMC device.
+
 config EZX_PCAP
 	bool "Motorola EZXPCAP Support"
 	depends on SPI_MASTER
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4e2bc25..37bf336 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
 obj-$(CONFIG_MFD_AS3722)	+= as3722.o
 obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
+obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
 
 intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
 obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
new file mode 100644
index 0000000..a6eb03f
--- /dev/null
+++ b/drivers/mfd/menf21bmc.c
@@ -0,0 +1,132 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/mfd/core.h>
+
+#define BMC_CMD_WDT_EXIT_PROD	0x18
+#define BMC_CMD_WDT_PROD_STAT	0x19
+#define BMC_CMD_REV_MAJOR	0x80
+#define BMC_CMD_REV_MINOR	0x81
+#define BMC_CMD_REV_MAIN	0x82
+
+static struct mfd_cell menf21bmc_cell[] = {
+	{ .name = "menf21bmc_wdt", },
+	{ .name = "menf21bmc_led", },
+	{ .name = "menf21bmc_hwmon", }
+};
+
+static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
+{
+	int val, ret;
+
+	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
+	if (val < 0)
+		return val;
+
+	/*
+	 * Production mode should be not active after delivery of the Board.
+	 * To be sure we check it, inform the user and exit the mode
+	 * if active.
+	 */
+	if (val == 0x00) {
+		dev_info(&client->dev,
+			"BMC in production mode. Exit production mode\n");
+
+		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
+		if (ret < 0)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int
+menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
+{
+	int ret;
+	int rev_major, rev_minor, rev_main;
+
+	ret = i2c_check_functionality(client->adapter,
+				      I2C_FUNC_SMBUS_BYTE_DATA |
+				      I2C_FUNC_SMBUS_WORD_DATA |
+				      I2C_FUNC_SMBUS_BYTE);
+	if (!ret)
+		return -ENODEV;
+
+	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
+	if (rev_major < 0) {
+		dev_err(&client->dev, "failed to get BMC major revision\n");
+		return rev_major;
+	}
+
+	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
+	if (rev_minor < 0) {
+		dev_err(&client->dev, "failed to get BMC minor revision\n");
+		return rev_minor;
+	}
+
+	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
+	if (rev_main < 0) {
+		dev_err(&client->dev, "failed to get BMC main revision\n");
+		return rev_main;
+	}
+
+	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
+					rev_major, rev_minor, rev_main);
+
+	/*
+	 * We have to exit the Production Mode of the BMC to activate the
+	 * Watchdog functionality and the BIOS life sign monitoring.
+	 */
+	ret = menf21bmc_wdt_exit_prod_mode(client);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to leave production mode\n");
+		return ret;
+	}
+
+	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
+				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to add BMC sub-devices\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static int menf21bmc_remove(struct i2c_client *client)
+{
+	mfd_remove_devices(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id menf21bmc_id_table[] = {
+	{ "menf21bmc", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
+
+static struct i2c_driver menf21bmc_driver = {
+	.driver.name	= "menf21bmc",
+	.id_table	= menf21bmc_id_table,
+	.probe		= menf21bmc_probe,
+	.remove		= menf21bmc_remove,
+};
+
+module_i2c_driver(menf21bmc_driver);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
-- 
2.0.4


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

* [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-26 17:45   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:45 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

The MEN 14F021P00 Board Management Controller provides an
I2C interface to the host to access the feature implemented in the BMC.
The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
and on a few Box/Display Computer.

Added MFD Core driver, supporting the I2C communication to the device.

The MFD driver currently supports the following features:
 	- Watchdog
 	- LEDs
	- Hwmon (voltage monitoring)

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/Kconfig     |  12 +++++
 drivers/mfd/Makefile    |   1 +
 drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 145 insertions(+)
 create mode 100644 drivers/mfd/menf21bmc.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b8d9ca0..6a9f101 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -453,6 +453,18 @@ config MFD_MAX8998
 	  additional drivers must be enabled in order to use the functionality
 	  of the device.
 
+config MFD_MENF21BMC
+	tristate "MEN 14F021P00 Board Management Controller Support"
+	depends on I2C
+	select MFD_CORE
+	help
+	  Say yes here to add support for the MEN 14F021P00 BMC
+	  which is a Board Management Controller connected to the I2C bus.
+	  The device supports multiple sub-devices like LED, HWMON  and WDT.
+	  This driver provides common support for accessing the devices;
+	  additional drivers must be enabled in order to use the
+	  functionality of the BMC device.
+
 config EZX_PCAP
 	bool "Motorola EZXPCAP Support"
 	depends on SPI_MASTER
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4e2bc25..37bf336 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
 obj-$(CONFIG_MFD_AS3722)	+= as3722.o
 obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
+obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
 
 intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
 obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
new file mode 100644
index 0000000..a6eb03f
--- /dev/null
+++ b/drivers/mfd/menf21bmc.c
@@ -0,0 +1,132 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/mfd/core.h>
+
+#define BMC_CMD_WDT_EXIT_PROD	0x18
+#define BMC_CMD_WDT_PROD_STAT	0x19
+#define BMC_CMD_REV_MAJOR	0x80
+#define BMC_CMD_REV_MINOR	0x81
+#define BMC_CMD_REV_MAIN	0x82
+
+static struct mfd_cell menf21bmc_cell[] = {
+	{ .name = "menf21bmc_wdt", },
+	{ .name = "menf21bmc_led", },
+	{ .name = "menf21bmc_hwmon", }
+};
+
+static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
+{
+	int val, ret;
+
+	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
+	if (val < 0)
+		return val;
+
+	/*
+	 * Production mode should be not active after delivery of the Board.
+	 * To be sure we check it, inform the user and exit the mode
+	 * if active.
+	 */
+	if (val = 0x00) {
+		dev_info(&client->dev,
+			"BMC in production mode. Exit production mode\n");
+
+		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
+		if (ret < 0)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int
+menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
+{
+	int ret;
+	int rev_major, rev_minor, rev_main;
+
+	ret = i2c_check_functionality(client->adapter,
+				      I2C_FUNC_SMBUS_BYTE_DATA |
+				      I2C_FUNC_SMBUS_WORD_DATA |
+				      I2C_FUNC_SMBUS_BYTE);
+	if (!ret)
+		return -ENODEV;
+
+	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
+	if (rev_major < 0) {
+		dev_err(&client->dev, "failed to get BMC major revision\n");
+		return rev_major;
+	}
+
+	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
+	if (rev_minor < 0) {
+		dev_err(&client->dev, "failed to get BMC minor revision\n");
+		return rev_minor;
+	}
+
+	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
+	if (rev_main < 0) {
+		dev_err(&client->dev, "failed to get BMC main revision\n");
+		return rev_main;
+	}
+
+	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
+					rev_major, rev_minor, rev_main);
+
+	/*
+	 * We have to exit the Production Mode of the BMC to activate the
+	 * Watchdog functionality and the BIOS life sign monitoring.
+	 */
+	ret = menf21bmc_wdt_exit_prod_mode(client);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to leave production mode\n");
+		return ret;
+	}
+
+	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
+				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
+	if (ret < 0) {
+		dev_err(&client->dev, "failed to add BMC sub-devices\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+static int menf21bmc_remove(struct i2c_client *client)
+{
+	mfd_remove_devices(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id menf21bmc_id_table[] = {
+	{ "menf21bmc", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
+
+static struct i2c_driver menf21bmc_driver = {
+	.driver.name	= "menf21bmc",
+	.id_table	= menf21bmc_id_table,
+	.probe		= menf21bmc_probe,
+	.remove		= menf21bmc_remove,
+};
+
+module_i2c_driver(menf21bmc_driver);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
-- 
2.0.4


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog driver
  2014-08-26 17:45 ` Andreas Werner
  (?)
@ 2014-08-26 17:46   ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Watchdog.
The BMC is a Board Management Controller including watchdog functionality.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 211 insertions(+)
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 76dd541..f96431d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -95,6 +95,13 @@ config GPIO_WATCHDOG
 	  If you say yes here you get support for watchdog device
 	  controlled through GPIO-line.
 
+config MENF21BMC_WATCHDOG
+	tristate "MEN 14F021P00 BMC Watchdog"
+	depends on MFD_MENF21BMC
+	select WATCHDOG_CORE
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC Watchdog.
+
 config WM831X_WATCHDOG
 	tristate "WM831x watchdog"
 	depends on MFD_WM831X
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 468c320..de17014 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -178,3 +178,4 @@ obj-$(CONFIG_WM831X_WATCHDOG) += wm831x_wdt.o
 obj-$(CONFIG_WM8350_WATCHDOG) += wm8350_wdt.o
 obj-$(CONFIG_MAX63XX_WATCHDOG) += max63xx_wdt.o
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
+obj-$(CONFIG_MENF21BMC_WATCHDOG) += menf21bmc_wdt.o
diff --git a/drivers/watchdog/menf21bmc_wdt.c b/drivers/watchdog/menf21bmc_wdt.c
new file mode 100644
index 0000000..604824d
--- /dev/null
+++ b/drivers/watchdog/menf21bmc_wdt.c
@@ -0,0 +1,203 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) Watchdog Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/watchdog.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+
+#define DEVNAME "menf21bmc_wdt"
+
+#define BMC_CMD_WD_ON		0x11
+#define BMC_CMD_WD_OFF		0x12
+#define BMC_CMD_WD_TRIG		0x13
+#define BMC_CMD_WD_TIME		0x14
+#define BMC_CMD_WD_STATE	0x17
+#define BMC_WD_OFF_VAL		0x69
+#define BMC_CMD_RST_RSN		0x92
+
+#define BMC_WD_TIMEOUT_MIN	1	/* in sec */
+#define BMC_WD_TIMEOUT_MAX	6553	/* in sec */
+
+static bool nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+struct menf21bmc_wdt {
+	struct watchdog_device wdt;
+	struct i2c_client *i2c_client;
+};
+
+static int menf21bmc_wdt_set_bootstatus(struct menf21bmc_wdt *data)
+{
+	int rst_rsn;
+
+	rst_rsn = i2c_smbus_read_byte_data(data->i2c_client, BMC_CMD_RST_RSN);
+	if (rst_rsn < 0)
+		return rst_rsn;
+
+	if (rst_rsn == 0x02)
+		data->wdt.bootstatus |= WDIOF_CARDRESET;
+	else if (rst_rsn == 0x05)
+		data->wdt.bootstatus |= WDIOF_EXTERN1;
+	else if (rst_rsn == 0x06)
+		data->wdt.bootstatus |= WDIOF_EXTERN2;
+	else if (rst_rsn == 0x0A)
+		data->wdt.bootstatus |= WDIOF_POWERUNDER;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_start(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_ON);
+}
+
+static int menf21bmc_wdt_stop(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static int
+menf21bmc_wdt_settimeout(struct watchdog_device *wdt, unsigned int timeout)
+{
+	int ret;
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	/*
+	 *  BMC Watchdog does have a resolution of 100ms.
+	 *  Watchdog API defines the timeout in seconds, so we have to
+	 *  multiply the value.
+	 */
+	ret = i2c_smbus_write_word_data(drv_data->i2c_client,
+						BMC_CMD_WD_TIME, timeout * 10);
+	if (ret < 0)
+		return ret;
+
+	wdt->timeout = timeout;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_ping(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_TRIG);
+}
+
+static const struct watchdog_info menf21bmc_wdt_info = {
+	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
+	.identity = DEVNAME,
+};
+
+static const struct watchdog_ops menf21bmc_wdt_ops = {
+	.owner		= THIS_MODULE,
+	.start		= menf21bmc_wdt_start,
+	.stop		= menf21bmc_wdt_stop,
+	.ping		= menf21bmc_wdt_ping,
+	.set_timeout	= menf21bmc_wdt_settimeout,
+};
+
+static int menf21bmc_wdt_probe(struct platform_device *pdev)
+{
+	int ret, bmc_timeout;
+	struct menf21bmc_wdt *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	drv_data = devm_kzalloc(&pdev->dev,
+				sizeof(struct menf21bmc_wdt), GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->wdt.ops = &menf21bmc_wdt_ops;
+	drv_data->wdt.info = &menf21bmc_wdt_info;
+	drv_data->wdt.min_timeout = BMC_WD_TIMEOUT_MIN;
+	drv_data->wdt.max_timeout = BMC_WD_TIMEOUT_MAX;
+	drv_data->i2c_client = i2c_client;
+
+	/*
+	 * Get the current wdt timeout value from the BMC because
+	 * the BMC will save the value set before if the system restarts.
+	 */
+	bmc_timeout = i2c_smbus_read_word_data(drv_data->i2c_client,
+							BMC_CMD_WD_TIME);
+	if (bmc_timeout < 0) {
+		dev_err(&pdev->dev, "failed to get current WDT timeout\n");
+		return bmc_timeout;
+	}
+
+	watchdog_init_timeout(&drv_data->wdt, bmc_timeout / 10, &pdev->dev);
+	watchdog_set_nowayout(&drv_data->wdt, nowayout);
+	watchdog_set_drvdata(&drv_data->wdt, drv_data);
+	platform_set_drvdata(pdev, drv_data);
+
+	ret = menf21bmc_wdt_set_bootstatus(drv_data);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "failed to set Watchdog bootstatus\n");
+		return ret;
+	}
+
+	ret = watchdog_register_device(&drv_data->wdt);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register Watchdog device\n");
+		return ret;
+	}
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC Watchdog device enabled\n");
+
+	return 0;
+}
+
+static int menf21bmc_wdt_remove(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	dev_warn(&pdev->dev,
+		"Unregister MEN 14F021P00 BMC Watchdog device, board may reset\n");
+
+	watchdog_unregister_device(&drv_data->wdt);
+
+	return 0;
+}
+
+static void menf21bmc_wdt_shutdown(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	i2c_smbus_write_word_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static struct  platform_driver menf21bmc_wdt = {
+	.driver		= {
+		.owner = THIS_MODULE,
+		.name	= DEVNAME,
+	},
+	.probe		= menf21bmc_wdt_probe,
+	.remove		= menf21bmc_wdt_remove,
+	.shutdown	= menf21bmc_wdt_shutdown,
+};
+
+module_platform_driver(menf21bmc_wdt);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC Watchdog driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_wdt");
-- 
2.0.4

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

* [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog driver
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Watchdog.
The BMC is a Board Management Controller including watchdog functionality.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 211 insertions(+)
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 76dd541..f96431d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -95,6 +95,13 @@ config GPIO_WATCHDOG
 	  If you say yes here you get support for watchdog device
 	  controlled through GPIO-line.
 
+config MENF21BMC_WATCHDOG
+	tristate "MEN 14F021P00 BMC Watchdog"
+	depends on MFD_MENF21BMC
+	select WATCHDOG_CORE
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC Watchdog.
+
 config WM831X_WATCHDOG
 	tristate "WM831x watchdog"
 	depends on MFD_WM831X
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 468c320..de17014 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -178,3 +178,4 @@ obj-$(CONFIG_WM831X_WATCHDOG) += wm831x_wdt.o
 obj-$(CONFIG_WM8350_WATCHDOG) += wm8350_wdt.o
 obj-$(CONFIG_MAX63XX_WATCHDOG) += max63xx_wdt.o
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
+obj-$(CONFIG_MENF21BMC_WATCHDOG) += menf21bmc_wdt.o
diff --git a/drivers/watchdog/menf21bmc_wdt.c b/drivers/watchdog/menf21bmc_wdt.c
new file mode 100644
index 0000000..604824d
--- /dev/null
+++ b/drivers/watchdog/menf21bmc_wdt.c
@@ -0,0 +1,203 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) Watchdog Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/watchdog.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+
+#define DEVNAME "menf21bmc_wdt"
+
+#define BMC_CMD_WD_ON		0x11
+#define BMC_CMD_WD_OFF		0x12
+#define BMC_CMD_WD_TRIG		0x13
+#define BMC_CMD_WD_TIME		0x14
+#define BMC_CMD_WD_STATE	0x17
+#define BMC_WD_OFF_VAL		0x69
+#define BMC_CMD_RST_RSN		0x92
+
+#define BMC_WD_TIMEOUT_MIN	1	/* in sec */
+#define BMC_WD_TIMEOUT_MAX	6553	/* in sec */
+
+static bool nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+struct menf21bmc_wdt {
+	struct watchdog_device wdt;
+	struct i2c_client *i2c_client;
+};
+
+static int menf21bmc_wdt_set_bootstatus(struct menf21bmc_wdt *data)
+{
+	int rst_rsn;
+
+	rst_rsn = i2c_smbus_read_byte_data(data->i2c_client, BMC_CMD_RST_RSN);
+	if (rst_rsn < 0)
+		return rst_rsn;
+
+	if (rst_rsn == 0x02)
+		data->wdt.bootstatus |= WDIOF_CARDRESET;
+	else if (rst_rsn == 0x05)
+		data->wdt.bootstatus |= WDIOF_EXTERN1;
+	else if (rst_rsn == 0x06)
+		data->wdt.bootstatus |= WDIOF_EXTERN2;
+	else if (rst_rsn == 0x0A)
+		data->wdt.bootstatus |= WDIOF_POWERUNDER;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_start(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_ON);
+}
+
+static int menf21bmc_wdt_stop(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static int
+menf21bmc_wdt_settimeout(struct watchdog_device *wdt, unsigned int timeout)
+{
+	int ret;
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	/*
+	 *  BMC Watchdog does have a resolution of 100ms.
+	 *  Watchdog API defines the timeout in seconds, so we have to
+	 *  multiply the value.
+	 */
+	ret = i2c_smbus_write_word_data(drv_data->i2c_client,
+						BMC_CMD_WD_TIME, timeout * 10);
+	if (ret < 0)
+		return ret;
+
+	wdt->timeout = timeout;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_ping(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_TRIG);
+}
+
+static const struct watchdog_info menf21bmc_wdt_info = {
+	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
+	.identity = DEVNAME,
+};
+
+static const struct watchdog_ops menf21bmc_wdt_ops = {
+	.owner		= THIS_MODULE,
+	.start		= menf21bmc_wdt_start,
+	.stop		= menf21bmc_wdt_stop,
+	.ping		= menf21bmc_wdt_ping,
+	.set_timeout	= menf21bmc_wdt_settimeout,
+};
+
+static int menf21bmc_wdt_probe(struct platform_device *pdev)
+{
+	int ret, bmc_timeout;
+	struct menf21bmc_wdt *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	drv_data = devm_kzalloc(&pdev->dev,
+				sizeof(struct menf21bmc_wdt), GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->wdt.ops = &menf21bmc_wdt_ops;
+	drv_data->wdt.info = &menf21bmc_wdt_info;
+	drv_data->wdt.min_timeout = BMC_WD_TIMEOUT_MIN;
+	drv_data->wdt.max_timeout = BMC_WD_TIMEOUT_MAX;
+	drv_data->i2c_client = i2c_client;
+
+	/*
+	 * Get the current wdt timeout value from the BMC because
+	 * the BMC will save the value set before if the system restarts.
+	 */
+	bmc_timeout = i2c_smbus_read_word_data(drv_data->i2c_client,
+							BMC_CMD_WD_TIME);
+	if (bmc_timeout < 0) {
+		dev_err(&pdev->dev, "failed to get current WDT timeout\n");
+		return bmc_timeout;
+	}
+
+	watchdog_init_timeout(&drv_data->wdt, bmc_timeout / 10, &pdev->dev);
+	watchdog_set_nowayout(&drv_data->wdt, nowayout);
+	watchdog_set_drvdata(&drv_data->wdt, drv_data);
+	platform_set_drvdata(pdev, drv_data);
+
+	ret = menf21bmc_wdt_set_bootstatus(drv_data);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "failed to set Watchdog bootstatus\n");
+		return ret;
+	}
+
+	ret = watchdog_register_device(&drv_data->wdt);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register Watchdog device\n");
+		return ret;
+	}
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC Watchdog device enabled\n");
+
+	return 0;
+}
+
+static int menf21bmc_wdt_remove(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	dev_warn(&pdev->dev,
+		"Unregister MEN 14F021P00 BMC Watchdog device, board may reset\n");
+
+	watchdog_unregister_device(&drv_data->wdt);
+
+	return 0;
+}
+
+static void menf21bmc_wdt_shutdown(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	i2c_smbus_write_word_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static struct  platform_driver menf21bmc_wdt = {
+	.driver		= {
+		.owner = THIS_MODULE,
+		.name	= DEVNAME,
+	},
+	.probe		= menf21bmc_wdt_probe,
+	.remove		= menf21bmc_wdt_remove,
+	.shutdown	= menf21bmc_wdt_shutdown,
+};
+
+module_platform_driver(menf21bmc_wdt);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC Watchdog driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_wdt");
-- 
2.0.4


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

* [lm-sensors] [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog dri
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Watchdog.
The BMC is a Board Management Controller including watchdog functionality.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/watchdog/Kconfig         |   7 ++
 drivers/watchdog/Makefile        |   1 +
 drivers/watchdog/menf21bmc_wdt.c | 203 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 211 insertions(+)
 create mode 100644 drivers/watchdog/menf21bmc_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 76dd541..f96431d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -95,6 +95,13 @@ config GPIO_WATCHDOG
 	  If you say yes here you get support for watchdog device
 	  controlled through GPIO-line.
 
+config MENF21BMC_WATCHDOG
+	tristate "MEN 14F021P00 BMC Watchdog"
+	depends on MFD_MENF21BMC
+	select WATCHDOG_CORE
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC Watchdog.
+
 config WM831X_WATCHDOG
 	tristate "WM831x watchdog"
 	depends on MFD_WM831X
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 468c320..de17014 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -178,3 +178,4 @@ obj-$(CONFIG_WM831X_WATCHDOG) += wm831x_wdt.o
 obj-$(CONFIG_WM8350_WATCHDOG) += wm8350_wdt.o
 obj-$(CONFIG_MAX63XX_WATCHDOG) += max63xx_wdt.o
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
+obj-$(CONFIG_MENF21BMC_WATCHDOG) += menf21bmc_wdt.o
diff --git a/drivers/watchdog/menf21bmc_wdt.c b/drivers/watchdog/menf21bmc_wdt.c
new file mode 100644
index 0000000..604824d
--- /dev/null
+++ b/drivers/watchdog/menf21bmc_wdt.c
@@ -0,0 +1,203 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) Watchdog Driver.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/watchdog.h>
+#include <linux/platform_device.h>
+#include <linux/i2c.h>
+
+#define DEVNAME "menf21bmc_wdt"
+
+#define BMC_CMD_WD_ON		0x11
+#define BMC_CMD_WD_OFF		0x12
+#define BMC_CMD_WD_TRIG		0x13
+#define BMC_CMD_WD_TIME		0x14
+#define BMC_CMD_WD_STATE	0x17
+#define BMC_WD_OFF_VAL		0x69
+#define BMC_CMD_RST_RSN		0x92
+
+#define BMC_WD_TIMEOUT_MIN	1	/* in sec */
+#define BMC_WD_TIMEOUT_MAX	6553	/* in sec */
+
+static bool nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+struct menf21bmc_wdt {
+	struct watchdog_device wdt;
+	struct i2c_client *i2c_client;
+};
+
+static int menf21bmc_wdt_set_bootstatus(struct menf21bmc_wdt *data)
+{
+	int rst_rsn;
+
+	rst_rsn = i2c_smbus_read_byte_data(data->i2c_client, BMC_CMD_RST_RSN);
+	if (rst_rsn < 0)
+		return rst_rsn;
+
+	if (rst_rsn = 0x02)
+		data->wdt.bootstatus |= WDIOF_CARDRESET;
+	else if (rst_rsn = 0x05)
+		data->wdt.bootstatus |= WDIOF_EXTERN1;
+	else if (rst_rsn = 0x06)
+		data->wdt.bootstatus |= WDIOF_EXTERN2;
+	else if (rst_rsn = 0x0A)
+		data->wdt.bootstatus |= WDIOF_POWERUNDER;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_start(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_ON);
+}
+
+static int menf21bmc_wdt_stop(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static int
+menf21bmc_wdt_settimeout(struct watchdog_device *wdt, unsigned int timeout)
+{
+	int ret;
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	/*
+	 *  BMC Watchdog does have a resolution of 100ms.
+	 *  Watchdog API defines the timeout in seconds, so we have to
+	 *  multiply the value.
+	 */
+	ret = i2c_smbus_write_word_data(drv_data->i2c_client,
+						BMC_CMD_WD_TIME, timeout * 10);
+	if (ret < 0)
+		return ret;
+
+	wdt->timeout = timeout;
+
+	return 0;
+}
+
+static int menf21bmc_wdt_ping(struct watchdog_device *wdt)
+{
+	struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt);
+
+	return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_TRIG);
+}
+
+static const struct watchdog_info menf21bmc_wdt_info = {
+	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
+	.identity = DEVNAME,
+};
+
+static const struct watchdog_ops menf21bmc_wdt_ops = {
+	.owner		= THIS_MODULE,
+	.start		= menf21bmc_wdt_start,
+	.stop		= menf21bmc_wdt_stop,
+	.ping		= menf21bmc_wdt_ping,
+	.set_timeout	= menf21bmc_wdt_settimeout,
+};
+
+static int menf21bmc_wdt_probe(struct platform_device *pdev)
+{
+	int ret, bmc_timeout;
+	struct menf21bmc_wdt *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	drv_data = devm_kzalloc(&pdev->dev,
+				sizeof(struct menf21bmc_wdt), GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->wdt.ops = &menf21bmc_wdt_ops;
+	drv_data->wdt.info = &menf21bmc_wdt_info;
+	drv_data->wdt.min_timeout = BMC_WD_TIMEOUT_MIN;
+	drv_data->wdt.max_timeout = BMC_WD_TIMEOUT_MAX;
+	drv_data->i2c_client = i2c_client;
+
+	/*
+	 * Get the current wdt timeout value from the BMC because
+	 * the BMC will save the value set before if the system restarts.
+	 */
+	bmc_timeout = i2c_smbus_read_word_data(drv_data->i2c_client,
+							BMC_CMD_WD_TIME);
+	if (bmc_timeout < 0) {
+		dev_err(&pdev->dev, "failed to get current WDT timeout\n");
+		return bmc_timeout;
+	}
+
+	watchdog_init_timeout(&drv_data->wdt, bmc_timeout / 10, &pdev->dev);
+	watchdog_set_nowayout(&drv_data->wdt, nowayout);
+	watchdog_set_drvdata(&drv_data->wdt, drv_data);
+	platform_set_drvdata(pdev, drv_data);
+
+	ret = menf21bmc_wdt_set_bootstatus(drv_data);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "failed to set Watchdog bootstatus\n");
+		return ret;
+	}
+
+	ret = watchdog_register_device(&drv_data->wdt);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register Watchdog device\n");
+		return ret;
+	}
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC Watchdog device enabled\n");
+
+	return 0;
+}
+
+static int menf21bmc_wdt_remove(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	dev_warn(&pdev->dev,
+		"Unregister MEN 14F021P00 BMC Watchdog device, board may reset\n");
+
+	watchdog_unregister_device(&drv_data->wdt);
+
+	return 0;
+}
+
+static void menf21bmc_wdt_shutdown(struct platform_device *pdev)
+{
+	struct menf21bmc_wdt *drv_data = platform_get_drvdata(pdev);
+
+	i2c_smbus_write_word_data(drv_data->i2c_client,
+					BMC_CMD_WD_OFF, BMC_WD_OFF_VAL);
+}
+
+static struct  platform_driver menf21bmc_wdt = {
+	.driver		= {
+		.owner = THIS_MODULE,
+		.name	= DEVNAME,
+	},
+	.probe		= menf21bmc_wdt_probe,
+	.remove		= menf21bmc_wdt_remove,
+	.shutdown	= menf21bmc_wdt_shutdown,
+};
+
+module_platform_driver(menf21bmc_wdt);
+
+MODULE_DESCRIPTION("MEN 14F021P00 BMC Watchdog driver");
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_wdt");
-- 
2.0.4


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* [PATCH v5 3/4] drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
  2014-08-26 17:45 ` Andreas Werner
  (?)
@ 2014-08-26 17:46   ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC LEDs.
The BMC is a Board Management Controller including four LEDs which
can be switched on and off.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 drivers/leds/Kconfig          |   6 ++
 drivers/leds/Makefile         |   1 +
 drivers/leds/leds-menf21bmc.c | 131 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 138 insertions(+)
 create mode 100644 drivers/leds/leds-menf21bmc.c

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 27cf0cd..d38ff3f 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -458,6 +458,12 @@ config LEDS_OT200
 	  This option enables support for the LEDs on the Bachmann OT200.
 	  Say Y to enable LEDs on the Bachmann OT200.
 
+config LEDS_MENF21BMC
+	tristate "LED support for the MEN 14F021P00 BMC"
+	depends on LEDS_CLASS && MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC LEDs.
+
 comment "LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)"
 
 config LEDS_BLINKM
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 3c03666..cadc433 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -53,6 +53,7 @@ obj-$(CONFIG_LEDS_MAX8997)		+= leds-max8997.o
 obj-$(CONFIG_LEDS_LM355x)		+= leds-lm355x.o
 obj-$(CONFIG_LEDS_BLINKM)		+= leds-blinkm.o
 obj-$(CONFIG_LEDS_VERSATILE)		+= leds-versatile.o
+obj-$(CONFIG_LEDS_MENF21BMC)		+= leds-menf21bmc.o
 
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
diff --git a/drivers/leds/leds-menf21bmc.c b/drivers/leds/leds-menf21bmc.c
new file mode 100644
index 0000000..4621f72
--- /dev/null
+++ b/drivers/leds/leds-menf21bmc.c
@@ -0,0 +1,131 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) LEDs Driver.
+ *
+ *  This is the core LED driver of the MEN 14F021P00 BMC.
+ *  There are four LEDs available which can be switched on and off.
+ *  STATUS LED, HOT SWAP LED, USER LED 1, USER LED 2
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/i2c.h>
+
+#define BMC_CMD_LED_GET_SET	0xA0
+#define BMC_BIT_LED_STATUS	BIT(0)
+#define BMC_BIT_LED_HOTSWAP	BIT(1)
+#define BMC_BIT_LED_USER1	BIT(2)
+#define BMC_BIT_LED_USER2	BIT(3)
+
+struct menf21bmc_led {
+	struct led_classdev cdev;
+	u8 led_bit;
+	const char *name;
+	struct i2c_client *i2c_client;
+};
+
+static struct menf21bmc_led leds[] = {
+	{
+		.name = "menf21bmc:led_status",
+		.led_bit = BMC_BIT_LED_STATUS,
+	},
+	{
+		.name = "menf21bmc:led_hotswap",
+		.led_bit = BMC_BIT_LED_HOTSWAP,
+	},
+	{
+		.name = "menf21bmc:led_user1",
+		.led_bit = BMC_BIT_LED_USER1,
+	},
+	{
+		.name = "menf21bmc:led_user2",
+		.led_bit = BMC_BIT_LED_USER2,
+	}
+};
+
+static DEFINE_MUTEX(led_lock);
+
+static void
+menf21bmc_led_set(struct led_classdev *led_cdev, enum led_brightness value)
+{
+	int led_val;
+	struct menf21bmc_led *led = container_of(led_cdev,
+					struct menf21bmc_led, cdev);
+
+	mutex_lock(&led_lock);
+	led_val = i2c_smbus_read_byte_data(led->i2c_client,
+						BMC_CMD_LED_GET_SET);
+	if (led_val < 0)
+		goto err_out;
+
+	if (value == LED_OFF)
+		led_val &= ~led->led_bit;
+	else
+		led_val |= led->led_bit;
+
+	i2c_smbus_write_byte_data(led->i2c_client,
+					BMC_CMD_LED_GET_SET, led_val);
+err_out:
+	mutex_unlock(&led_lock);
+}
+
+static int menf21bmc_led_probe(struct platform_device *pdev)
+{
+	int i;
+	int ret;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++) {
+		leds[i].cdev.name = leds[i].name;
+		leds[i].cdev.brightness_set = menf21bmc_led_set;
+		leds[i].i2c_client = i2c_client;
+		ret = led_classdev_register(&pdev->dev, &leds[i].cdev);
+		if (ret < 0)
+			goto err_free_leds;
+	}
+	dev_info(&pdev->dev, "MEN 140F21P00 BMC LED device enabled\n");
+
+	return 0;
+
+err_free_leds:
+	dev_err(&pdev->dev, "failed to register LED device\n");
+
+	for (i = i - 1; i >= 0; i--)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return ret;
+}
+
+static int menf21bmc_led_remove(struct platform_device *pdev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_led = {
+	.probe		= menf21bmc_led_probe,
+	.remove		= menf21bmc_led_remove,
+	.driver		= {
+		.name		= "menf21bmc_led",
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_led);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC led driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_led");
-- 
2.0.4

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

* [PATCH v5 3/4] drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC LEDs.
The BMC is a Board Management Controller including four LEDs which
can be switched on and off.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 drivers/leds/Kconfig          |   6 ++
 drivers/leds/Makefile         |   1 +
 drivers/leds/leds-menf21bmc.c | 131 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 138 insertions(+)
 create mode 100644 drivers/leds/leds-menf21bmc.c

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 27cf0cd..d38ff3f 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -458,6 +458,12 @@ config LEDS_OT200
 	  This option enables support for the LEDs on the Bachmann OT200.
 	  Say Y to enable LEDs on the Bachmann OT200.
 
+config LEDS_MENF21BMC
+	tristate "LED support for the MEN 14F021P00 BMC"
+	depends on LEDS_CLASS && MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC LEDs.
+
 comment "LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)"
 
 config LEDS_BLINKM
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 3c03666..cadc433 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -53,6 +53,7 @@ obj-$(CONFIG_LEDS_MAX8997)		+= leds-max8997.o
 obj-$(CONFIG_LEDS_LM355x)		+= leds-lm355x.o
 obj-$(CONFIG_LEDS_BLINKM)		+= leds-blinkm.o
 obj-$(CONFIG_LEDS_VERSATILE)		+= leds-versatile.o
+obj-$(CONFIG_LEDS_MENF21BMC)		+= leds-menf21bmc.o
 
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
diff --git a/drivers/leds/leds-menf21bmc.c b/drivers/leds/leds-menf21bmc.c
new file mode 100644
index 0000000..4621f72
--- /dev/null
+++ b/drivers/leds/leds-menf21bmc.c
@@ -0,0 +1,131 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) LEDs Driver.
+ *
+ *  This is the core LED driver of the MEN 14F021P00 BMC.
+ *  There are four LEDs available which can be switched on and off.
+ *  STATUS LED, HOT SWAP LED, USER LED 1, USER LED 2
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/i2c.h>
+
+#define BMC_CMD_LED_GET_SET	0xA0
+#define BMC_BIT_LED_STATUS	BIT(0)
+#define BMC_BIT_LED_HOTSWAP	BIT(1)
+#define BMC_BIT_LED_USER1	BIT(2)
+#define BMC_BIT_LED_USER2	BIT(3)
+
+struct menf21bmc_led {
+	struct led_classdev cdev;
+	u8 led_bit;
+	const char *name;
+	struct i2c_client *i2c_client;
+};
+
+static struct menf21bmc_led leds[] = {
+	{
+		.name = "menf21bmc:led_status",
+		.led_bit = BMC_BIT_LED_STATUS,
+	},
+	{
+		.name = "menf21bmc:led_hotswap",
+		.led_bit = BMC_BIT_LED_HOTSWAP,
+	},
+	{
+		.name = "menf21bmc:led_user1",
+		.led_bit = BMC_BIT_LED_USER1,
+	},
+	{
+		.name = "menf21bmc:led_user2",
+		.led_bit = BMC_BIT_LED_USER2,
+	}
+};
+
+static DEFINE_MUTEX(led_lock);
+
+static void
+menf21bmc_led_set(struct led_classdev *led_cdev, enum led_brightness value)
+{
+	int led_val;
+	struct menf21bmc_led *led = container_of(led_cdev,
+					struct menf21bmc_led, cdev);
+
+	mutex_lock(&led_lock);
+	led_val = i2c_smbus_read_byte_data(led->i2c_client,
+						BMC_CMD_LED_GET_SET);
+	if (led_val < 0)
+		goto err_out;
+
+	if (value == LED_OFF)
+		led_val &= ~led->led_bit;
+	else
+		led_val |= led->led_bit;
+
+	i2c_smbus_write_byte_data(led->i2c_client,
+					BMC_CMD_LED_GET_SET, led_val);
+err_out:
+	mutex_unlock(&led_lock);
+}
+
+static int menf21bmc_led_probe(struct platform_device *pdev)
+{
+	int i;
+	int ret;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++) {
+		leds[i].cdev.name = leds[i].name;
+		leds[i].cdev.brightness_set = menf21bmc_led_set;
+		leds[i].i2c_client = i2c_client;
+		ret = led_classdev_register(&pdev->dev, &leds[i].cdev);
+		if (ret < 0)
+			goto err_free_leds;
+	}
+	dev_info(&pdev->dev, "MEN 140F21P00 BMC LED device enabled\n");
+
+	return 0;
+
+err_free_leds:
+	dev_err(&pdev->dev, "failed to register LED device\n");
+
+	for (i = i - 1; i >= 0; i--)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return ret;
+}
+
+static int menf21bmc_led_remove(struct platform_device *pdev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_led = {
+	.probe		= menf21bmc_led_probe,
+	.remove		= menf21bmc_led_remove,
+	.driver		= {
+		.name		= "menf21bmc_led",
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_led);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC led driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_led");
-- 
2.0.4


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

* [lm-sensors] [PATCH v5 3/4] drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC LEDs.
The BMC is a Board Management Controller including four LEDs which
can be switched on and off.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 drivers/leds/Kconfig          |   6 ++
 drivers/leds/Makefile         |   1 +
 drivers/leds/leds-menf21bmc.c | 131 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 138 insertions(+)
 create mode 100644 drivers/leds/leds-menf21bmc.c

diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 27cf0cd..d38ff3f 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -458,6 +458,12 @@ config LEDS_OT200
 	  This option enables support for the LEDs on the Bachmann OT200.
 	  Say Y to enable LEDs on the Bachmann OT200.
 
+config LEDS_MENF21BMC
+	tristate "LED support for the MEN 14F021P00 BMC"
+	depends on LEDS_CLASS && MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC LEDs.
+
 comment "LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)"
 
 config LEDS_BLINKM
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 3c03666..cadc433 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -53,6 +53,7 @@ obj-$(CONFIG_LEDS_MAX8997)		+= leds-max8997.o
 obj-$(CONFIG_LEDS_LM355x)		+= leds-lm355x.o
 obj-$(CONFIG_LEDS_BLINKM)		+= leds-blinkm.o
 obj-$(CONFIG_LEDS_VERSATILE)		+= leds-versatile.o
+obj-$(CONFIG_LEDS_MENF21BMC)		+= leds-menf21bmc.o
 
 # LED SPI Drivers
 obj-$(CONFIG_LEDS_DAC124S085)		+= leds-dac124s085.o
diff --git a/drivers/leds/leds-menf21bmc.c b/drivers/leds/leds-menf21bmc.c
new file mode 100644
index 0000000..4621f72
--- /dev/null
+++ b/drivers/leds/leds-menf21bmc.c
@@ -0,0 +1,131 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) LEDs Driver.
+ *
+ *  This is the core LED driver of the MEN 14F021P00 BMC.
+ *  There are four LEDs available which can be switched on and off.
+ *  STATUS LED, HOT SWAP LED, USER LED 1, USER LED 2
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/i2c.h>
+
+#define BMC_CMD_LED_GET_SET	0xA0
+#define BMC_BIT_LED_STATUS	BIT(0)
+#define BMC_BIT_LED_HOTSWAP	BIT(1)
+#define BMC_BIT_LED_USER1	BIT(2)
+#define BMC_BIT_LED_USER2	BIT(3)
+
+struct menf21bmc_led {
+	struct led_classdev cdev;
+	u8 led_bit;
+	const char *name;
+	struct i2c_client *i2c_client;
+};
+
+static struct menf21bmc_led leds[] = {
+	{
+		.name = "menf21bmc:led_status",
+		.led_bit = BMC_BIT_LED_STATUS,
+	},
+	{
+		.name = "menf21bmc:led_hotswap",
+		.led_bit = BMC_BIT_LED_HOTSWAP,
+	},
+	{
+		.name = "menf21bmc:led_user1",
+		.led_bit = BMC_BIT_LED_USER1,
+	},
+	{
+		.name = "menf21bmc:led_user2",
+		.led_bit = BMC_BIT_LED_USER2,
+	}
+};
+
+static DEFINE_MUTEX(led_lock);
+
+static void
+menf21bmc_led_set(struct led_classdev *led_cdev, enum led_brightness value)
+{
+	int led_val;
+	struct menf21bmc_led *led = container_of(led_cdev,
+					struct menf21bmc_led, cdev);
+
+	mutex_lock(&led_lock);
+	led_val = i2c_smbus_read_byte_data(led->i2c_client,
+						BMC_CMD_LED_GET_SET);
+	if (led_val < 0)
+		goto err_out;
+
+	if (value = LED_OFF)
+		led_val &= ~led->led_bit;
+	else
+		led_val |= led->led_bit;
+
+	i2c_smbus_write_byte_data(led->i2c_client,
+					BMC_CMD_LED_GET_SET, led_val);
+err_out:
+	mutex_unlock(&led_lock);
+}
+
+static int menf21bmc_led_probe(struct platform_device *pdev)
+{
+	int i;
+	int ret;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++) {
+		leds[i].cdev.name = leds[i].name;
+		leds[i].cdev.brightness_set = menf21bmc_led_set;
+		leds[i].i2c_client = i2c_client;
+		ret = led_classdev_register(&pdev->dev, &leds[i].cdev);
+		if (ret < 0)
+			goto err_free_leds;
+	}
+	dev_info(&pdev->dev, "MEN 140F21P00 BMC LED device enabled\n");
+
+	return 0;
+
+err_free_leds:
+	dev_err(&pdev->dev, "failed to register LED device\n");
+
+	for (i = i - 1; i >= 0; i--)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return ret;
+}
+
+static int menf21bmc_led_remove(struct platform_device *pdev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(leds); i++)
+		led_classdev_unregister(&leds[i].cdev);
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_led = {
+	.probe		= menf21bmc_led_probe,
+	.remove		= menf21bmc_led_remove,
+	.driver		= {
+		.name		= "menf21bmc_led",
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_led);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC led driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_led");
-- 
2.0.4


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
  2014-08-26 17:45 ` Andreas Werner
  (?)
@ 2014-08-26 17:46   ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Hardware Monitoring.
The BMC is a Board Management Controller including monitoring of the
board voltages.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 Documentation/hwmon/menf21bmc   |  49 +++++++++
 drivers/hwmon/Kconfig           |   7 ++
 drivers/hwmon/Makefile          |   1 +
 drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 287 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c

diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
new file mode 100644
index 0000000..22b6840
--- /dev/null
+++ b/Documentation/hwmon/menf21bmc
@@ -0,0 +1,49 @@
+Kernel driver menf21bmc_hwmon
+=============================
+
+Supported chips:
+	* MEN 14F021P00
+	  Prefix: 'menf21bmc_hwmon'
+	  Adresses scanned: -
+
+Author: Andreas Werner <andreas.werner@men.de>
+
+Description
+-----------
+
+The menf21bmc is a Board Management Controller (BMC) which provides an I2C
+interface to the host to access the features implemented in the BMC.
+
+This driver gives access to the voltage monitoring feature of the main
+voltages of the board.
+The voltage sensors are connected to the ADC inputs of the BMC which is
+a PIC16F917 Mikrocontroller.
+
+Usage Notes
+-----------
+
+This driver does not auto-detect devices. You will have to instantiate the
+devices explicitly. Please see Documentation/i2c/instantiating-devices for
+details.
+
+Sysfs entries
+-------------
+
+The following attributes are supported. All attributes are read only
+The Limits are read once by the driver.
+
+in0_input	+3.3V input voltage
+in1_input	+5.0V input voltage
+in2_input	+12.0V input voltage
+in3_input	+5V Standby input voltage
+in4_input	VBAT (on board battery)
+
+in[0-4]_min	Minimum voltage limit
+in[0-4]_max	Maximum voltage limit
+
+in0_label	"MON_3_3V"
+in1_label	"MON_5V"
+in2_label	"MON_12V"
+in3_label	"5V_STANDBY"
+in4_label	"VBAT"
+
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 37908ff..db3a6eb 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -828,6 +828,13 @@ config SENSORS_MCP3021
 	  This driver can also be built as a module.  If so, the module
 	  will be called mcp3021.
 
+config SENSORS_MENF21BMC_HWMON
+	tristate "MEN 14F021P00 BMC Hardware Monitoring"
+	depends on MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC
+	  hardware monitoring.
+
 config SENSORS_ADCXX
 	tristate "National Semiconductor ADCxxxSxxx"
 	depends on SPI_MASTER
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 1362382..56ab872 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
 obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
 obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
 obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
+obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
 obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
 obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
 obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
new file mode 100644
index 0000000..2eaec6a
--- /dev/null
+++ b/drivers/hwmon/menf21bmc_hwmon.c
@@ -0,0 +1,230 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
+ *
+ *  This is the core hwmon driver of the MEN 14F021P00 BMC.
+ *  The BMC monitors the board voltages which can be access with this
+ *  driver through sysfs.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/jiffies.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#define DRV_NAME  "menf21bmc_hwmon"
+
+#define BMC_VOLT_COUNT	5
+#define MENF21BMC_V33	0
+#define MENF21BMC_V5	1
+#define MENF21BMC_V12	2
+#define MENF21BMC_V5_SB	3
+#define MENF21BMC_VBAT	4
+
+#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
+#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
+#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
+
+struct menf21bmc_hwmon {
+	char valid;
+	struct i2c_client *i2c_client;
+	unsigned long last_update;
+	u16 in_val[BMC_VOLT_COUNT];
+	u16 in_min[BMC_VOLT_COUNT];
+	u16 in_max[BMC_VOLT_COUNT];
+};
+
+static const char *const input_names[] = {
+	[MENF21BMC_V33]		= "MON_3_3V",
+	[MENF21BMC_V5]		= "MON_5V",
+	[MENF21BMC_V12]		= "MON_12V",
+	[MENF21BMC_V5_SB]	= "5V_STANDBY",
+	[MENF21BMC_VBAT]	= "VBAT"
+};
+
+static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
+{
+	int i;
+	uint16_t val;
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+	struct menf21bmc_hwmon *data_ret = drv_data;
+
+	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
+		for (i = 0; i < BMC_VOLT_COUNT; i++) {
+			val = i2c_smbus_read_word_data(drv_data->i2c_client,
+						       IDX_TO_VOLT_INP_CMD(i));
+			if (val < 0) {
+				data_ret = ERR_PTR(val);
+				goto abort;
+			}
+			drv_data->in_val[i] = val;
+		}
+		drv_data->last_update = jiffies;
+		drv_data->valid = 1;
+	}
+abort:
+	return data_ret;
+}
+
+static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
+{
+	int i;
+	uint16_t val;
+
+	for (i = 0; i < BMC_VOLT_COUNT; i++) {
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MIN_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_min[i] = val;
+
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MAX_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_max[i] = val;
+	}
+	return 0;
+}
+
+static ssize_t
+show_label(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+
+	return sprintf(buf, "%s\n", input_names[attr->index]);
+}
+
+static ssize_t
+show_in(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
+
+	if (IS_ERR(drv_data))
+		return PTR_ERR(drv_data);
+
+	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
+}
+
+static ssize_t
+show_min(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
+}
+
+static ssize_t
+show_max(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
+}
+
+#define create_voltage_sysfs(idx)			\
+static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
+			show_in, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
+			show_min, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
+			show_max, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
+			show_label, NULL, idx);
+
+create_voltage_sysfs(0);
+create_voltage_sysfs(1);
+create_voltage_sysfs(2);
+create_voltage_sysfs(3);
+create_voltage_sysfs(4);
+
+static struct attribute *menf21bmc_hwmon_attrs[] = {
+	&sensor_dev_attr_in0_input.dev_attr.attr,
+	&sensor_dev_attr_in0_min.dev_attr.attr,
+	&sensor_dev_attr_in0_max.dev_attr.attr,
+	&sensor_dev_attr_in0_label.dev_attr.attr,
+
+	&sensor_dev_attr_in1_input.dev_attr.attr,
+	&sensor_dev_attr_in1_min.dev_attr.attr,
+	&sensor_dev_attr_in1_max.dev_attr.attr,
+	&sensor_dev_attr_in1_label.dev_attr.attr,
+
+	&sensor_dev_attr_in2_input.dev_attr.attr,
+	&sensor_dev_attr_in2_min.dev_attr.attr,
+	&sensor_dev_attr_in2_max.dev_attr.attr,
+	&sensor_dev_attr_in2_label.dev_attr.attr,
+
+	&sensor_dev_attr_in3_input.dev_attr.attr,
+	&sensor_dev_attr_in3_min.dev_attr.attr,
+	&sensor_dev_attr_in3_max.dev_attr.attr,
+	&sensor_dev_attr_in3_label.dev_attr.attr,
+
+	&sensor_dev_attr_in4_input.dev_attr.attr,
+	&sensor_dev_attr_in4_min.dev_attr.attr,
+	&sensor_dev_attr_in4_max.dev_attr.attr,
+	&sensor_dev_attr_in4_label.dev_attr.attr,
+	NULL
+};
+
+ATTRIBUTE_GROUPS(menf21bmc_hwmon);
+
+static int menf21bmc_hwmon_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct menf21bmc_hwmon *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+	struct device *hwmon_dev;
+
+	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
+				GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->i2c_client = i2c_client;
+
+	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to read sensor limits");
+		return ret;
+	}
+
+	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
+							   "menf21bmc", drv_data,
+							   menf21bmc_hwmon_groups);
+	if (IS_ERR(hwmon_dev))
+		return PTR_ERR(hwmon_dev);
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_hwmon = {
+	.probe		= menf21bmc_hwmon_probe,
+	.driver		= {
+		.name		= DRV_NAME,
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_hwmon);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_hwmon");
-- 
2.0.4

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

* [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Hardware Monitoring.
The BMC is a Board Management Controller including monitoring of the
board voltages.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 Documentation/hwmon/menf21bmc   |  49 +++++++++
 drivers/hwmon/Kconfig           |   7 ++
 drivers/hwmon/Makefile          |   1 +
 drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 287 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c

diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
new file mode 100644
index 0000000..22b6840
--- /dev/null
+++ b/Documentation/hwmon/menf21bmc
@@ -0,0 +1,49 @@
+Kernel driver menf21bmc_hwmon
+=============================
+
+Supported chips:
+	* MEN 14F021P00
+	  Prefix: 'menf21bmc_hwmon'
+	  Adresses scanned: -
+
+Author: Andreas Werner <andreas.werner@men.de>
+
+Description
+-----------
+
+The menf21bmc is a Board Management Controller (BMC) which provides an I2C
+interface to the host to access the features implemented in the BMC.
+
+This driver gives access to the voltage monitoring feature of the main
+voltages of the board.
+The voltage sensors are connected to the ADC inputs of the BMC which is
+a PIC16F917 Mikrocontroller.
+
+Usage Notes
+-----------
+
+This driver does not auto-detect devices. You will have to instantiate the
+devices explicitly. Please see Documentation/i2c/instantiating-devices for
+details.
+
+Sysfs entries
+-------------
+
+The following attributes are supported. All attributes are read only
+The Limits are read once by the driver.
+
+in0_input	+3.3V input voltage
+in1_input	+5.0V input voltage
+in2_input	+12.0V input voltage
+in3_input	+5V Standby input voltage
+in4_input	VBAT (on board battery)
+
+in[0-4]_min	Minimum voltage limit
+in[0-4]_max	Maximum voltage limit
+
+in0_label	"MON_3_3V"
+in1_label	"MON_5V"
+in2_label	"MON_12V"
+in3_label	"5V_STANDBY"
+in4_label	"VBAT"
+
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 37908ff..db3a6eb 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -828,6 +828,13 @@ config SENSORS_MCP3021
 	  This driver can also be built as a module.  If so, the module
 	  will be called mcp3021.
 
+config SENSORS_MENF21BMC_HWMON
+	tristate "MEN 14F021P00 BMC Hardware Monitoring"
+	depends on MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC
+	  hardware monitoring.
+
 config SENSORS_ADCXX
 	tristate "National Semiconductor ADCxxxSxxx"
 	depends on SPI_MASTER
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 1362382..56ab872 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
 obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
 obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
 obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
+obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
 obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
 obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
 obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
new file mode 100644
index 0000000..2eaec6a
--- /dev/null
+++ b/drivers/hwmon/menf21bmc_hwmon.c
@@ -0,0 +1,230 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
+ *
+ *  This is the core hwmon driver of the MEN 14F021P00 BMC.
+ *  The BMC monitors the board voltages which can be access with this
+ *  driver through sysfs.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/jiffies.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#define DRV_NAME  "menf21bmc_hwmon"
+
+#define BMC_VOLT_COUNT	5
+#define MENF21BMC_V33	0
+#define MENF21BMC_V5	1
+#define MENF21BMC_V12	2
+#define MENF21BMC_V5_SB	3
+#define MENF21BMC_VBAT	4
+
+#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
+#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
+#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
+
+struct menf21bmc_hwmon {
+	char valid;
+	struct i2c_client *i2c_client;
+	unsigned long last_update;
+	u16 in_val[BMC_VOLT_COUNT];
+	u16 in_min[BMC_VOLT_COUNT];
+	u16 in_max[BMC_VOLT_COUNT];
+};
+
+static const char *const input_names[] = {
+	[MENF21BMC_V33]		= "MON_3_3V",
+	[MENF21BMC_V5]		= "MON_5V",
+	[MENF21BMC_V12]		= "MON_12V",
+	[MENF21BMC_V5_SB]	= "5V_STANDBY",
+	[MENF21BMC_VBAT]	= "VBAT"
+};
+
+static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
+{
+	int i;
+	uint16_t val;
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+	struct menf21bmc_hwmon *data_ret = drv_data;
+
+	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
+		for (i = 0; i < BMC_VOLT_COUNT; i++) {
+			val = i2c_smbus_read_word_data(drv_data->i2c_client,
+						       IDX_TO_VOLT_INP_CMD(i));
+			if (val < 0) {
+				data_ret = ERR_PTR(val);
+				goto abort;
+			}
+			drv_data->in_val[i] = val;
+		}
+		drv_data->last_update = jiffies;
+		drv_data->valid = 1;
+	}
+abort:
+	return data_ret;
+}
+
+static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
+{
+	int i;
+	uint16_t val;
+
+	for (i = 0; i < BMC_VOLT_COUNT; i++) {
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MIN_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_min[i] = val;
+
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MAX_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_max[i] = val;
+	}
+	return 0;
+}
+
+static ssize_t
+show_label(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+
+	return sprintf(buf, "%s\n", input_names[attr->index]);
+}
+
+static ssize_t
+show_in(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
+
+	if (IS_ERR(drv_data))
+		return PTR_ERR(drv_data);
+
+	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
+}
+
+static ssize_t
+show_min(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
+}
+
+static ssize_t
+show_max(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
+}
+
+#define create_voltage_sysfs(idx)			\
+static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
+			show_in, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
+			show_min, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
+			show_max, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
+			show_label, NULL, idx);
+
+create_voltage_sysfs(0);
+create_voltage_sysfs(1);
+create_voltage_sysfs(2);
+create_voltage_sysfs(3);
+create_voltage_sysfs(4);
+
+static struct attribute *menf21bmc_hwmon_attrs[] = {
+	&sensor_dev_attr_in0_input.dev_attr.attr,
+	&sensor_dev_attr_in0_min.dev_attr.attr,
+	&sensor_dev_attr_in0_max.dev_attr.attr,
+	&sensor_dev_attr_in0_label.dev_attr.attr,
+
+	&sensor_dev_attr_in1_input.dev_attr.attr,
+	&sensor_dev_attr_in1_min.dev_attr.attr,
+	&sensor_dev_attr_in1_max.dev_attr.attr,
+	&sensor_dev_attr_in1_label.dev_attr.attr,
+
+	&sensor_dev_attr_in2_input.dev_attr.attr,
+	&sensor_dev_attr_in2_min.dev_attr.attr,
+	&sensor_dev_attr_in2_max.dev_attr.attr,
+	&sensor_dev_attr_in2_label.dev_attr.attr,
+
+	&sensor_dev_attr_in3_input.dev_attr.attr,
+	&sensor_dev_attr_in3_min.dev_attr.attr,
+	&sensor_dev_attr_in3_max.dev_attr.attr,
+	&sensor_dev_attr_in3_label.dev_attr.attr,
+
+	&sensor_dev_attr_in4_input.dev_attr.attr,
+	&sensor_dev_attr_in4_min.dev_attr.attr,
+	&sensor_dev_attr_in4_max.dev_attr.attr,
+	&sensor_dev_attr_in4_label.dev_attr.attr,
+	NULL
+};
+
+ATTRIBUTE_GROUPS(menf21bmc_hwmon);
+
+static int menf21bmc_hwmon_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct menf21bmc_hwmon *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+	struct device *hwmon_dev;
+
+	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
+				GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->i2c_client = i2c_client;
+
+	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to read sensor limits");
+		return ret;
+	}
+
+	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
+							   "menf21bmc", drv_data,
+							   menf21bmc_hwmon_groups);
+	if (IS_ERR(hwmon_dev))
+		return PTR_ERR(hwmon_dev);
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_hwmon = {
+	.probe		= menf21bmc_hwmon_probe,
+	.driver		= {
+		.name		= DRV_NAME,
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_hwmon);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_hwmon");
-- 
2.0.4


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

* [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
@ 2014-08-26 17:46   ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-26 17:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: sameo, lee.jones, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

Added driver to support the 14F021P00 BMC Hardware Monitoring.
The BMC is a Board Management Controller including monitoring of the
board voltages.

Signed-off-by: Andreas Werner <andreas.werner@men.de>
---
 Documentation/hwmon/menf21bmc   |  49 +++++++++
 drivers/hwmon/Kconfig           |   7 ++
 drivers/hwmon/Makefile          |   1 +
 drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 287 insertions(+)
 create mode 100644 Documentation/hwmon/menf21bmc
 create mode 100644 drivers/hwmon/menf21bmc_hwmon.c

diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
new file mode 100644
index 0000000..22b6840
--- /dev/null
+++ b/Documentation/hwmon/menf21bmc
@@ -0,0 +1,49 @@
+Kernel driver menf21bmc_hwmon
+==============+
+Supported chips:
+	* MEN 14F021P00
+	  Prefix: 'menf21bmc_hwmon'
+	  Adresses scanned: -
+
+Author: Andreas Werner <andreas.werner@men.de>
+
+Description
+-----------
+
+The menf21bmc is a Board Management Controller (BMC) which provides an I2C
+interface to the host to access the features implemented in the BMC.
+
+This driver gives access to the voltage monitoring feature of the main
+voltages of the board.
+The voltage sensors are connected to the ADC inputs of the BMC which is
+a PIC16F917 Mikrocontroller.
+
+Usage Notes
+-----------
+
+This driver does not auto-detect devices. You will have to instantiate the
+devices explicitly. Please see Documentation/i2c/instantiating-devices for
+details.
+
+Sysfs entries
+-------------
+
+The following attributes are supported. All attributes are read only
+The Limits are read once by the driver.
+
+in0_input	+3.3V input voltage
+in1_input	+5.0V input voltage
+in2_input	+12.0V input voltage
+in3_input	+5V Standby input voltage
+in4_input	VBAT (on board battery)
+
+in[0-4]_min	Minimum voltage limit
+in[0-4]_max	Maximum voltage limit
+
+in0_label	"MON_3_3V"
+in1_label	"MON_5V"
+in2_label	"MON_12V"
+in3_label	"5V_STANDBY"
+in4_label	"VBAT"
+
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 37908ff..db3a6eb 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -828,6 +828,13 @@ config SENSORS_MCP3021
 	  This driver can also be built as a module.  If so, the module
 	  will be called mcp3021.
 
+config SENSORS_MENF21BMC_HWMON
+	tristate "MEN 14F021P00 BMC Hardware Monitoring"
+	depends on MFD_MENF21BMC
+	help
+	  Say Y here to include support for the MEN 14F021P00 BMC
+	  hardware monitoring.
+
 config SENSORS_ADCXX
 	tristate "National Semiconductor ADCxxxSxxx"
 	depends on SPI_MASTER
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 1362382..56ab872 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
 obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
 obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
 obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
+obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
 obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
 obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
 obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
new file mode 100644
index 0000000..2eaec6a
--- /dev/null
+++ b/drivers/hwmon/menf21bmc_hwmon.c
@@ -0,0 +1,230 @@
+/*
+ *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
+ *
+ *  This is the core hwmon driver of the MEN 14F021P00 BMC.
+ *  The BMC monitors the board voltages which can be access with this
+ *  driver through sysfs.
+ *
+ *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/jiffies.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#define DRV_NAME  "menf21bmc_hwmon"
+
+#define BMC_VOLT_COUNT	5
+#define MENF21BMC_V33	0
+#define MENF21BMC_V5	1
+#define MENF21BMC_V12	2
+#define MENF21BMC_V5_SB	3
+#define MENF21BMC_VBAT	4
+
+#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
+#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
+#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
+
+struct menf21bmc_hwmon {
+	char valid;
+	struct i2c_client *i2c_client;
+	unsigned long last_update;
+	u16 in_val[BMC_VOLT_COUNT];
+	u16 in_min[BMC_VOLT_COUNT];
+	u16 in_max[BMC_VOLT_COUNT];
+};
+
+static const char *const input_names[] = {
+	[MENF21BMC_V33]		= "MON_3_3V",
+	[MENF21BMC_V5]		= "MON_5V",
+	[MENF21BMC_V12]		= "MON_12V",
+	[MENF21BMC_V5_SB]	= "5V_STANDBY",
+	[MENF21BMC_VBAT]	= "VBAT"
+};
+
+static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
+{
+	int i;
+	uint16_t val;
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+	struct menf21bmc_hwmon *data_ret = drv_data;
+
+	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
+		for (i = 0; i < BMC_VOLT_COUNT; i++) {
+			val = i2c_smbus_read_word_data(drv_data->i2c_client,
+						       IDX_TO_VOLT_INP_CMD(i));
+			if (val < 0) {
+				data_ret = ERR_PTR(val);
+				goto abort;
+			}
+			drv_data->in_val[i] = val;
+		}
+		drv_data->last_update = jiffies;
+		drv_data->valid = 1;
+	}
+abort:
+	return data_ret;
+}
+
+static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
+{
+	int i;
+	uint16_t val;
+
+	for (i = 0; i < BMC_VOLT_COUNT; i++) {
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MIN_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_min[i] = val;
+
+		val = i2c_smbus_read_word_data(drv_data->i2c_client,
+					       IDX_TO_VOLT_MAX_CMD(i));
+		if (val < 0)
+			return val;
+
+		drv_data->in_max[i] = val;
+	}
+	return 0;
+}
+
+static ssize_t
+show_label(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+
+	return sprintf(buf, "%s\n", input_names[attr->index]);
+}
+
+static ssize_t
+show_in(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
+
+	if (IS_ERR(drv_data))
+		return PTR_ERR(drv_data);
+
+	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
+}
+
+static ssize_t
+show_min(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
+}
+
+static ssize_t
+show_max(struct device *dev, struct device_attribute *devattr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
+}
+
+#define create_voltage_sysfs(idx)			\
+static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
+			show_in, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
+			show_min, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
+			show_max, NULL, idx);		\
+static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
+			show_label, NULL, idx);
+
+create_voltage_sysfs(0);
+create_voltage_sysfs(1);
+create_voltage_sysfs(2);
+create_voltage_sysfs(3);
+create_voltage_sysfs(4);
+
+static struct attribute *menf21bmc_hwmon_attrs[] = {
+	&sensor_dev_attr_in0_input.dev_attr.attr,
+	&sensor_dev_attr_in0_min.dev_attr.attr,
+	&sensor_dev_attr_in0_max.dev_attr.attr,
+	&sensor_dev_attr_in0_label.dev_attr.attr,
+
+	&sensor_dev_attr_in1_input.dev_attr.attr,
+	&sensor_dev_attr_in1_min.dev_attr.attr,
+	&sensor_dev_attr_in1_max.dev_attr.attr,
+	&sensor_dev_attr_in1_label.dev_attr.attr,
+
+	&sensor_dev_attr_in2_input.dev_attr.attr,
+	&sensor_dev_attr_in2_min.dev_attr.attr,
+	&sensor_dev_attr_in2_max.dev_attr.attr,
+	&sensor_dev_attr_in2_label.dev_attr.attr,
+
+	&sensor_dev_attr_in3_input.dev_attr.attr,
+	&sensor_dev_attr_in3_min.dev_attr.attr,
+	&sensor_dev_attr_in3_max.dev_attr.attr,
+	&sensor_dev_attr_in3_label.dev_attr.attr,
+
+	&sensor_dev_attr_in4_input.dev_attr.attr,
+	&sensor_dev_attr_in4_min.dev_attr.attr,
+	&sensor_dev_attr_in4_max.dev_attr.attr,
+	&sensor_dev_attr_in4_label.dev_attr.attr,
+	NULL
+};
+
+ATTRIBUTE_GROUPS(menf21bmc_hwmon);
+
+static int menf21bmc_hwmon_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct menf21bmc_hwmon *drv_data;
+	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
+	struct device *hwmon_dev;
+
+	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
+				GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
+	drv_data->i2c_client = i2c_client;
+
+	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to read sensor limits");
+		return ret;
+	}
+
+	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
+							   "menf21bmc", drv_data,
+							   menf21bmc_hwmon_groups);
+	if (IS_ERR(hwmon_dev))
+		return PTR_ERR(hwmon_dev);
+
+	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
+
+	return 0;
+}
+
+static struct platform_driver menf21bmc_hwmon = {
+	.probe		= menf21bmc_hwmon_probe,
+	.driver		= {
+		.name		= DRV_NAME,
+		.owner		= THIS_MODULE,
+	},
+};
+
+module_platform_driver(menf21bmc_hwmon);
+
+MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
+MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:menf21bmc_hwmon");
-- 
2.0.4


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-26 17:45   ` Andreas Werner
  (?)
@ 2014-08-27  7:26     ` Lee Jones
  -1 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27  7:26 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

On Tue, 26 Aug 2014, Andreas Werner wrote:
> The MEN 14F021P00 Board Management Controller provides an
> I2C interface to the host to access the feature implemented in the BMC.
> The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> and on a few Box/Display Computer.
> 
> Added MFD Core driver, supporting the I2C communication to the device.
> 
> The MFD driver currently supports the following features:
>  	- Watchdog
>  	- LEDs
> 	- Hwmon (voltage monitoring)
> 
> Signed-off-by: Andreas Werner <andreas.werner@men.de>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> ---
>  drivers/mfd/Kconfig     |  12 +++++
>  drivers/mfd/Makefile    |   1 +
>  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 145 insertions(+)
>  create mode 100644 drivers/mfd/menf21bmc.c
> 
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index b8d9ca0..6a9f101 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -453,6 +453,18 @@ config MFD_MAX8998
>  	  additional drivers must be enabled in order to use the functionality
>  	  of the device.
>  
> +config MFD_MENF21BMC
> +	tristate "MEN 14F021P00 Board Management Controller Support"
> +	depends on I2C
> +	select MFD_CORE
> +	help
> +	  Say yes here to add support for the MEN 14F021P00 BMC
> +	  which is a Board Management Controller connected to the I2C bus.
> +	  The device supports multiple sub-devices like LED, HWMON  and WDT.

Nit: Whitespace error.

> +	  This driver provides common support for accessing the devices;
> +	  additional drivers must be enabled in order to use the
> +	  functionality of the BMC device.
> +
>  config EZX_PCAP
>  	bool "Motorola EZXPCAP Support"
>  	depends on SPI_MASTER
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 4e2bc25..37bf336 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
>  obj-$(CONFIG_MFD_AS3722)	+= as3722.o
>  obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
>  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
> +obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
>  
>  intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
>  obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
> diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
> new file mode 100644
> index 0000000..a6eb03f
> --- /dev/null
> +++ b/drivers/mfd/menf21bmc.c
> @@ -0,0 +1,132 @@
> +/*
> + *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
> + *
> + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> + *
> + *  This program is free software; you can redistribute  it and/or modify it
> + *  under  the terms of  the GNU General  Public License as published by the
> + *  Free Software Foundation;  either version 2 of the  License, or (at your
> + *  option) any later version.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/i2c.h>
> +#include <linux/mfd/core.h>
> +
> +#define BMC_CMD_WDT_EXIT_PROD	0x18
> +#define BMC_CMD_WDT_PROD_STAT	0x19
> +#define BMC_CMD_REV_MAJOR	0x80
> +#define BMC_CMD_REV_MINOR	0x81
> +#define BMC_CMD_REV_MAIN	0x82
> +
> +static struct mfd_cell menf21bmc_cell[] = {
> +	{ .name = "menf21bmc_wdt", },
> +	{ .name = "menf21bmc_led", },
> +	{ .name = "menf21bmc_hwmon", }
> +};
> +
> +static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
> +{
> +	int val, ret;
> +
> +	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
> +	if (val < 0)
> +		return val;
> +
> +	/*
> +	 * Production mode should be not active after delivery of the Board.
> +	 * To be sure we check it, inform the user and exit the mode
> +	 * if active.
> +	 */
> +	if (val == 0x00) {
> +		dev_info(&client->dev,
> +			"BMC in production mode. Exit production mode\n");
> +
> +		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
> +		if (ret < 0)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
> +{
> +	int ret;
> +	int rev_major, rev_minor, rev_main;

Really small nit (as you have to fix the whitespace err anyway):
  Can you change the order of the two lines above please?

> +	ret = i2c_check_functionality(client->adapter,
> +				      I2C_FUNC_SMBUS_BYTE_DATA |
> +				      I2C_FUNC_SMBUS_WORD_DATA |
> +				      I2C_FUNC_SMBUS_BYTE);
> +	if (!ret)
> +		return -ENODEV;
> +
> +	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
> +	if (rev_major < 0) {
> +		dev_err(&client->dev, "failed to get BMC major revision\n");
> +		return rev_major;
> +	}
> +
> +	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
> +	if (rev_minor < 0) {
> +		dev_err(&client->dev, "failed to get BMC minor revision\n");
> +		return rev_minor;
> +	}
> +
> +	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
> +	if (rev_main < 0) {
> +		dev_err(&client->dev, "failed to get BMC main revision\n");
> +		return rev_main;
> +	}
> +
> +	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
> +					rev_major, rev_minor, rev_main);

You enforced a 'line > 80 chars' warning in your other driver just so
you can 'do the right thing' and line up against the '('. :)

Can you do that here please?

> +	/*
> +	 * We have to exit the Production Mode of the BMC to activate the
> +	 * Watchdog functionality and the BIOS life sign monitoring.
> +	 */
> +	ret = menf21bmc_wdt_exit_prod_mode(client);
> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to leave production mode\n");
> +		return ret;
> +	}
> +
> +	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
> +				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);

Line up to to '('.

> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to add BMC sub-devices\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int menf21bmc_remove(struct i2c_client *client)
> +{
> +	mfd_remove_devices(&client->dev);
> +	return 0;
> +}
> +
> +static const struct i2c_device_id menf21bmc_id_table[] = {
> +	{ "menf21bmc", 0 },

The second attribute is unused in this driver, please remove it.

> +	{ }
> +};
> +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> +
> +static struct i2c_driver menf21bmc_driver = {
> +	.driver.name	= "menf21bmc",
> +	.id_table	= menf21bmc_id_table,
> +	.probe		= menf21bmc_probe,
> +	.remove		= menf21bmc_remove,
> +};

No DT support?

> +module_i2c_driver(menf21bmc_driver);
> +
> +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");

s/mfd/MFD

> +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> +MODULE_LICENSE("GPL v2");

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27  7:26     ` Lee Jones
  0 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27  7:26 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

On Tue, 26 Aug 2014, Andreas Werner wrote:
> The MEN 14F021P00 Board Management Controller provides an
> I2C interface to the host to access the feature implemented in the BMC.
> The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> and on a few Box/Display Computer.
> 
> Added MFD Core driver, supporting the I2C communication to the device.
> 
> The MFD driver currently supports the following features:
>  	- Watchdog
>  	- LEDs
> 	- Hwmon (voltage monitoring)
> 
> Signed-off-by: Andreas Werner <andreas.werner@men.de>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> ---
>  drivers/mfd/Kconfig     |  12 +++++
>  drivers/mfd/Makefile    |   1 +
>  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 145 insertions(+)
>  create mode 100644 drivers/mfd/menf21bmc.c
> 
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index b8d9ca0..6a9f101 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -453,6 +453,18 @@ config MFD_MAX8998
>  	  additional drivers must be enabled in order to use the functionality
>  	  of the device.
>  
> +config MFD_MENF21BMC
> +	tristate "MEN 14F021P00 Board Management Controller Support"
> +	depends on I2C
> +	select MFD_CORE
> +	help
> +	  Say yes here to add support for the MEN 14F021P00 BMC
> +	  which is a Board Management Controller connected to the I2C bus.
> +	  The device supports multiple sub-devices like LED, HWMON  and WDT.

Nit: Whitespace error.

> +	  This driver provides common support for accessing the devices;
> +	  additional drivers must be enabled in order to use the
> +	  functionality of the BMC device.
> +
>  config EZX_PCAP
>  	bool "Motorola EZXPCAP Support"
>  	depends on SPI_MASTER
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 4e2bc25..37bf336 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
>  obj-$(CONFIG_MFD_AS3722)	+= as3722.o
>  obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
>  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
> +obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
>  
>  intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
>  obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
> diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
> new file mode 100644
> index 0000000..a6eb03f
> --- /dev/null
> +++ b/drivers/mfd/menf21bmc.c
> @@ -0,0 +1,132 @@
> +/*
> + *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
> + *
> + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> + *
> + *  This program is free software; you can redistribute  it and/or modify it
> + *  under  the terms of  the GNU General  Public License as published by the
> + *  Free Software Foundation;  either version 2 of the  License, or (at your
> + *  option) any later version.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/i2c.h>
> +#include <linux/mfd/core.h>
> +
> +#define BMC_CMD_WDT_EXIT_PROD	0x18
> +#define BMC_CMD_WDT_PROD_STAT	0x19
> +#define BMC_CMD_REV_MAJOR	0x80
> +#define BMC_CMD_REV_MINOR	0x81
> +#define BMC_CMD_REV_MAIN	0x82
> +
> +static struct mfd_cell menf21bmc_cell[] = {
> +	{ .name = "menf21bmc_wdt", },
> +	{ .name = "menf21bmc_led", },
> +	{ .name = "menf21bmc_hwmon", }
> +};
> +
> +static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
> +{
> +	int val, ret;
> +
> +	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
> +	if (val < 0)
> +		return val;
> +
> +	/*
> +	 * Production mode should be not active after delivery of the Board.
> +	 * To be sure we check it, inform the user and exit the mode
> +	 * if active.
> +	 */
> +	if (val == 0x00) {
> +		dev_info(&client->dev,
> +			"BMC in production mode. Exit production mode\n");
> +
> +		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
> +		if (ret < 0)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
> +{
> +	int ret;
> +	int rev_major, rev_minor, rev_main;

Really small nit (as you have to fix the whitespace err anyway):
  Can you change the order of the two lines above please?

> +	ret = i2c_check_functionality(client->adapter,
> +				      I2C_FUNC_SMBUS_BYTE_DATA |
> +				      I2C_FUNC_SMBUS_WORD_DATA |
> +				      I2C_FUNC_SMBUS_BYTE);
> +	if (!ret)
> +		return -ENODEV;
> +
> +	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
> +	if (rev_major < 0) {
> +		dev_err(&client->dev, "failed to get BMC major revision\n");
> +		return rev_major;
> +	}
> +
> +	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
> +	if (rev_minor < 0) {
> +		dev_err(&client->dev, "failed to get BMC minor revision\n");
> +		return rev_minor;
> +	}
> +
> +	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
> +	if (rev_main < 0) {
> +		dev_err(&client->dev, "failed to get BMC main revision\n");
> +		return rev_main;
> +	}
> +
> +	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
> +					rev_major, rev_minor, rev_main);

You enforced a 'line > 80 chars' warning in your other driver just so
you can 'do the right thing' and line up against the '('. :)

Can you do that here please?

> +	/*
> +	 * We have to exit the Production Mode of the BMC to activate the
> +	 * Watchdog functionality and the BIOS life sign monitoring.
> +	 */
> +	ret = menf21bmc_wdt_exit_prod_mode(client);
> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to leave production mode\n");
> +		return ret;
> +	}
> +
> +	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
> +				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);

Line up to to '('.

> +	if (ret < 0) {
> +		dev_err(&client->dev, "failed to add BMC sub-devices\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int menf21bmc_remove(struct i2c_client *client)
> +{
> +	mfd_remove_devices(&client->dev);
> +	return 0;
> +}
> +
> +static const struct i2c_device_id menf21bmc_id_table[] = {
> +	{ "menf21bmc", 0 },

The second attribute is unused in this driver, please remove it.

> +	{ }
> +};
> +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> +
> +static struct i2c_driver menf21bmc_driver = {
> +	.driver.name	= "menf21bmc",
> +	.id_table	= menf21bmc_id_table,
> +	.probe		= menf21bmc_probe,
> +	.remove		= menf21bmc_remove,
> +};

No DT support?

> +module_i2c_driver(menf21bmc_driver);
> +
> +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");

s/mfd/MFD

> +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> +MODULE_LICENSE("GPL v2");

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27  7:26     ` Lee Jones
  0 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27  7:26 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

T24gVHVlLCAyNiBBdWcgMjAxNCwgQW5kcmVhcyBXZXJuZXIgd3JvdGU6Cj4gVGhlIE1FTiAxNEYw
MjFQMDAgQm9hcmQgTWFuYWdlbWVudCBDb250cm9sbGVyIHByb3ZpZGVzIGFuCj4gSTJDIGludGVy
ZmFjZSB0byB0aGUgaG9zdCB0byBhY2Nlc3MgdGhlIGZlYXR1cmUgaW1wbGVtZW50ZWQgaW4gdGhl
IEJNQy4KPiBUaGUgQk1DIGlzIGEgUElDIE1pY3JvbnRyb2xsZXIgYXNzZW1ibGVkIG9uIENQQ0kg
Q2FyZCBmcm9tIE1FTiBNaWtyb2VsZWt0cm9uaWsKPiBhbmQgb24gYSBmZXcgQm94L0Rpc3BsYXkg
Q29tcHV0ZXIuCj4gCj4gQWRkZWQgTUZEIENvcmUgZHJpdmVyLCBzdXBwb3J0aW5nIHRoZSBJMkMg
Y29tbXVuaWNhdGlvbiB0byB0aGUgZGV2aWNlLgo+IAo+IFRoZSBNRkQgZHJpdmVyIGN1cnJlbnRs
eSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgo+ICAJLSBXYXRjaGRvZwo+ICAJLSBM
RURzCj4gCS0gSHdtb24gKHZvbHRhZ2UgbW9uaXRvcmluZykKPiAKPiBTaWduZWQtb2ZmLWJ5OiBB
bmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJuZXJAbWVuLmRlPgo+IEFja2VkLWJ5OiBMZWUgSm9u
ZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPgo+IC0tLQo+ICBkcml2ZXJzL21mZC9LY29uZmlnICAg
ICB8ICAxMiArKysrKwo+ICBkcml2ZXJzL21mZC9NYWtlZmlsZSAgICB8ICAgMSArCj4gIGRyaXZl
cnMvbWZkL21lbmYyMWJtYy5jIHwgMTMyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKwo+ICAzIGZpbGVzIGNoYW5nZWQsIDE0NSBpbnNlcnRpb25zKCspCj4g
IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21mZC9tZW5mMjFibWMuYwo+IAo+IGRpZmYgLS1n
aXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+IGluZGV4IGI4
ZDljYTAuLjZhOWYxMDEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZwo+ICsrKyBi
L2RyaXZlcnMvbWZkL0tjb25maWcKPiBAQCAtNDUzLDYgKzQ1MywxOCBAQCBjb25maWcgTUZEX01B
WDg5OTgKPiAgCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0
byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkKPiAgCSAgb2YgdGhlIGRldmljZS4KPiAgCj4gK2NvbmZp
ZyBNRkRfTUVORjIxQk1DCj4gKwl0cmlzdGF0ZSAiTUVOIDE0RjAyMVAwMCBCb2FyZCBNYW5hZ2Vt
ZW50IENvbnRyb2xsZXIgU3VwcG9ydCIKPiArCWRlcGVuZHMgb24gSTJDCj4gKwlzZWxlY3QgTUZE
X0NPUkUKPiArCWhlbHAKPiArCSAgU2F5IHllcyBoZXJlIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUg
TUVOIDE0RjAyMVAwMCBCTUMKPiArCSAgd2hpY2ggaXMgYSBCb2FyZCBNYW5hZ2VtZW50IENvbnRy
b2xsZXIgY29ubmVjdGVkIHRvIHRoZSBJMkMgYnVzLgo+ICsJICBUaGUgZGV2aWNlIHN1cHBvcnRz
IG11bHRpcGxlIHN1Yi1kZXZpY2VzIGxpa2UgTEVELCBIV01PTiAgYW5kIFdEVC4KCk5pdDogV2hp
dGVzcGFjZSBlcnJvci4KCj4gKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0
IGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZXM7Cj4gKwkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0
IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZQo+ICsJICBmdW5jdGlvbmFsaXR5IG9mIHRo
ZSBCTUMgZGV2aWNlLgo+ICsKPiAgY29uZmlnIEVaWF9QQ0FQCj4gIAlib29sICJNb3Rvcm9sYSBF
WlhQQ0FQIFN1cHBvcnQiCj4gIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIKPiBkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQo+IGluZGV4IDRlMmJj
MjUuLjM3YmYzMzYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKPiArKysgYi9k
cml2ZXJzL21mZC9NYWtlZmlsZQo+IEBAIC0xNjksNiArMTY5LDcgQEAgb2JqLSQoQ09ORklHX01G
RF9BUzM3MTEpCSs9IGFzMzcxMS5vCj4gIG9iai0kKENPTkZJR19NRkRfQVMzNzIyKQkrPSBhczM3
MjIubwo+ICBvYmotJChDT05GSUdfTUZEX1NUVzQ4MVgpCSs9IHN0dzQ4MXgubwo+ICBvYmotJChD
T05GSUdfTUZEX0lQQVFfTUlDUk8pCSs9IGlwYXEtbWljcm8ubwo+ICtvYmotJChDT05GSUdfTUZE
X01FTkYyMUJNQykJKz0gbWVuZjIxYm1jLm8KPiAgCj4gIGludGVsLXNvYy1wbWljLW9ianMJCTo9
IGludGVsX3NvY19wbWljX2NvcmUubyBpbnRlbF9zb2NfcG1pY19jcmMubwo+ICBvYmotJChDT05G
SUdfSU5URUxfU09DX1BNSUMpCSs9IGludGVsLXNvYy1wbWljLm8KPiBkaWZmIC0tZ2l0IGEvZHJp
dmVycy9tZmQvbWVuZjIxYm1jLmMgYi9kcml2ZXJzL21mZC9tZW5mMjFibWMuYwo+IG5ldyBmaWxl
IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYTZlYjAzZgo+IC0tLSAvZGV2L251bGwKPiAr
KysgYi9kcml2ZXJzL21mZC9tZW5mMjFibWMuYwo+IEBAIC0wLDAgKzEsMTMyIEBACj4gKy8qCj4g
KyAqICBNRU4gMTRGMDIxUDAwIEJvYXJkIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoQk1DKSBNRkQg
Q29yZSBEcml2ZXIuCj4gKyAqCj4gKyAqICBDb3B5cmlnaHQgKEMpIDIwMTQgTUVOIE1pa3JvIEVs
ZWt0cm9uaWsgTnVlcm5iZXJnIEdtYkgKPiArICoKPiArICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAo+ICsg
KiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlCj4gKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRo
ZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKPiArICogIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o
Pgo+ICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu
aD4KPiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICsjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUu
aD4KPiArCj4gKyNkZWZpbmUgQk1DX0NNRF9XRFRfRVhJVF9QUk9ECTB4MTgKPiArI2RlZmluZSBC
TUNfQ01EX1dEVF9QUk9EX1NUQVQJMHgxOQo+ICsjZGVmaW5lIEJNQ19DTURfUkVWX01BSk9SCTB4
ODAKPiArI2RlZmluZSBCTUNfQ01EX1JFVl9NSU5PUgkweDgxCj4gKyNkZWZpbmUgQk1DX0NNRF9S
RVZfTUFJTgkweDgyCj4gKwo+ICtzdGF0aWMgc3RydWN0IG1mZF9jZWxsIG1lbmYyMWJtY19jZWxs
W10gPSB7Cj4gKwl7IC5uYW1lID0gIm1lbmYyMWJtY193ZHQiLCB9LAo+ICsJeyAubmFtZSA9ICJt
ZW5mMjFibWNfbGVkIiwgfSwKPiArCXsgLm5hbWUgPSAibWVuZjIxYm1jX2h3bW9uIiwgfQo+ICt9
Owo+ICsKPiArc3RhdGljIGludCBtZW5mMjFibWNfd2R0X2V4aXRfcHJvZF9tb2RlKHN0cnVjdCBp
MmNfY2xpZW50ICpjbGllbnQpCj4gK3sKPiArCWludCB2YWwsIHJldDsKPiArCj4gKwl2YWwgPSBp
MmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBCTUNfQ01EX1dEVF9QUk9EX1NUQVQpOwo+
ICsJaWYgKHZhbCA8IDApCj4gKwkJcmV0dXJuIHZhbDsKPiArCj4gKwkvKgo+ICsJICogUHJvZHVj
dGlvbiBtb2RlIHNob3VsZCBiZSBub3QgYWN0aXZlIGFmdGVyIGRlbGl2ZXJ5IG9mIHRoZSBCb2Fy
ZC4KPiArCSAqIFRvIGJlIHN1cmUgd2UgY2hlY2sgaXQsIGluZm9ybSB0aGUgdXNlciBhbmQgZXhp
dCB0aGUgbW9kZQo+ICsJICogaWYgYWN0aXZlLgo+ICsJICovCj4gKwlpZiAodmFsID09IDB4MDAp
IHsKPiArCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsCj4gKwkJCSJCTUMgaW4gcHJvZHVjdGlvbiBt
b2RlLiBFeGl0IHByb2R1Y3Rpb24gbW9kZVxuIik7Cj4gKwo+ICsJCXJldCA9IGkyY19zbWJ1c193
cml0ZV9ieXRlKGNsaWVudCwgQk1DX0NNRF9XRFRfRVhJVF9QUk9EKTsKPiArCQlpZiAocmV0IDwg
MCkKPiArCQkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr
c3RhdGljIGludAo+ICttZW5mMjFibWNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwg
Y29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkcykKPiArewo+ICsJaW50IHJldDsKPiArCWlu
dCByZXZfbWFqb3IsIHJldl9taW5vciwgcmV2X21haW47CgpSZWFsbHkgc21hbGwgbml0IChhcyB5
b3UgaGF2ZSB0byBmaXggdGhlIHdoaXRlc3BhY2UgZXJyIGFueXdheSk6CiAgQ2FuIHlvdSBjaGFu
Z2UgdGhlIG9yZGVyIG9mIHRoZSB0d28gbGluZXMgYWJvdmUgcGxlYXNlPwoKPiArCXJldCA9IGky
Y19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKPiArCQkJCSAgICAgIEkyQ19G
VU5DX1NNQlVTX0JZVEVfREFUQSB8Cj4gKwkJCQkgICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RB
VEEgfAo+ICsJCQkJICAgICAgSTJDX0ZVTkNfU01CVVNfQllURSk7Cj4gKwlpZiAoIXJldCkKPiAr
CQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwlyZXZfbWFqb3IgPSBpMmNfc21idXNfcmVhZF93b3Jk
X2RhdGEoY2xpZW50LCBCTUNfQ01EX1JFVl9NQUpPUik7Cj4gKwlpZiAocmV2X21ham9yIDwgMCkg
ewo+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBCTUMgbWFqb3IgcmV2
aXNpb25cbiIpOwo+ICsJCXJldHVybiByZXZfbWFqb3I7Cj4gKwl9Cj4gKwo+ICsJcmV2X21pbm9y
ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQk1DX0NNRF9SRVZfTUlOT1IpOwo+
ICsJaWYgKHJldl9taW5vciA8IDApIHsKPiArCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxl
ZCB0byBnZXQgQk1DIG1pbm9yIHJldmlzaW9uXG4iKTsKPiArCQlyZXR1cm4gcmV2X21pbm9yOwo+
ICsJfQo+ICsKPiArCXJldl9tYWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwg
Qk1DX0NNRF9SRVZfTUFJTik7Cj4gKwlpZiAocmV2X21haW4gPCAwKSB7Cj4gKwkJZGV2X2Vycigm
Y2xpZW50LT5kZXYsICJmYWlsZWQgdG8gZ2V0IEJNQyBtYWluIHJldmlzaW9uXG4iKTsKPiArCQly
ZXR1cm4gcmV2X21haW47Cj4gKwl9Cj4gKwo+ICsJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRlcg
UmV2aXNpb246ICUwMmQuJTAyZC4lMDJkXG4iLAo+ICsJCQkJCXJldl9tYWpvciwgcmV2X21pbm9y
LCByZXZfbWFpbik7CgpZb3UgZW5mb3JjZWQgYSAnbGluZSA+IDgwIGNoYXJzJyB3YXJuaW5nIGlu
IHlvdXIgb3RoZXIgZHJpdmVyIGp1c3Qgc28KeW91IGNhbiAnZG8gdGhlIHJpZ2h0IHRoaW5nJyBh
bmQgbGluZSB1cCBhZ2FpbnN0IHRoZSAnKCcuIDopCgpDYW4geW91IGRvIHRoYXQgaGVyZSBwbGVh
c2U/Cgo+ICsJLyoKPiArCSAqIFdlIGhhdmUgdG8gZXhpdCB0aGUgUHJvZHVjdGlvbiBNb2RlIG9m
IHRoZSBCTUMgdG8gYWN0aXZhdGUgdGhlCj4gKwkgKiBXYXRjaGRvZyBmdW5jdGlvbmFsaXR5IGFu
ZCB0aGUgQklPUyBsaWZlIHNpZ24gbW9uaXRvcmluZy4KPiArCSAqLwo+ICsJcmV0ID0gbWVuZjIx
Ym1jX3dkdF9leGl0X3Byb2RfbW9kZShjbGllbnQpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlk
ZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBsZWF2ZSBwcm9kdWN0aW9uIG1vZGVcbiIp
Owo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKCZj
bGllbnQtPmRldiwgMCwgbWVuZjIxYm1jX2NlbGwsCj4gKwkJCQlBUlJBWV9TSVpFKG1lbmYyMWJt
Y19jZWxsKSwgTlVMTCwgMCwgTlVMTCk7CgpMaW5lIHVwIHRvIHRvICcoJy4KCj4gKwlpZiAocmV0
IDwgMCkgewo+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBCTUMgc3Vi
LWRldmljZXNcbiIpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g
K30KPiArCj4gK3N0YXRpYyBpbnQgbWVuZjIxYm1jX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAq
Y2xpZW50KQo+ICt7Cj4gKwltZmRfcmVtb3ZlX2RldmljZXMoJmNsaWVudC0+ZGV2KTsKPiArCXJl
dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWVu
ZjIxYm1jX2lkX3RhYmxlW10gPSB7Cj4gKwl7ICJtZW5mMjFibWMiLCAwIH0sCgpUaGUgc2Vjb25k
IGF0dHJpYnV0ZSBpcyB1bnVzZWQgaW4gdGhpcyBkcml2ZXIsIHBsZWFzZSByZW1vdmUgaXQuCgo+
ICsJeyB9Cj4gK307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtZW5mMjFibWNfaWRfdGFi
bGUpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1lbmYyMWJtY19kcml2ZXIgPSB7
Cj4gKwkuZHJpdmVyLm5hbWUJPSAibWVuZjIxYm1jIiwKPiArCS5pZF90YWJsZQk9IG1lbmYyMWJt
Y19pZF90YWJsZSwKPiArCS5wcm9iZQkJPSBtZW5mMjFibWNfcHJvYmUsCj4gKwkucmVtb3ZlCQk9
IG1lbmYyMWJtY19yZW1vdmUsCj4gK307CgpObyBEVCBzdXBwb3J0PwoKPiArbW9kdWxlX2kyY19k
cml2ZXIobWVuZjIxYm1jX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1FTiAx
NEYwMjFQMDAgQk1DIG1mZCBjb3JlIGRyaXZlciIpOwoKcy9tZmQvTUZECgo+ICtNT0RVTEVfQVVU
SE9SKCJBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJuZXJAbWVuLmRlPiIpOwo+ICtNT0RVTEVf
TElDRU5TRSgiR1BMIHYyIik7CgotLSAKTGVlIEpvbmVzCkxpbmFybyBTVE1pY3JvZWxlY3Ryb25p
Y3MgTGFuZGluZyBUZWFtIExlYWQKTGluYXJvLm9yZyDilIIgT3BlbiBzb3VyY2Ugc29mdHdhcmUg
Zm9yIEFSTSBTb0NzCkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRlciB8IEJsb2cKCl9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMg
bWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNl
bnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw=

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

* Re: [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
  2014-08-26 17:15     ` [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driv Guenter Roeck
  (?)
@ 2014-08-27  7:58       ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27  7:58 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andreas Werner, linux-kernel, sameo, lee.jones, wim,
	linux-watchdog, cooloney, rpurdie, linux-leds, jdelvare,
	lm-sensors, johannes.thumshirn

On Tue, Aug 26, 2014 at 10:15:41AM -0700, Guenter Roeck wrote:
> On Tue, Aug 26, 2014 at 07:46:53PM +0200, Andreas Werner wrote:
> > Added driver to support the 14F021P00 BMC Hardware Monitoring.
> > The BMC is a Board Management Controller including monitoring of the
> > board voltages.
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> 
> Hi Andreas,
> 
> Couple of additional comments below. Sorry I didn't notice earlier.
> 
> Guenter
> 
> > ---
> >  Documentation/hwmon/menf21bmc   |  49 +++++++++
> >  drivers/hwmon/Kconfig           |   7 ++
> >  drivers/hwmon/Makefile          |   1 +
> >  drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 287 insertions(+)
> >  create mode 100644 Documentation/hwmon/menf21bmc
> >  create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
> > 
> > diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
> > new file mode 100644
> > index 0000000..22b6840
> > --- /dev/null
> > +++ b/Documentation/hwmon/menf21bmc
> > @@ -0,0 +1,49 @@
> > +Kernel driver menf21bmc_hwmon
> > +=============================
> > +
> > +Supported chips:
> > +	* MEN 14F021P00
> > +	  Prefix: 'menf21bmc_hwmon'
> > +	  Adresses scanned: -
> > +
> > +Author: Andreas Werner <andreas.werner@men.de>
> > +
> > +Description
> > +-----------
> > +
> > +The menf21bmc is a Board Management Controller (BMC) which provides an I2C
> > +interface to the host to access the features implemented in the BMC.
> > +
> > +This driver gives access to the voltage monitoring feature of the main
> > +voltages of the board.
> > +The voltage sensors are connected to the ADC inputs of the BMC which is
> > +a PIC16F917 Mikrocontroller.
> > +
> > +Usage Notes
> > +-----------
> > +
> > +This driver does not auto-detect devices. You will have to instantiate the
> > +devices explicitly. Please see Documentation/i2c/instantiating-devices for
> > +details.
> > +
> > +Sysfs entries
> > +-------------
> > +
> > +The following attributes are supported. All attributes are read only
> > +The Limits are read once by the driver.
> > +
> > +in0_input	+3.3V input voltage
> > +in1_input	+5.0V input voltage
> > +in2_input	+12.0V input voltage
> > +in3_input	+5V Standby input voltage
> > +in4_input	VBAT (on board battery)
> > +
> > +in[0-4]_min	Minimum voltage limit
> > +in[0-4]_max	Maximum voltage limit
> > +
> > +in0_label	"MON_3_3V"
> > +in1_label	"MON_5V"
> > +in2_label	"MON_12V"
> > +in3_label	"5V_STANDBY"
> > +in4_label	"VBAT"
> > +
> 
> The empty line adds a whitespace error when applying the patch.
>

OK, will delete the line.
 
> > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> > index 37908ff..db3a6eb 100644
> > --- a/drivers/hwmon/Kconfig
> > +++ b/drivers/hwmon/Kconfig
> > @@ -828,6 +828,13 @@ config SENSORS_MCP3021
> >  	  This driver can also be built as a module.  If so, the module
> >  	  will be called mcp3021.
> >  
> > +config SENSORS_MENF21BMC_HWMON
> > +	tristate "MEN 14F021P00 BMC Hardware Monitoring"
> > +	depends on MFD_MENF21BMC
> > +	help
> > +	  Say Y here to include support for the MEN 14F021P00 BMC
> > +	  hardware monitoring.
> > +
> It is customary to add a note describing how the module is called
> if the driver is built as module.
> 

OK i just write a line which describes the module name.

> >  config SENSORS_ADCXX
> >  	tristate "National Semiconductor ADCxxxSxxx"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> > index 1362382..56ab872 100644
> > --- a/drivers/hwmon/Makefile
> > +++ b/drivers/hwmon/Makefile
> > @@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
> >  obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
> >  obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
> >  obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
> > +obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
> >  obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
> >  obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
> >  obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
> > diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
> > new file mode 100644
> > index 0000000..2eaec6a
> > --- /dev/null
> > +++ b/drivers/hwmon/menf21bmc_hwmon.c
> > @@ -0,0 +1,230 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
> > + *
> > + *  This is the core hwmon driver of the MEN 14F021P00 BMC.
> > + *  The BMC monitors the board voltages which can be access with this
> > + *  driver through sysfs.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/kernel.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/hwmon.h>
> > +#include <linux/hwmon-sysfs.h>
> > +#include <linux/jiffies.h>
> > +#include <linux/slab.h>
> > +#include <linux/i2c.h>
> > +
> > +#define DRV_NAME  "menf21bmc_hwmon"
> > +
> > +#define BMC_VOLT_COUNT	5
> > +#define MENF21BMC_V33	0
> > +#define MENF21BMC_V5	1
> > +#define MENF21BMC_V12	2
> > +#define MENF21BMC_V5_SB	3
> > +#define MENF21BMC_VBAT	4
> > +
> > +#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
> > +#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
> > +#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
> > +
> > +struct menf21bmc_hwmon {
> > +	char valid;
> 
> Please use bool (and true / false to set it). char doesn't
> save anything and may actually increase code size depending
> on the architecture.
> 

Ok.

> > +	struct i2c_client *i2c_client;
> > +	unsigned long last_update;
> > +	u16 in_val[BMC_VOLT_COUNT];
> > +	u16 in_min[BMC_VOLT_COUNT];
> > +	u16 in_max[BMC_VOLT_COUNT];
> > +};
> > +
> > +static const char *const input_names[] = {
> > +	[MENF21BMC_V33]		= "MON_3_3V",
> > +	[MENF21BMC_V5]		= "MON_5V",
> > +	[MENF21BMC_V12]		= "MON_12V",
> > +	[MENF21BMC_V5_SB]	= "5V_STANDBY",
> > +	[MENF21BMC_VBAT]	= "VBAT"
> > +};
> > +
> > +static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
> > +{
> > +	int i;
> > +	uint16_t val;
> 
> That doesn't work well with the checks against < 0.
> Please compile with W=1 to find all instances of this problem
> (there is another one below).
> 

Argh, hate myself.

> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +	struct menf21bmc_hwmon *data_ret = drv_data;
> > +
> > +	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
> 
> Line over 80 characters.
> 

Yes, checkpatch gave me a warning, but a thought it is better so let
it as it is instead of split the "if" line.
But it is no problem to change that.

> > +		for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +			val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +						       IDX_TO_VOLT_INP_CMD(i));
> > +			if (val < 0) {
> > +				data_ret = ERR_PTR(val);
> > +				goto abort;
> > +			}
> > +			drv_data->in_val[i] = val;
> > +		}
> > +		drv_data->last_update = jiffies;
> > +		drv_data->valid = 1;
> > +	}
> > +abort:
> > +	return data_ret;
> > +}
> > +
> > +static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
> > +{
> > +	int i;
> > +	uint16_t val;
> > +
> > +	for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MIN_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_min[i] = val;
> > +
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MAX_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_max[i] = val;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static ssize_t
> > +show_label(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +
> > +	return sprintf(buf, "%s\n", input_names[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_in(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
> > +
> > +	if (IS_ERR(drv_data))
> > +		return PTR_ERR(drv_data);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_min(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_max(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
> > +}
> > +
> > +#define create_voltage_sysfs(idx)			\
> > +static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
> > +			show_in, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
> > +			show_min, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
> > +			show_max, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
> > +			show_label, NULL, idx);
> > +
> > +create_voltage_sysfs(0);
> > +create_voltage_sysfs(1);
> > +create_voltage_sysfs(2);
> > +create_voltage_sysfs(3);
> > +create_voltage_sysfs(4);
> > +
> > +static struct attribute *menf21bmc_hwmon_attrs[] = {
> > +	&sensor_dev_attr_in0_input.dev_attr.attr,
> > +	&sensor_dev_attr_in0_min.dev_attr.attr,
> > +	&sensor_dev_attr_in0_max.dev_attr.attr,
> > +	&sensor_dev_attr_in0_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in1_input.dev_attr.attr,
> > +	&sensor_dev_attr_in1_min.dev_attr.attr,
> > +	&sensor_dev_attr_in1_max.dev_attr.attr,
> > +	&sensor_dev_attr_in1_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in2_input.dev_attr.attr,
> > +	&sensor_dev_attr_in2_min.dev_attr.attr,
> > +	&sensor_dev_attr_in2_max.dev_attr.attr,
> > +	&sensor_dev_attr_in2_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in3_input.dev_attr.attr,
> > +	&sensor_dev_attr_in3_min.dev_attr.attr,
> > +	&sensor_dev_attr_in3_max.dev_attr.attr,
> > +	&sensor_dev_attr_in3_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in4_input.dev_attr.attr,
> > +	&sensor_dev_attr_in4_min.dev_attr.attr,
> > +	&sensor_dev_attr_in4_max.dev_attr.attr,
> > +	&sensor_dev_attr_in4_label.dev_attr.attr,
> > +	NULL
> > +};
> > +
> > +ATTRIBUTE_GROUPS(menf21bmc_hwmon);
> > +
> > +static int menf21bmc_hwmon_probe(struct platform_device *pdev)
> > +{
> > +	int ret;
> > +	struct menf21bmc_hwmon *drv_data;
> > +	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
> > +	struct device *hwmon_dev;
> > +
> > +	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
> > +				GFP_KERNEL);
> > +	if (!drv_data)
> > +		return -ENOMEM;
> > +
> > +	drv_data->i2c_client = i2c_client;
> > +
> > +	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
> > +	if (ret) {
> > +		dev_err(&pdev->dev, "failed to read sensor limits");
> > +		return ret;
> > +	}
> > +
> > +	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
> > +							   "menf21bmc", drv_data,
> > +							   menf21bmc_hwmon_groups);
> 
> Line over 80 characters. Just use less indentation for the continuation lines.
> 

Same as above, checkpatch gave me a warning. I just wanted to align it to the "("
but no problem to change that.

> > +	if (IS_ERR(hwmon_dev))
> > +		return PTR_ERR(hwmon_dev);
> > +
> > +	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
> > +
> > +	return 0;
> > +}
> > +
> > +static struct platform_driver menf21bmc_hwmon = {
> > +	.probe		= menf21bmc_hwmon_probe,
> > +	.driver		= {
> > +		.name		= DRV_NAME,
> > +		.owner		= THIS_MODULE,
> > +	},
> > +};
> > +
> > +module_platform_driver(menf21bmc_hwmon);
> > +
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
> > +MODULE_LICENSE("GPL v2");
> > +MODULE_ALIAS("platform:menf21bmc_hwmon");
> > -- 
> > 2.0.4
> > 
> > 

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

* Re: [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver
@ 2014-08-27  7:58       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27  7:58 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andreas Werner, linux-kernel, sameo, lee.jones, wim,
	linux-watchdog, cooloney, rpurdie, linux-leds, jdelvare,
	lm-sensors, johannes.thumshirn

On Tue, Aug 26, 2014 at 10:15:41AM -0700, Guenter Roeck wrote:
> On Tue, Aug 26, 2014 at 07:46:53PM +0200, Andreas Werner wrote:
> > Added driver to support the 14F021P00 BMC Hardware Monitoring.
> > The BMC is a Board Management Controller including monitoring of the
> > board voltages.
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> 
> Hi Andreas,
> 
> Couple of additional comments below. Sorry I didn't notice earlier.
> 
> Guenter
> 
> > ---
> >  Documentation/hwmon/menf21bmc   |  49 +++++++++
> >  drivers/hwmon/Kconfig           |   7 ++
> >  drivers/hwmon/Makefile          |   1 +
> >  drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 287 insertions(+)
> >  create mode 100644 Documentation/hwmon/menf21bmc
> >  create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
> > 
> > diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
> > new file mode 100644
> > index 0000000..22b6840
> > --- /dev/null
> > +++ b/Documentation/hwmon/menf21bmc
> > @@ -0,0 +1,49 @@
> > +Kernel driver menf21bmc_hwmon
> > +=============================
> > +
> > +Supported chips:
> > +	* MEN 14F021P00
> > +	  Prefix: 'menf21bmc_hwmon'
> > +	  Adresses scanned: -
> > +
> > +Author: Andreas Werner <andreas.werner@men.de>
> > +
> > +Description
> > +-----------
> > +
> > +The menf21bmc is a Board Management Controller (BMC) which provides an I2C
> > +interface to the host to access the features implemented in the BMC.
> > +
> > +This driver gives access to the voltage monitoring feature of the main
> > +voltages of the board.
> > +The voltage sensors are connected to the ADC inputs of the BMC which is
> > +a PIC16F917 Mikrocontroller.
> > +
> > +Usage Notes
> > +-----------
> > +
> > +This driver does not auto-detect devices. You will have to instantiate the
> > +devices explicitly. Please see Documentation/i2c/instantiating-devices for
> > +details.
> > +
> > +Sysfs entries
> > +-------------
> > +
> > +The following attributes are supported. All attributes are read only
> > +The Limits are read once by the driver.
> > +
> > +in0_input	+3.3V input voltage
> > +in1_input	+5.0V input voltage
> > +in2_input	+12.0V input voltage
> > +in3_input	+5V Standby input voltage
> > +in4_input	VBAT (on board battery)
> > +
> > +in[0-4]_min	Minimum voltage limit
> > +in[0-4]_max	Maximum voltage limit
> > +
> > +in0_label	"MON_3_3V"
> > +in1_label	"MON_5V"
> > +in2_label	"MON_12V"
> > +in3_label	"5V_STANDBY"
> > +in4_label	"VBAT"
> > +
> 
> The empty line adds a whitespace error when applying the patch.
>

OK, will delete the line.
 
> > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> > index 37908ff..db3a6eb 100644
> > --- a/drivers/hwmon/Kconfig
> > +++ b/drivers/hwmon/Kconfig
> > @@ -828,6 +828,13 @@ config SENSORS_MCP3021
> >  	  This driver can also be built as a module.  If so, the module
> >  	  will be called mcp3021.
> >  
> > +config SENSORS_MENF21BMC_HWMON
> > +	tristate "MEN 14F021P00 BMC Hardware Monitoring"
> > +	depends on MFD_MENF21BMC
> > +	help
> > +	  Say Y here to include support for the MEN 14F021P00 BMC
> > +	  hardware monitoring.
> > +
> It is customary to add a note describing how the module is called
> if the driver is built as module.
> 

OK i just write a line which describes the module name.

> >  config SENSORS_ADCXX
> >  	tristate "National Semiconductor ADCxxxSxxx"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> > index 1362382..56ab872 100644
> > --- a/drivers/hwmon/Makefile
> > +++ b/drivers/hwmon/Makefile
> > @@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
> >  obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
> >  obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
> >  obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
> > +obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
> >  obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
> >  obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
> >  obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
> > diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
> > new file mode 100644
> > index 0000000..2eaec6a
> > --- /dev/null
> > +++ b/drivers/hwmon/menf21bmc_hwmon.c
> > @@ -0,0 +1,230 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
> > + *
> > + *  This is the core hwmon driver of the MEN 14F021P00 BMC.
> > + *  The BMC monitors the board voltages which can be access with this
> > + *  driver through sysfs.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/kernel.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/hwmon.h>
> > +#include <linux/hwmon-sysfs.h>
> > +#include <linux/jiffies.h>
> > +#include <linux/slab.h>
> > +#include <linux/i2c.h>
> > +
> > +#define DRV_NAME  "menf21bmc_hwmon"
> > +
> > +#define BMC_VOLT_COUNT	5
> > +#define MENF21BMC_V33	0
> > +#define MENF21BMC_V5	1
> > +#define MENF21BMC_V12	2
> > +#define MENF21BMC_V5_SB	3
> > +#define MENF21BMC_VBAT	4
> > +
> > +#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
> > +#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
> > +#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
> > +
> > +struct menf21bmc_hwmon {
> > +	char valid;
> 
> Please use bool (and true / false to set it). char doesn't
> save anything and may actually increase code size depending
> on the architecture.
> 

Ok.

> > +	struct i2c_client *i2c_client;
> > +	unsigned long last_update;
> > +	u16 in_val[BMC_VOLT_COUNT];
> > +	u16 in_min[BMC_VOLT_COUNT];
> > +	u16 in_max[BMC_VOLT_COUNT];
> > +};
> > +
> > +static const char *const input_names[] = {
> > +	[MENF21BMC_V33]		= "MON_3_3V",
> > +	[MENF21BMC_V5]		= "MON_5V",
> > +	[MENF21BMC_V12]		= "MON_12V",
> > +	[MENF21BMC_V5_SB]	= "5V_STANDBY",
> > +	[MENF21BMC_VBAT]	= "VBAT"
> > +};
> > +
> > +static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
> > +{
> > +	int i;
> > +	uint16_t val;
> 
> That doesn't work well with the checks against < 0.
> Please compile with W=1 to find all instances of this problem
> (there is another one below).
> 

Argh, hate myself.

> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +	struct menf21bmc_hwmon *data_ret = drv_data;
> > +
> > +	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
> 
> Line over 80 characters.
> 

Yes, checkpatch gave me a warning, but a thought it is better so let
it as it is instead of split the "if" line.
But it is no problem to change that.

> > +		for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +			val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +						       IDX_TO_VOLT_INP_CMD(i));
> > +			if (val < 0) {
> > +				data_ret = ERR_PTR(val);
> > +				goto abort;
> > +			}
> > +			drv_data->in_val[i] = val;
> > +		}
> > +		drv_data->last_update = jiffies;
> > +		drv_data->valid = 1;
> > +	}
> > +abort:
> > +	return data_ret;
> > +}
> > +
> > +static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
> > +{
> > +	int i;
> > +	uint16_t val;
> > +
> > +	for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MIN_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_min[i] = val;
> > +
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MAX_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_max[i] = val;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static ssize_t
> > +show_label(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +
> > +	return sprintf(buf, "%s\n", input_names[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_in(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
> > +
> > +	if (IS_ERR(drv_data))
> > +		return PTR_ERR(drv_data);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_min(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_max(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
> > +}
> > +
> > +#define create_voltage_sysfs(idx)			\
> > +static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
> > +			show_in, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
> > +			show_min, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
> > +			show_max, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
> > +			show_label, NULL, idx);
> > +
> > +create_voltage_sysfs(0);
> > +create_voltage_sysfs(1);
> > +create_voltage_sysfs(2);
> > +create_voltage_sysfs(3);
> > +create_voltage_sysfs(4);
> > +
> > +static struct attribute *menf21bmc_hwmon_attrs[] = {
> > +	&sensor_dev_attr_in0_input.dev_attr.attr,
> > +	&sensor_dev_attr_in0_min.dev_attr.attr,
> > +	&sensor_dev_attr_in0_max.dev_attr.attr,
> > +	&sensor_dev_attr_in0_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in1_input.dev_attr.attr,
> > +	&sensor_dev_attr_in1_min.dev_attr.attr,
> > +	&sensor_dev_attr_in1_max.dev_attr.attr,
> > +	&sensor_dev_attr_in1_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in2_input.dev_attr.attr,
> > +	&sensor_dev_attr_in2_min.dev_attr.attr,
> > +	&sensor_dev_attr_in2_max.dev_attr.attr,
> > +	&sensor_dev_attr_in2_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in3_input.dev_attr.attr,
> > +	&sensor_dev_attr_in3_min.dev_attr.attr,
> > +	&sensor_dev_attr_in3_max.dev_attr.attr,
> > +	&sensor_dev_attr_in3_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in4_input.dev_attr.attr,
> > +	&sensor_dev_attr_in4_min.dev_attr.attr,
> > +	&sensor_dev_attr_in4_max.dev_attr.attr,
> > +	&sensor_dev_attr_in4_label.dev_attr.attr,
> > +	NULL
> > +};
> > +
> > +ATTRIBUTE_GROUPS(menf21bmc_hwmon);
> > +
> > +static int menf21bmc_hwmon_probe(struct platform_device *pdev)
> > +{
> > +	int ret;
> > +	struct menf21bmc_hwmon *drv_data;
> > +	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
> > +	struct device *hwmon_dev;
> > +
> > +	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
> > +				GFP_KERNEL);
> > +	if (!drv_data)
> > +		return -ENOMEM;
> > +
> > +	drv_data->i2c_client = i2c_client;
> > +
> > +	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
> > +	if (ret) {
> > +		dev_err(&pdev->dev, "failed to read sensor limits");
> > +		return ret;
> > +	}
> > +
> > +	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
> > +							   "menf21bmc", drv_data,
> > +							   menf21bmc_hwmon_groups);
> 
> Line over 80 characters. Just use less indentation for the continuation lines.
> 

Same as above, checkpatch gave me a warning. I just wanted to align it to the "("
but no problem to change that.

> > +	if (IS_ERR(hwmon_dev))
> > +		return PTR_ERR(hwmon_dev);
> > +
> > +	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
> > +
> > +	return 0;
> > +}
> > +
> > +static struct platform_driver menf21bmc_hwmon = {
> > +	.probe		= menf21bmc_hwmon_probe,
> > +	.driver		= {
> > +		.name		= DRV_NAME,
> > +		.owner		= THIS_MODULE,
> > +	},
> > +};
> > +
> > +module_platform_driver(menf21bmc_hwmon);
> > +
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
> > +MODULE_LICENSE("GPL v2");
> > +MODULE_ALIAS("platform:menf21bmc_hwmon");
> > -- 
> > 2.0.4
> > 
> > 

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

* Re: [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driv
@ 2014-08-27  7:58       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27  7:58 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andreas Werner, linux-kernel, sameo, lee.jones, wim,
	linux-watchdog, cooloney, rpurdie, linux-leds, jdelvare,
	lm-sensors, johannes.thumshirn

On Tue, Aug 26, 2014 at 10:15:41AM -0700, Guenter Roeck wrote:
> On Tue, Aug 26, 2014 at 07:46:53PM +0200, Andreas Werner wrote:
> > Added driver to support the 14F021P00 BMC Hardware Monitoring.
> > The BMC is a Board Management Controller including monitoring of the
> > board voltages.
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> 
> Hi Andreas,
> 
> Couple of additional comments below. Sorry I didn't notice earlier.
> 
> Guenter
> 
> > ---
> >  Documentation/hwmon/menf21bmc   |  49 +++++++++
> >  drivers/hwmon/Kconfig           |   7 ++
> >  drivers/hwmon/Makefile          |   1 +
> >  drivers/hwmon/menf21bmc_hwmon.c | 230 ++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 287 insertions(+)
> >  create mode 100644 Documentation/hwmon/menf21bmc
> >  create mode 100644 drivers/hwmon/menf21bmc_hwmon.c
> > 
> > diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc
> > new file mode 100644
> > index 0000000..22b6840
> > --- /dev/null
> > +++ b/Documentation/hwmon/menf21bmc
> > @@ -0,0 +1,49 @@
> > +Kernel driver menf21bmc_hwmon
> > +==============> > +
> > +Supported chips:
> > +	* MEN 14F021P00
> > +	  Prefix: 'menf21bmc_hwmon'
> > +	  Adresses scanned: -
> > +
> > +Author: Andreas Werner <andreas.werner@men.de>
> > +
> > +Description
> > +-----------
> > +
> > +The menf21bmc is a Board Management Controller (BMC) which provides an I2C
> > +interface to the host to access the features implemented in the BMC.
> > +
> > +This driver gives access to the voltage monitoring feature of the main
> > +voltages of the board.
> > +The voltage sensors are connected to the ADC inputs of the BMC which is
> > +a PIC16F917 Mikrocontroller.
> > +
> > +Usage Notes
> > +-----------
> > +
> > +This driver does not auto-detect devices. You will have to instantiate the
> > +devices explicitly. Please see Documentation/i2c/instantiating-devices for
> > +details.
> > +
> > +Sysfs entries
> > +-------------
> > +
> > +The following attributes are supported. All attributes are read only
> > +The Limits are read once by the driver.
> > +
> > +in0_input	+3.3V input voltage
> > +in1_input	+5.0V input voltage
> > +in2_input	+12.0V input voltage
> > +in3_input	+5V Standby input voltage
> > +in4_input	VBAT (on board battery)
> > +
> > +in[0-4]_min	Minimum voltage limit
> > +in[0-4]_max	Maximum voltage limit
> > +
> > +in0_label	"MON_3_3V"
> > +in1_label	"MON_5V"
> > +in2_label	"MON_12V"
> > +in3_label	"5V_STANDBY"
> > +in4_label	"VBAT"
> > +
> 
> The empty line adds a whitespace error when applying the patch.
>

OK, will delete the line.
 
> > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> > index 37908ff..db3a6eb 100644
> > --- a/drivers/hwmon/Kconfig
> > +++ b/drivers/hwmon/Kconfig
> > @@ -828,6 +828,13 @@ config SENSORS_MCP3021
> >  	  This driver can also be built as a module.  If so, the module
> >  	  will be called mcp3021.
> >  
> > +config SENSORS_MENF21BMC_HWMON
> > +	tristate "MEN 14F021P00 BMC Hardware Monitoring"
> > +	depends on MFD_MENF21BMC
> > +	help
> > +	  Say Y here to include support for the MEN 14F021P00 BMC
> > +	  hardware monitoring.
> > +
> It is customary to add a note describing how the module is called
> if the driver is built as module.
> 

OK i just write a line which describes the module name.

> >  config SENSORS_ADCXX
> >  	tristate "National Semiconductor ADCxxxSxxx"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> > index 1362382..56ab872 100644
> > --- a/drivers/hwmon/Makefile
> > +++ b/drivers/hwmon/Makefile
> > @@ -114,6 +114,7 @@ obj-$(CONFIG_SENSORS_MAX6650)	+= max6650.o
> >  obj-$(CONFIG_SENSORS_MAX6697)	+= max6697.o
> >  obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o
> >  obj-$(CONFIG_SENSORS_MCP3021)	+= mcp3021.o
> > +obj-$(CONFIG_SENSORS_MENF21BMC_HWMON) += menf21bmc_hwmon.o
> >  obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
> >  obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
> >  obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
> > diff --git a/drivers/hwmon/menf21bmc_hwmon.c b/drivers/hwmon/menf21bmc_hwmon.c
> > new file mode 100644
> > index 0000000..2eaec6a
> > --- /dev/null
> > +++ b/drivers/hwmon/menf21bmc_hwmon.c
> > @@ -0,0 +1,230 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) hwmon driver.
> > + *
> > + *  This is the core hwmon driver of the MEN 14F021P00 BMC.
> > + *  The BMC monitors the board voltages which can be access with this
> > + *  driver through sysfs.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/kernel.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/hwmon.h>
> > +#include <linux/hwmon-sysfs.h>
> > +#include <linux/jiffies.h>
> > +#include <linux/slab.h>
> > +#include <linux/i2c.h>
> > +
> > +#define DRV_NAME  "menf21bmc_hwmon"
> > +
> > +#define BMC_VOLT_COUNT	5
> > +#define MENF21BMC_V33	0
> > +#define MENF21BMC_V5	1
> > +#define MENF21BMC_V12	2
> > +#define MENF21BMC_V5_SB	3
> > +#define MENF21BMC_VBAT	4
> > +
> > +#define IDX_TO_VOLT_MIN_CMD(idx) (0x40 + idx)
> > +#define IDX_TO_VOLT_MAX_CMD(idx) (0x50 + idx)
> > +#define IDX_TO_VOLT_INP_CMD(idx) (0x60 + idx)
> > +
> > +struct menf21bmc_hwmon {
> > +	char valid;
> 
> Please use bool (and true / false to set it). char doesn't
> save anything and may actually increase code size depending
> on the architecture.
> 

Ok.

> > +	struct i2c_client *i2c_client;
> > +	unsigned long last_update;
> > +	u16 in_val[BMC_VOLT_COUNT];
> > +	u16 in_min[BMC_VOLT_COUNT];
> > +	u16 in_max[BMC_VOLT_COUNT];
> > +};
> > +
> > +static const char *const input_names[] = {
> > +	[MENF21BMC_V33]		= "MON_3_3V",
> > +	[MENF21BMC_V5]		= "MON_5V",
> > +	[MENF21BMC_V12]		= "MON_12V",
> > +	[MENF21BMC_V5_SB]	= "5V_STANDBY",
> > +	[MENF21BMC_VBAT]	= "VBAT"
> > +};
> > +
> > +static struct menf21bmc_hwmon *menf21bmc_hwmon_update(struct device *dev)
> > +{
> > +	int i;
> > +	uint16_t val;
> 
> That doesn't work well with the checks against < 0.
> Please compile with W=1 to find all instances of this problem
> (there is another one below).
> 

Argh, hate myself.

> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +	struct menf21bmc_hwmon *data_ret = drv_data;
> > +
> > +	if (time_after(jiffies, drv_data->last_update + HZ) || !drv_data->valid) {
> 
> Line over 80 characters.
> 

Yes, checkpatch gave me a warning, but a thought it is better so let
it as it is instead of split the "if" line.
But it is no problem to change that.

> > +		for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +			val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +						       IDX_TO_VOLT_INP_CMD(i));
> > +			if (val < 0) {
> > +				data_ret = ERR_PTR(val);
> > +				goto abort;
> > +			}
> > +			drv_data->in_val[i] = val;
> > +		}
> > +		drv_data->last_update = jiffies;
> > +		drv_data->valid = 1;
> > +	}
> > +abort:
> > +	return data_ret;
> > +}
> > +
> > +static int menf21bmc_hwmon_get_volt_limits(struct menf21bmc_hwmon *drv_data)
> > +{
> > +	int i;
> > +	uint16_t val;
> > +
> > +	for (i = 0; i < BMC_VOLT_COUNT; i++) {
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MIN_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_min[i] = val;
> > +
> > +		val = i2c_smbus_read_word_data(drv_data->i2c_client,
> > +					       IDX_TO_VOLT_MAX_CMD(i));
> > +		if (val < 0)
> > +			return val;
> > +
> > +		drv_data->in_max[i] = val;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static ssize_t
> > +show_label(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +
> > +	return sprintf(buf, "%s\n", input_names[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_in(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = menf21bmc_hwmon_update(dev);
> > +
> > +	if (IS_ERR(drv_data))
> > +		return PTR_ERR(drv_data);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_val[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_min(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_min[attr->index]);
> > +}
> > +
> > +static ssize_t
> > +show_max(struct device *dev, struct device_attribute *devattr, char *buf)
> > +{
> > +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
> > +	struct menf21bmc_hwmon *drv_data = dev_get_drvdata(dev);
> > +
> > +	return sprintf(buf, "%d\n", drv_data->in_max[attr->index]);
> > +}
> > +
> > +#define create_voltage_sysfs(idx)			\
> > +static SENSOR_DEVICE_ATTR(in##idx##_input, S_IRUGO,	\
> > +			show_in, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_min, S_IRUGO,	\
> > +			show_min, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_max, S_IRUGO,	\
> > +			show_max, NULL, idx);		\
> > +static SENSOR_DEVICE_ATTR(in##idx##_label, S_IRUGO,	\
> > +			show_label, NULL, idx);
> > +
> > +create_voltage_sysfs(0);
> > +create_voltage_sysfs(1);
> > +create_voltage_sysfs(2);
> > +create_voltage_sysfs(3);
> > +create_voltage_sysfs(4);
> > +
> > +static struct attribute *menf21bmc_hwmon_attrs[] = {
> > +	&sensor_dev_attr_in0_input.dev_attr.attr,
> > +	&sensor_dev_attr_in0_min.dev_attr.attr,
> > +	&sensor_dev_attr_in0_max.dev_attr.attr,
> > +	&sensor_dev_attr_in0_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in1_input.dev_attr.attr,
> > +	&sensor_dev_attr_in1_min.dev_attr.attr,
> > +	&sensor_dev_attr_in1_max.dev_attr.attr,
> > +	&sensor_dev_attr_in1_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in2_input.dev_attr.attr,
> > +	&sensor_dev_attr_in2_min.dev_attr.attr,
> > +	&sensor_dev_attr_in2_max.dev_attr.attr,
> > +	&sensor_dev_attr_in2_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in3_input.dev_attr.attr,
> > +	&sensor_dev_attr_in3_min.dev_attr.attr,
> > +	&sensor_dev_attr_in3_max.dev_attr.attr,
> > +	&sensor_dev_attr_in3_label.dev_attr.attr,
> > +
> > +	&sensor_dev_attr_in4_input.dev_attr.attr,
> > +	&sensor_dev_attr_in4_min.dev_attr.attr,
> > +	&sensor_dev_attr_in4_max.dev_attr.attr,
> > +	&sensor_dev_attr_in4_label.dev_attr.attr,
> > +	NULL
> > +};
> > +
> > +ATTRIBUTE_GROUPS(menf21bmc_hwmon);
> > +
> > +static int menf21bmc_hwmon_probe(struct platform_device *pdev)
> > +{
> > +	int ret;
> > +	struct menf21bmc_hwmon *drv_data;
> > +	struct i2c_client *i2c_client = to_i2c_client(pdev->dev.parent);
> > +	struct device *hwmon_dev;
> > +
> > +	drv_data = devm_kzalloc(&pdev->dev, sizeof(struct menf21bmc_hwmon),
> > +				GFP_KERNEL);
> > +	if (!drv_data)
> > +		return -ENOMEM;
> > +
> > +	drv_data->i2c_client = i2c_client;
> > +
> > +	ret = menf21bmc_hwmon_get_volt_limits(drv_data);
> > +	if (ret) {
> > +		dev_err(&pdev->dev, "failed to read sensor limits");
> > +		return ret;
> > +	}
> > +
> > +	hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
> > +							   "menf21bmc", drv_data,
> > +							   menf21bmc_hwmon_groups);
> 
> Line over 80 characters. Just use less indentation for the continuation lines.
> 

Same as above, checkpatch gave me a warning. I just wanted to align it to the "("
but no problem to change that.

> > +	if (IS_ERR(hwmon_dev))
> > +		return PTR_ERR(hwmon_dev);
> > +
> > +	dev_info(&pdev->dev, "MEN 14F021P00 BMC hwmon device enabled");
> > +
> > +	return 0;
> > +}
> > +
> > +static struct platform_driver menf21bmc_hwmon = {
> > +	.probe		= menf21bmc_hwmon_probe,
> > +	.driver		= {
> > +		.name		= DRV_NAME,
> > +		.owner		= THIS_MODULE,
> > +	},
> > +};
> > +
> > +module_platform_driver(menf21bmc_hwmon);
> > +
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC hwmon");
> > +MODULE_LICENSE("GPL v2");
> > +MODULE_ALIAS("platform:menf21bmc_hwmon");
> > -- 
> > 2.0.4
> > 
> > 

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27  7:26     ` Lee Jones
  (?)
  (?)
@ 2014-08-27 10:36       ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:36 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
>

Forgot to run checkpatch on Kconfig since the last change. Will fix it.
 
> > +	  This driver provides common support for accessing the devices;
> > +	  additional drivers must be enabled in order to use the
> > +	  functionality of the BMC device.
> > +
> >  config EZX_PCAP
> >  	bool "Motorola EZXPCAP Support"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 4e2bc25..37bf336 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
> >  obj-$(CONFIG_MFD_AS3722)	+= as3722.o
> >  obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
> >  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
> > +obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
> >  
> >  intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
> >  obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
> > diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
> > new file mode 100644
> > index 0000000..a6eb03f
> > --- /dev/null
> > +++ b/drivers/mfd/menf21bmc.c
> > @@ -0,0 +1,132 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/device.h>
> > +#include <linux/module.h>
> > +#include <linux/i2c.h>
> > +#include <linux/mfd/core.h>
> > +
> > +#define BMC_CMD_WDT_EXIT_PROD	0x18
> > +#define BMC_CMD_WDT_PROD_STAT	0x19
> > +#define BMC_CMD_REV_MAJOR	0x80
> > +#define BMC_CMD_REV_MINOR	0x81
> > +#define BMC_CMD_REV_MAIN	0x82
> > +
> > +static struct mfd_cell menf21bmc_cell[] = {
> > +	{ .name = "menf21bmc_wdt", },
> > +	{ .name = "menf21bmc_led", },
> > +	{ .name = "menf21bmc_hwmon", }
> > +};
> > +
> > +static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
> > +{
> > +	int val, ret;
> > +
> > +	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
> > +	if (val < 0)
> > +		return val;
> > +
> > +	/*
> > +	 * Production mode should be not active after delivery of the Board.
> > +	 * To be sure we check it, inform the user and exit the mode
> > +	 * if active.
> > +	 */
> > +	if (val == 0x00) {
> > +		dev_info(&client->dev,
> > +			"BMC in production mode. Exit production mode\n");
> > +
> > +		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
> > +{
> > +	int ret;
> > +	int rev_major, rev_minor, rev_main;
> 
> Really small nit (as you have to fix the whitespace err anyway):
>   Can you change the order of the two lines above please?

No problem.

> 
> > +	ret = i2c_check_functionality(client->adapter,
> > +				      I2C_FUNC_SMBUS_BYTE_DATA |
> > +				      I2C_FUNC_SMBUS_WORD_DATA |
> > +				      I2C_FUNC_SMBUS_BYTE);
> > +	if (!ret)
> > +		return -ENODEV;
> > +
> > +	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
> > +	if (rev_major < 0) {
> > +		dev_err(&client->dev, "failed to get BMC major revision\n");
> > +		return rev_major;
> > +	}
> > +
> > +	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
> > +	if (rev_minor < 0) {
> > +		dev_err(&client->dev, "failed to get BMC minor revision\n");
> > +		return rev_minor;
> > +	}
> > +
> > +	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
> > +	if (rev_main < 0) {
> > +		dev_err(&client->dev, "failed to get BMC main revision\n");
> > +		return rev_main;
> > +	}
> > +
> > +	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
> > +					rev_major, rev_minor, rev_main);
> 
> You enforced a 'line > 80 chars' warning in your other driver just so
> you can 'do the right thing' and line up against the '('. :)
> 
> Can you do that here please?
> 

yes

> > +	/*
> > +	 * We have to exit the Production Mode of the BMC to activate the
> > +	 * Watchdog functionality and the BIOS life sign monitoring.
> > +	 */
> > +	ret = menf21bmc_wdt_exit_prod_mode(client);
> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to leave production mode\n");
> > +		return ret;
> > +	}
> > +
> > +	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
> > +				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
> 
> Line up to to '('.
> 

ok

> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to add BMC sub-devices\n");
> > +		return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int menf21bmc_remove(struct i2c_client *client)
> > +{
> > +	mfd_remove_devices(&client->dev);
> > +	return 0;
> > +}
> > +
> > +static const struct i2c_device_id menf21bmc_id_table[] = {
> > +	{ "menf21bmc", 0 },
> 
> The second attribute is unused in this driver, please remove it.
> 

ok

> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 
> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:36       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:36 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
>

Forgot to run checkpatch on Kconfig since the last change. Will fix it.
 
> > +	  This driver provides common support for accessing the devices;
> > +	  additional drivers must be enabled in order to use the
> > +	  functionality of the BMC device.
> > +
> >  config EZX_PCAP
> >  	bool "Motorola EZXPCAP Support"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 4e2bc25..37bf336 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
> >  obj-$(CONFIG_MFD_AS3722)	+= as3722.o
> >  obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
> >  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
> > +obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
> >  
> >  intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
> >  obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
> > diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
> > new file mode 100644
> > index 0000000..a6eb03f
> > --- /dev/null
> > +++ b/drivers/mfd/menf21bmc.c
> > @@ -0,0 +1,132 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/device.h>
> > +#include <linux/module.h>
> > +#include <linux/i2c.h>
> > +#include <linux/mfd/core.h>
> > +
> > +#define BMC_CMD_WDT_EXIT_PROD	0x18
> > +#define BMC_CMD_WDT_PROD_STAT	0x19
> > +#define BMC_CMD_REV_MAJOR	0x80
> > +#define BMC_CMD_REV_MINOR	0x81
> > +#define BMC_CMD_REV_MAIN	0x82
> > +
> > +static struct mfd_cell menf21bmc_cell[] = {
> > +	{ .name = "menf21bmc_wdt", },
> > +	{ .name = "menf21bmc_led", },
> > +	{ .name = "menf21bmc_hwmon", }
> > +};
> > +
> > +static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
> > +{
> > +	int val, ret;
> > +
> > +	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
> > +	if (val < 0)
> > +		return val;
> > +
> > +	/*
> > +	 * Production mode should be not active after delivery of the Board.
> > +	 * To be sure we check it, inform the user and exit the mode
> > +	 * if active.
> > +	 */
> > +	if (val == 0x00) {
> > +		dev_info(&client->dev,
> > +			"BMC in production mode. Exit production mode\n");
> > +
> > +		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
> > +{
> > +	int ret;
> > +	int rev_major, rev_minor, rev_main;
> 
> Really small nit (as you have to fix the whitespace err anyway):
>   Can you change the order of the two lines above please?

No problem.

> 
> > +	ret = i2c_check_functionality(client->adapter,
> > +				      I2C_FUNC_SMBUS_BYTE_DATA |
> > +				      I2C_FUNC_SMBUS_WORD_DATA |
> > +				      I2C_FUNC_SMBUS_BYTE);
> > +	if (!ret)
> > +		return -ENODEV;
> > +
> > +	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
> > +	if (rev_major < 0) {
> > +		dev_err(&client->dev, "failed to get BMC major revision\n");
> > +		return rev_major;
> > +	}
> > +
> > +	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
> > +	if (rev_minor < 0) {
> > +		dev_err(&client->dev, "failed to get BMC minor revision\n");
> > +		return rev_minor;
> > +	}
> > +
> > +	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
> > +	if (rev_main < 0) {
> > +		dev_err(&client->dev, "failed to get BMC main revision\n");
> > +		return rev_main;
> > +	}
> > +
> > +	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
> > +					rev_major, rev_minor, rev_main);
> 
> You enforced a 'line > 80 chars' warning in your other driver just so
> you can 'do the right thing' and line up against the '('. :)
> 
> Can you do that here please?
> 

yes

> > +	/*
> > +	 * We have to exit the Production Mode of the BMC to activate the
> > +	 * Watchdog functionality and the BIOS life sign monitoring.
> > +	 */
> > +	ret = menf21bmc_wdt_exit_prod_mode(client);
> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to leave production mode\n");
> > +		return ret;
> > +	}
> > +
> > +	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
> > +				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
> 
> Line up to to '('.
> 

ok

> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to add BMC sub-devices\n");
> > +		return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int menf21bmc_remove(struct i2c_client *client)
> > +{
> > +	mfd_remove_devices(&client->dev);
> > +	return 0;
> > +}
> > +
> > +static const struct i2c_device_id menf21bmc_id_table[] = {
> > +	{ "menf21bmc", 0 },
> 
> The second attribute is unused in this driver, please remove it.
> 

ok

> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 
> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:36       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:36 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
>

Forgot to run checkpatch on Kconfig since the last change. Will fix it.
 
> > +	  This driver provides common support for accessing the devices;
> > +	  additional drivers must be enabled in order to use the
> > +	  functionality of the BMC device.
> > +
> >  config EZX_PCAP
> >  	bool "Motorola EZXPCAP Support"
> >  	depends on SPI_MASTER
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 4e2bc25..37bf336 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -169,6 +169,7 @@ obj-$(CONFIG_MFD_AS3711)	+= as3711.o
> >  obj-$(CONFIG_MFD_AS3722)	+= as3722.o
> >  obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
> >  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
> > +obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
> >  
> >  intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
> >  obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
> > diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
> > new file mode 100644
> > index 0000000..a6eb03f
> > --- /dev/null
> > +++ b/drivers/mfd/menf21bmc.c
> > @@ -0,0 +1,132 @@
> > +/*
> > + *  MEN 14F021P00 Board Management Controller (BMC) MFD Core Driver.
> > + *
> > + *  Copyright (C) 2014 MEN Mikro Elektronik Nuernberg GmbH
> > + *
> > + *  This program is free software; you can redistribute  it and/or modify it
> > + *  under  the terms of  the GNU General  Public License as published by the
> > + *  Free Software Foundation;  either version 2 of the  License, or (at your
> > + *  option) any later version.
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/device.h>
> > +#include <linux/module.h>
> > +#include <linux/i2c.h>
> > +#include <linux/mfd/core.h>
> > +
> > +#define BMC_CMD_WDT_EXIT_PROD	0x18
> > +#define BMC_CMD_WDT_PROD_STAT	0x19
> > +#define BMC_CMD_REV_MAJOR	0x80
> > +#define BMC_CMD_REV_MINOR	0x81
> > +#define BMC_CMD_REV_MAIN	0x82
> > +
> > +static struct mfd_cell menf21bmc_cell[] = {
> > +	{ .name = "menf21bmc_wdt", },
> > +	{ .name = "menf21bmc_led", },
> > +	{ .name = "menf21bmc_hwmon", }
> > +};
> > +
> > +static int menf21bmc_wdt_exit_prod_mode(struct i2c_client *client)
> > +{
> > +	int val, ret;
> > +
> > +	val = i2c_smbus_read_byte_data(client, BMC_CMD_WDT_PROD_STAT);
> > +	if (val < 0)
> > +		return val;
> > +
> > +	/*
> > +	 * Production mode should be not active after delivery of the Board.
> > +	 * To be sure we check it, inform the user and exit the mode
> > +	 * if active.
> > +	 */
> > +	if (val == 0x00) {
> > +		dev_info(&client->dev,
> > +			"BMC in production mode. Exit production mode\n");
> > +
> > +		ret = i2c_smbus_write_byte(client, BMC_CMD_WDT_EXIT_PROD);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
> > +{
> > +	int ret;
> > +	int rev_major, rev_minor, rev_main;
> 
> Really small nit (as you have to fix the whitespace err anyway):
>   Can you change the order of the two lines above please?

No problem.

> 
> > +	ret = i2c_check_functionality(client->adapter,
> > +				      I2C_FUNC_SMBUS_BYTE_DATA |
> > +				      I2C_FUNC_SMBUS_WORD_DATA |
> > +				      I2C_FUNC_SMBUS_BYTE);
> > +	if (!ret)
> > +		return -ENODEV;
> > +
> > +	rev_major = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAJOR);
> > +	if (rev_major < 0) {
> > +		dev_err(&client->dev, "failed to get BMC major revision\n");
> > +		return rev_major;
> > +	}
> > +
> > +	rev_minor = i2c_smbus_read_word_data(client, BMC_CMD_REV_MINOR);
> > +	if (rev_minor < 0) {
> > +		dev_err(&client->dev, "failed to get BMC minor revision\n");
> > +		return rev_minor;
> > +	}
> > +
> > +	rev_main = i2c_smbus_read_word_data(client, BMC_CMD_REV_MAIN);
> > +	if (rev_main < 0) {
> > +		dev_err(&client->dev, "failed to get BMC main revision\n");
> > +		return rev_main;
> > +	}
> > +
> > +	dev_info(&client->dev, "FW Revision: %02d.%02d.%02d\n",
> > +					rev_major, rev_minor, rev_main);
> 
> You enforced a 'line > 80 chars' warning in your other driver just so
> you can 'do the right thing' and line up against the '('. :)
> 
> Can you do that here please?
> 

yes

> > +	/*
> > +	 * We have to exit the Production Mode of the BMC to activate the
> > +	 * Watchdog functionality and the BIOS life sign monitoring.
> > +	 */
> > +	ret = menf21bmc_wdt_exit_prod_mode(client);
> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to leave production mode\n");
> > +		return ret;
> > +	}
> > +
> > +	ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
> > +				ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
> 
> Line up to to '('.
> 

ok

> > +	if (ret < 0) {
> > +		dev_err(&client->dev, "failed to add BMC sub-devices\n");
> > +		return ret;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int menf21bmc_remove(struct i2c_client *client)
> > +{
> > +	mfd_remove_devices(&client->dev);
> > +	return 0;
> > +}
> > +
> > +static const struct i2c_device_id menf21bmc_id_table[] = {
> > +	{ "menf21bmc", 0 },
> 
> The second attribute is unused in this driver, please remove it.
> 

ok

> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 
> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:36       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:36 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

T24gV2VkLCBBdWcgMjcsIDIwMTQgYXQgMDg6MjY6MzNBTSArMDEwMCwgTGVlIEpvbmVzIHdyb3Rl
Ogo+IE9uIFR1ZSwgMjYgQXVnIDIwMTQsIEFuZHJlYXMgV2VybmVyIHdyb3RlOgo+ID4gVGhlIE1F
TiAxNEYwMjFQMDAgQm9hcmQgTWFuYWdlbWVudCBDb250cm9sbGVyIHByb3ZpZGVzIGFuCj4gPiBJ
MkMgaW50ZXJmYWNlIHRvIHRoZSBob3N0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZSBpbXBsZW1lbnRl
ZCBpbiB0aGUgQk1DLgo+ID4gVGhlIEJNQyBpcyBhIFBJQyBNaWNyb250cm9sbGVyIGFzc2VtYmxl
ZCBvbiBDUENJIENhcmQgZnJvbSBNRU4gTWlrcm9lbGVrdHJvbmlrCj4gPiBhbmQgb24gYSBmZXcg
Qm94L0Rpc3BsYXkgQ29tcHV0ZXIuCj4gPiAKPiA+IEFkZGVkIE1GRCBDb3JlIGRyaXZlciwgc3Vw
cG9ydGluZyB0aGUgSTJDIGNvbW11bmljYXRpb24gdG8gdGhlIGRldmljZS4KPiA+IAo+ID4gVGhl
IE1GRCBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Cj4g
PiAgCS0gV2F0Y2hkb2cKPiA+ICAJLSBMRURzCj4gPiAJLSBId21vbiAodm9sdGFnZSBtb25pdG9y
aW5nKQo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJu
ZXJAbWVuLmRlPgo+ID4gQWNrZWQtYnk6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+
Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL21mZC9LY29uZmlnICAgICB8ICAxMiArKysrKwo+ID4gIGRy
aXZlcnMvbWZkL01ha2VmaWxlICAgIHwgICAxICsKPiA+ICBkcml2ZXJzL21mZC9tZW5mMjFibWMu
YyB8IDEzMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK
PiA+ICAzIGZpbGVzIGNoYW5nZWQsIDE0NSBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1vZGUg
MTAwNjQ0IGRyaXZlcnMvbWZkL21lbmYyMWJtYy5jCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+ID4gaW5kZXggYjhkOWNhMC4u
NmE5ZjEwMSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKPiA+ICsrKyBiL2Ry
aXZlcnMvbWZkL0tjb25maWcKPiA+IEBAIC00NTMsNiArNDUzLDE4IEBAIGNvbmZpZyBNRkRfTUFY
ODk5OAo+ID4gIAkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIg
dG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5Cj4gPiAgCSAgb2YgdGhlIGRldmljZS4KPiA+ICAKPiA+
ICtjb25maWcgTUZEX01FTkYyMUJNQwo+ID4gKwl0cmlzdGF0ZSAiTUVOIDE0RjAyMVAwMCBCb2Fy
ZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgU3VwcG9ydCIKPiA+ICsJZGVwZW5kcyBvbiBJMkMKPiA+
ICsJc2VsZWN0IE1GRF9DT1JFCj4gPiArCWhlbHAKPiA+ICsJICBTYXkgeWVzIGhlcmUgdG8gYWRk
IHN1cHBvcnQgZm9yIHRoZSBNRU4gMTRGMDIxUDAwIEJNQwo+ID4gKwkgIHdoaWNoIGlzIGEgQm9h
cmQgTWFuYWdlbWVudCBDb250cm9sbGVyIGNvbm5lY3RlZCB0byB0aGUgSTJDIGJ1cy4KPiA+ICsJ
ICBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIHN1Yi1kZXZpY2VzIGxpa2UgTEVELCBIV01P
TiAgYW5kIFdEVC4KPiAKPiBOaXQ6IFdoaXRlc3BhY2UgZXJyb3IuCj4KCkZvcmdvdCB0byBydW4g
Y2hlY2twYXRjaCBvbiBLY29uZmlnIHNpbmNlIHRoZSBsYXN0IGNoYW5nZS4gV2lsbCBmaXggaXQu
CiAKPiA+ICsJICBUaGlzIGRyaXZlciBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgYWNjZXNz
aW5nIHRoZSBkZXZpY2VzOwo+ID4gKwkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJs
ZWQgaW4gb3JkZXIgdG8gdXNlIHRoZQo+ID4gKwkgIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEJNQyBk
ZXZpY2UuCj4gPiArCj4gPiAgY29uZmlnIEVaWF9QQ0FQCj4gPiAgCWJvb2wgIk1vdG9yb2xhIEVa
WFBDQVAgU3VwcG9ydCIKPiA+ICAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCj4gPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQo+ID4gaW5kZXgg
NGUyYmMyNS4uMzdiZjMzNiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCj4g
PiArKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQo+ID4gQEAgLTE2OSw2ICsxNjksNyBAQCBvYmot
JChDT05GSUdfTUZEX0FTMzcxMSkJKz0gYXMzNzExLm8KPiA+ICBvYmotJChDT05GSUdfTUZEX0FT
MzcyMikJKz0gYXMzNzIyLm8KPiA+ICBvYmotJChDT05GSUdfTUZEX1NUVzQ4MVgpCSs9IHN0dzQ4
MXgubwo+ID4gIG9iai0kKENPTkZJR19NRkRfSVBBUV9NSUNSTykJKz0gaXBhcS1taWNyby5vCj4g
PiArb2JqLSQoQ09ORklHX01GRF9NRU5GMjFCTUMpCSs9IG1lbmYyMWJtYy5vCj4gPiAgCj4gPiAg
aW50ZWwtc29jLXBtaWMtb2JqcwkJOj0gaW50ZWxfc29jX3BtaWNfY29yZS5vIGludGVsX3NvY19w
bWljX2NyYy5vCj4gPiAgb2JqLSQoQ09ORklHX0lOVEVMX1NPQ19QTUlDKQkrPSBpbnRlbC1zb2Mt
cG1pYy5vCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWVuZjIxYm1jLmMgYi9kcml2ZXJz
L21mZC9tZW5mMjFibWMuYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAw
MDAuLmE2ZWIwM2YKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2RyaXZlcnMvbWZkL21lbmYy
MWJtYy5jCj4gPiBAQCAtMCwwICsxLDEzMiBAQAo+ID4gKy8qCj4gPiArICogIE1FTiAxNEYwMjFQ
MDAgQm9hcmQgTWFuYWdlbWVudCBDb250cm9sbGVyIChCTUMpIE1GRCBDb3JlIERyaXZlci4KPiA+
ICsgKgo+ID4gKyAqICBDb3B5cmlnaHQgKEMpIDIwMTQgTUVOIE1pa3JvIEVsZWt0cm9uaWsgTnVl
cm5iZXJnIEdtYkgKPiA+ICsgKgo+ID4gKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKPiA+ICsgKiAgdW5k
ZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlCj4gPiArICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2
ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgo+ID4gKyAqICBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXJu
ZWwuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4
L21vZHVsZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiA+ICsjaW5jbHVkZSA8bGlu
dXgvbWZkL2NvcmUuaD4KPiA+ICsKPiA+ICsjZGVmaW5lIEJNQ19DTURfV0RUX0VYSVRfUFJPRAkw
eDE4Cj4gPiArI2RlZmluZSBCTUNfQ01EX1dEVF9QUk9EX1NUQVQJMHgxOQo+ID4gKyNkZWZpbmUg
Qk1DX0NNRF9SRVZfTUFKT1IJMHg4MAo+ID4gKyNkZWZpbmUgQk1DX0NNRF9SRVZfTUlOT1IJMHg4
MQo+ID4gKyNkZWZpbmUgQk1DX0NNRF9SRVZfTUFJTgkweDgyCj4gPiArCj4gPiArc3RhdGljIHN0
cnVjdCBtZmRfY2VsbCBtZW5mMjFibWNfY2VsbFtdID0gewo+ID4gKwl7IC5uYW1lID0gIm1lbmYy
MWJtY193ZHQiLCB9LAo+ID4gKwl7IC5uYW1lID0gIm1lbmYyMWJtY19sZWQiLCB9LAo+ID4gKwl7
IC5uYW1lID0gIm1lbmYyMWJtY19od21vbiIsIH0KPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBp
bnQgbWVuZjIxYm1jX3dkdF9leGl0X3Byb2RfbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50
KQo+ID4gK3sKPiA+ICsJaW50IHZhbCwgcmV0Owo+ID4gKwo+ID4gKwl2YWwgPSBpMmNfc21idXNf
cmVhZF9ieXRlX2RhdGEoY2xpZW50LCBCTUNfQ01EX1dEVF9QUk9EX1NUQVQpOwo+ID4gKwlpZiAo
dmFsIDwgMCkKPiA+ICsJCXJldHVybiB2YWw7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFByb2R1
Y3Rpb24gbW9kZSBzaG91bGQgYmUgbm90IGFjdGl2ZSBhZnRlciBkZWxpdmVyeSBvZiB0aGUgQm9h
cmQuCj4gPiArCSAqIFRvIGJlIHN1cmUgd2UgY2hlY2sgaXQsIGluZm9ybSB0aGUgdXNlciBhbmQg
ZXhpdCB0aGUgbW9kZQo+ID4gKwkgKiBpZiBhY3RpdmUuCj4gPiArCSAqLwo+ID4gKwlpZiAodmFs
ID09IDB4MDApIHsKPiA+ICsJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKPiA+ICsJCQkiQk1DIGlu
IHByb2R1Y3Rpb24gbW9kZS4gRXhpdCBwcm9kdWN0aW9uIG1vZGVcbiIpOwo+ID4gKwo+ID4gKwkJ
cmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBCTUNfQ01EX1dEVF9FWElUX1BST0Qp
Owo+ID4gKwkJaWYgKHJldCA8IDApCj4gPiArCQkJcmV0dXJuIHJldDsKPiA+ICsJfQo+ID4gKwo+
ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludAo+ID4gK21lbmYyMWJt
Y19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2Rldmlj
ZV9pZCAqaWRzKQo+ID4gK3sKPiA+ICsJaW50IHJldDsKPiA+ICsJaW50IHJldl9tYWpvciwgcmV2
X21pbm9yLCByZXZfbWFpbjsKPiAKPiBSZWFsbHkgc21hbGwgbml0IChhcyB5b3UgaGF2ZSB0byBm
aXggdGhlIHdoaXRlc3BhY2UgZXJyIGFueXdheSk6Cj4gICBDYW4geW91IGNoYW5nZSB0aGUgb3Jk
ZXIgb2YgdGhlIHR3byBsaW5lcyBhYm92ZSBwbGVhc2U/CgpObyBwcm9ibGVtLgoKPiAKPiA+ICsJ
cmV0ID0gaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAo+ID4gKwkJCQkg
ICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAo+ID4gKwkJCQkgICAgICBJMkNfRlVOQ19T
TUJVU19XT1JEX0RBVEEgfAo+ID4gKwkJCQkgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFKTsKPiA+
ICsJaWYgKCFyZXQpCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsKPiA+ICsKPiA+ICsJcmV2X21ham9y
ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQk1DX0NNRF9SRVZfTUFKT1IpOwo+
ID4gKwlpZiAocmV2X21ham9yIDwgMCkgewo+ID4gKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJm
YWlsZWQgdG8gZ2V0IEJNQyBtYWpvciByZXZpc2lvblxuIik7Cj4gPiArCQlyZXR1cm4gcmV2X21h
am9yOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldl9taW5vciA9IGkyY19zbWJ1c19yZWFkX3dvcmRf
ZGF0YShjbGllbnQsIEJNQ19DTURfUkVWX01JTk9SKTsKPiA+ICsJaWYgKHJldl9taW5vciA8IDAp
IHsKPiA+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBCTUMgbWlub3Ig
cmV2aXNpb25cbiIpOwo+ID4gKwkJcmV0dXJuIHJldl9taW5vcjsKPiA+ICsJfQo+ID4gKwo+ID4g
KwlyZXZfbWFpbiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIEJNQ19DTURfUkVW
X01BSU4pOwo+ID4gKwlpZiAocmV2X21haW4gPCAwKSB7Cj4gPiArCQlkZXZfZXJyKCZjbGllbnQt
PmRldiwgImZhaWxlZCB0byBnZXQgQk1DIG1haW4gcmV2aXNpb25cbiIpOwo+ID4gKwkJcmV0dXJu
IHJldl9tYWluOwo+ID4gKwl9Cj4gPiArCj4gPiArCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkZX
IFJldmlzaW9uOiAlMDJkLiUwMmQuJTAyZFxuIiwKPiA+ICsJCQkJCXJldl9tYWpvciwgcmV2X21p
bm9yLCByZXZfbWFpbik7Cj4gCj4gWW91IGVuZm9yY2VkIGEgJ2xpbmUgPiA4MCBjaGFycycgd2Fy
bmluZyBpbiB5b3VyIG90aGVyIGRyaXZlciBqdXN0IHNvCj4geW91IGNhbiAnZG8gdGhlIHJpZ2h0
IHRoaW5nJyBhbmQgbGluZSB1cCBhZ2FpbnN0IHRoZSAnKCcuIDopCj4gCj4gQ2FuIHlvdSBkbyB0
aGF0IGhlcmUgcGxlYXNlPwo+IAoKeWVzCgo+ID4gKwkvKgo+ID4gKwkgKiBXZSBoYXZlIHRvIGV4
aXQgdGhlIFByb2R1Y3Rpb24gTW9kZSBvZiB0aGUgQk1DIHRvIGFjdGl2YXRlIHRoZQo+ID4gKwkg
KiBXYXRjaGRvZyBmdW5jdGlvbmFsaXR5IGFuZCB0aGUgQklPUyBsaWZlIHNpZ24gbW9uaXRvcmlu
Zy4KPiA+ICsJICovCj4gPiArCXJldCA9IG1lbmYyMWJtY193ZHRfZXhpdF9wcm9kX21vZGUoY2xp
ZW50KTsKPiA+ICsJaWYgKHJldCA8IDApIHsKPiA+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAi
ZmFpbGVkIHRvIGxlYXZlIHByb2R1Y3Rpb24gbW9kZVxuIik7Cj4gPiArCQlyZXR1cm4gcmV0Owo+
ID4gKwl9Cj4gPiArCj4gPiArCXJldCA9IG1mZF9hZGRfZGV2aWNlcygmY2xpZW50LT5kZXYsIDAs
IG1lbmYyMWJtY19jZWxsLAo+ID4gKwkJCQlBUlJBWV9TSVpFKG1lbmYyMWJtY19jZWxsKSwgTlVM
TCwgMCwgTlVMTCk7Cj4gCj4gTGluZSB1cCB0byB0byAnKCcuCj4gCgpvawoKPiA+ICsJaWYgKHJl
dCA8IDApIHsKPiA+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBCTUMg
c3ViLWRldmljZXNcbiIpOwo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsJfQo+ID4gKwo+ID4gKwly
ZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtZW5mMjFibWNfcmVtb3ZlKHN0
cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCj4gPiArewo+ID4gKwltZmRfcmVtb3ZlX2RldmljZXMo
JmNsaWVudC0+ZGV2KTsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBj
b25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtZW5mMjFibWNfaWRfdGFibGVbXSA9IHsKPiA+ICsJ
eyAibWVuZjIxYm1jIiwgMCB9LAo+IAo+IFRoZSBzZWNvbmQgYXR0cmlidXRlIGlzIHVudXNlZCBp
biB0aGlzIGRyaXZlciwgcGxlYXNlIHJlbW92ZSBpdC4KPiAKCm9rCgo+ID4gKwl7IH0KPiA+ICt9
Owo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtZW5mMjFibWNfaWRfdGFibGUpOwo+ID4g
Kwo+ID4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtZW5mMjFibWNfZHJpdmVyID0gewo+ID4g
KwkuZHJpdmVyLm5hbWUJPSAibWVuZjIxYm1jIiwKPiA+ICsJLmlkX3RhYmxlCT0gbWVuZjIxYm1j
X2lkX3RhYmxlLAo+ID4gKwkucHJvYmUJCT0gbWVuZjIxYm1jX3Byb2JlLAo+ID4gKwkucmVtb3Zl
CQk9IG1lbmYyMWJtY19yZW1vdmUsCj4gPiArfTsKPiAKPiBObyBEVCBzdXBwb3J0Pwo+IAo+ID4g
K21vZHVsZV9pMmNfZHJpdmVyKG1lbmYyMWJtY19kcml2ZXIpOwo+ID4gKwo+ID4gK01PRFVMRV9E
RVNDUklQVElPTigiTUVOIDE0RjAyMVAwMCBCTUMgbWZkIGNvcmUgZHJpdmVyIik7Cj4gCj4gcy9t
ZmQvTUZECj4gCj4gPiArTU9EVUxFX0FVVEhPUigiQW5kcmVhcyBXZXJuZXIgPGFuZHJlYXMud2Vy
bmVyQG1lbi5kZT4iKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gCj4gLS0gCj4g
TGVlIEpvbmVzCj4gTGluYXJvIFNUTWljcm9lbGVjdHJvbmljcyBMYW5kaW5nIFRlYW0gTGVhZAo+
IExpbmFyby5vcmcg4pSCIE9wZW4gc291cmNlIHNvZnR3YXJlIGZvciBBUk0gU29Dcwo+IEZvbGxv
dyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRlciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNl
bnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4v
bGlzdGluZm8vbG0tc2Vuc29ycw=

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27  7:26     ` Lee Jones
  (?)
  (?)
@ 2014-08-27 10:52       ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:52 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
> 

I run checkpatch but did not find any whitespace error.
Where is it?

...

> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 

No not at the moment because it is used only on x86 system.

> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:52       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:52 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
> 

I run checkpatch but did not find any whitespace error.
Where is it?

...

> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 

No not at the moment because it is used only on x86 system.

> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:52       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:52 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
> > The MEN 14F021P00 Board Management Controller provides an
> > I2C interface to the host to access the feature implemented in the BMC.
> > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > and on a few Box/Display Computer.
> > 
> > Added MFD Core driver, supporting the I2C communication to the device.
> > 
> > The MFD driver currently supports the following features:
> >  	- Watchdog
> >  	- LEDs
> > 	- Hwmon (voltage monitoring)
> > 
> > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig     |  12 +++++
> >  drivers/mfd/Makefile    |   1 +
> >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 145 insertions(+)
> >  create mode 100644 drivers/mfd/menf21bmc.c
> > 
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index b8d9ca0..6a9f101 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -453,6 +453,18 @@ config MFD_MAX8998
> >  	  additional drivers must be enabled in order to use the functionality
> >  	  of the device.
> >  
> > +config MFD_MENF21BMC
> > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > +	depends on I2C
> > +	select MFD_CORE
> > +	help
> > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > +	  which is a Board Management Controller connected to the I2C bus.
> > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> 
> Nit: Whitespace error.
> 

I run checkpatch but did not find any whitespace error.
Where is it?

...

> > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > +
> > +static struct i2c_driver menf21bmc_driver = {
> > +	.driver.name	= "menf21bmc",
> > +	.id_table	= menf21bmc_id_table,
> > +	.probe		= menf21bmc_probe,
> > +	.remove		= menf21bmc_remove,
> > +};
> 
> No DT support?
> 

No not at the moment because it is used only on x86 system.

> > +module_i2c_driver(menf21bmc_driver);
> > +
> > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> 
> s/mfd/MFD
> 
> > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > +MODULE_LICENSE("GPL v2");
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 10:52       ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 10:52 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

T24gV2VkLCBBdWcgMjcsIDIwMTQgYXQgMDg6MjY6MzNBTSArMDEwMCwgTGVlIEpvbmVzIHdyb3Rl
Ogo+IE9uIFR1ZSwgMjYgQXVnIDIwMTQsIEFuZHJlYXMgV2VybmVyIHdyb3RlOgo+ID4gVGhlIE1F
TiAxNEYwMjFQMDAgQm9hcmQgTWFuYWdlbWVudCBDb250cm9sbGVyIHByb3ZpZGVzIGFuCj4gPiBJ
MkMgaW50ZXJmYWNlIHRvIHRoZSBob3N0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZSBpbXBsZW1lbnRl
ZCBpbiB0aGUgQk1DLgo+ID4gVGhlIEJNQyBpcyBhIFBJQyBNaWNyb250cm9sbGVyIGFzc2VtYmxl
ZCBvbiBDUENJIENhcmQgZnJvbSBNRU4gTWlrcm9lbGVrdHJvbmlrCj4gPiBhbmQgb24gYSBmZXcg
Qm94L0Rpc3BsYXkgQ29tcHV0ZXIuCj4gPiAKPiA+IEFkZGVkIE1GRCBDb3JlIGRyaXZlciwgc3Vw
cG9ydGluZyB0aGUgSTJDIGNvbW11bmljYXRpb24gdG8gdGhlIGRldmljZS4KPiA+IAo+ID4gVGhl
IE1GRCBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Cj4g
PiAgCS0gV2F0Y2hkb2cKPiA+ICAJLSBMRURzCj4gPiAJLSBId21vbiAodm9sdGFnZSBtb25pdG9y
aW5nKQo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJu
ZXJAbWVuLmRlPgo+ID4gQWNrZWQtYnk6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+
Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL21mZC9LY29uZmlnICAgICB8ICAxMiArKysrKwo+ID4gIGRy
aXZlcnMvbWZkL01ha2VmaWxlICAgIHwgICAxICsKPiA+ICBkcml2ZXJzL21mZC9tZW5mMjFibWMu
YyB8IDEzMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK
PiA+ICAzIGZpbGVzIGNoYW5nZWQsIDE0NSBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1vZGUg
MTAwNjQ0IGRyaXZlcnMvbWZkL21lbmYyMWJtYy5jCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+ID4gaW5kZXggYjhkOWNhMC4u
NmE5ZjEwMSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKPiA+ICsrKyBiL2Ry
aXZlcnMvbWZkL0tjb25maWcKPiA+IEBAIC00NTMsNiArNDUzLDE4IEBAIGNvbmZpZyBNRkRfTUFY
ODk5OAo+ID4gIAkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIg
dG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5Cj4gPiAgCSAgb2YgdGhlIGRldmljZS4KPiA+ICAKPiA+
ICtjb25maWcgTUZEX01FTkYyMUJNQwo+ID4gKwl0cmlzdGF0ZSAiTUVOIDE0RjAyMVAwMCBCb2Fy
ZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgU3VwcG9ydCIKPiA+ICsJZGVwZW5kcyBvbiBJMkMKPiA+
ICsJc2VsZWN0IE1GRF9DT1JFCj4gPiArCWhlbHAKPiA+ICsJICBTYXkgeWVzIGhlcmUgdG8gYWRk
IHN1cHBvcnQgZm9yIHRoZSBNRU4gMTRGMDIxUDAwIEJNQwo+ID4gKwkgIHdoaWNoIGlzIGEgQm9h
cmQgTWFuYWdlbWVudCBDb250cm9sbGVyIGNvbm5lY3RlZCB0byB0aGUgSTJDIGJ1cy4KPiA+ICsJ
ICBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIHN1Yi1kZXZpY2VzIGxpa2UgTEVELCBIV01P
TiAgYW5kIFdEVC4KPiAKPiBOaXQ6IFdoaXRlc3BhY2UgZXJyb3IuCj4gCgpJIHJ1biBjaGVja3Bh
dGNoIGJ1dCBkaWQgbm90IGZpbmQgYW55IHdoaXRlc3BhY2UgZXJyb3IuCldoZXJlIGlzIGl0PwoK
Li4uCgo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtZW5mMjFibWNfaWRfdGFibGUpOwo+
ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtZW5mMjFibWNfZHJpdmVyID0gewo+
ID4gKwkuZHJpdmVyLm5hbWUJPSAibWVuZjIxYm1jIiwKPiA+ICsJLmlkX3RhYmxlCT0gbWVuZjIx
Ym1jX2lkX3RhYmxlLAo+ID4gKwkucHJvYmUJCT0gbWVuZjIxYm1jX3Byb2JlLAo+ID4gKwkucmVt
b3ZlCQk9IG1lbmYyMWJtY19yZW1vdmUsCj4gPiArfTsKPiAKPiBObyBEVCBzdXBwb3J0Pwo+IAoK
Tm8gbm90IGF0IHRoZSBtb21lbnQgYmVjYXVzZSBpdCBpcyB1c2VkIG9ubHkgb24geDg2IHN5c3Rl
bS4KCj4gPiArbW9kdWxlX2kyY19kcml2ZXIobWVuZjIxYm1jX2RyaXZlcik7Cj4gPiArCj4gPiAr
TU9EVUxFX0RFU0NSSVBUSU9OKCJNRU4gMTRGMDIxUDAwIEJNQyBtZmQgY29yZSBkcml2ZXIiKTsK
PiAKPiBzL21mZC9NRkQKPiAKPiA+ICtNT0RVTEVfQVVUSE9SKCJBbmRyZWFzIFdlcm5lciA8YW5k
cmVhcy53ZXJuZXJAbWVuLmRlPiIpOwo+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKPiAK
PiAtLSAKPiBMZWUgSm9uZXMKPiBMaW5hcm8gU1RNaWNyb2VsZWN0cm9uaWNzIExhbmRpbmcgVGVh
bSBMZWFkCj4gTGluYXJvLm9yZyDilIIgT3BlbiBzb3VyY2Ugc29mdHdhcmUgZm9yIEFSTSBTb0Nz
Cj4gRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVyIHwgQmxvZwoKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxp
c3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcv
bWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27 10:52       ` Andreas Werner
@ 2014-08-27 11:01         ` Lee Jones
  -1 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 11:01 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

On Wed, 27 Aug 2014, Andreas Werner wrote:
> On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> > On Tue, 26 Aug 2014, Andreas Werner wrote:
> > > The MEN 14F021P00 Board Management Controller provides an
> > > I2C interface to the host to access the feature implemented in the BMC.
> > > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > > and on a few Box/Display Computer.
> > > 
> > > Added MFD Core driver, supporting the I2C communication to the device.
> > > 
> > > The MFD driver currently supports the following features:
> > >  	- Watchdog
> > >  	- LEDs
> > > 	- Hwmon (voltage monitoring)
> > > 
> > > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > ---
> > >  drivers/mfd/Kconfig     |  12 +++++
> > >  drivers/mfd/Makefile    |   1 +
> > >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> > >  3 files changed, 145 insertions(+)
> > >  create mode 100644 drivers/mfd/menf21bmc.c
> > > 
> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > index b8d9ca0..6a9f101 100644
> > > --- a/drivers/mfd/Kconfig
> > > +++ b/drivers/mfd/Kconfig
> > > @@ -453,6 +453,18 @@ config MFD_MAX8998
> > >  	  additional drivers must be enabled in order to use the functionality
> > >  	  of the device.
> > >  
> > > +config MFD_MENF21BMC
> > > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > > +	depends on I2C
> > > +	select MFD_CORE
> > > +	help
> > > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > > +	  which is a Board Management Controller connected to the I2C bus.
> > > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> > 
> > Nit: Whitespace error.
> > 
> 
> I run checkpatch but did not find any whitespace error.
> Where is it?

After 'HWMON'.

> > > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > > +
> > > +static struct i2c_driver menf21bmc_driver = {
> > > +	.driver.name	= "menf21bmc",
> > > +	.id_table	= menf21bmc_id_table,
> > > +	.probe		= menf21bmc_probe,
> > > +	.remove		= menf21bmc_remove,
> > > +};
> > 
> > No DT support?
> > 
> 
> No not at the moment because it is used only on x86 system.

Ah okay.  Shouldn't the Kconfig depend on X86 then?  What about ACPI?

> > > +module_i2c_driver(menf21bmc_driver);
> > > +
> > > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> > 
> > s/mfd/MFD
> > 
> > > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > > +MODULE_LICENSE("GPL v2");
> > 

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 11:01         ` Lee Jones
  0 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 11:01 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

T24gV2VkLCAyNyBBdWcgMjAxNCwgQW5kcmVhcyBXZXJuZXIgd3JvdGU6Cj4gT24gV2VkLCBBdWcg
MjcsIDIwMTQgYXQgMDg6MjY6MzNBTSArMDEwMCwgTGVlIEpvbmVzIHdyb3RlOgo+ID4gT24gVHVl
LCAyNiBBdWcgMjAxNCwgQW5kcmVhcyBXZXJuZXIgd3JvdGU6Cj4gPiA+IFRoZSBNRU4gMTRGMDIx
UDAwIEJvYXJkIE1hbmFnZW1lbnQgQ29udHJvbGxlciBwcm92aWRlcyBhbgo+ID4gPiBJMkMgaW50
ZXJmYWNlIHRvIHRoZSBob3N0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZSBpbXBsZW1lbnRlZCBpbiB0
aGUgQk1DLgo+ID4gPiBUaGUgQk1DIGlzIGEgUElDIE1pY3JvbnRyb2xsZXIgYXNzZW1ibGVkIG9u
IENQQ0kgQ2FyZCBmcm9tIE1FTiBNaWtyb2VsZWt0cm9uaWsKPiA+ID4gYW5kIG9uIGEgZmV3IEJv
eC9EaXNwbGF5IENvbXB1dGVyLgo+ID4gPiAKPiA+ID4gQWRkZWQgTUZEIENvcmUgZHJpdmVyLCBz
dXBwb3J0aW5nIHRoZSBJMkMgY29tbXVuaWNhdGlvbiB0byB0aGUgZGV2aWNlLgo+ID4gPiAKPiA+
ID4gVGhlIE1GRCBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVy
ZXM6Cj4gPiA+ICAJLSBXYXRjaGRvZwo+ID4gPiAgCS0gTEVEcwo+ID4gPiAJLSBId21vbiAodm9s
dGFnZSBtb25pdG9yaW5nKQo+ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogQW5kcmVhcyBXZXJu
ZXIgPGFuZHJlYXMud2VybmVyQG1lbi5kZT4KPiA+ID4gQWNrZWQtYnk6IExlZSBKb25lcyA8bGVl
LmpvbmVzQGxpbmFyby5vcmc+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9tZmQvS2NvbmZpZyAg
ICAgfCAgMTIgKysrKysKPiA+ID4gIGRyaXZlcnMvbWZkL01ha2VmaWxlICAgIHwgICAxICsKPiA+
ID4gIGRyaXZlcnMvbWZkL21lbmYyMWJtYy5jIHwgMTMyICsrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gPiAgMyBmaWxlcyBjaGFuZ2VkLCAxNDUgaW5z
ZXJ0aW9ucygrKQo+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWZkL21lbmYyMWJt
Yy5jCj4gPiA+IAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZl
cnMvbWZkL0tjb25maWcKPiA+ID4gaW5kZXggYjhkOWNhMC4uNmE5ZjEwMSAxMDA2NDQKPiA+ID4g
LS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZwo+ID4gPiArKysgYi9kcml2ZXJzL21mZC9LY29uZmln
Cj4gPiA+IEBAIC00NTMsNiArNDUzLDE4IEBAIGNvbmZpZyBNRkRfTUFYODk5OAo+ID4gPiAgCSAg
YWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGZ1
bmN0aW9uYWxpdHkKPiA+ID4gIAkgIG9mIHRoZSBkZXZpY2UuCj4gPiA+ICAKPiA+ID4gK2NvbmZp
ZyBNRkRfTUVORjIxQk1DCj4gPiA+ICsJdHJpc3RhdGUgIk1FTiAxNEYwMjFQMDAgQm9hcmQgTWFu
YWdlbWVudCBDb250cm9sbGVyIFN1cHBvcnQiCj4gPiA+ICsJZGVwZW5kcyBvbiBJMkMKPiA+ID4g
KwlzZWxlY3QgTUZEX0NPUkUKPiA+ID4gKwloZWxwCj4gPiA+ICsJICBTYXkgeWVzIGhlcmUgdG8g
YWRkIHN1cHBvcnQgZm9yIHRoZSBNRU4gMTRGMDIxUDAwIEJNQwo+ID4gPiArCSAgd2hpY2ggaXMg
YSBCb2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHRoZSBJMkMgYnVzLgo+
ID4gPiArCSAgVGhlIGRldmljZSBzdXBwb3J0cyBtdWx0aXBsZSBzdWItZGV2aWNlcyBsaWtlIExF
RCwgSFdNT04gIGFuZCBXRFQuCj4gPiAKPiA+IE5pdDogV2hpdGVzcGFjZSBlcnJvci4KPiA+IAo+
IAo+IEkgcnVuIGNoZWNrcGF0Y2ggYnV0IGRpZCBub3QgZmluZCBhbnkgd2hpdGVzcGFjZSBlcnJv
ci4KPiBXaGVyZSBpcyBpdD8KCkFmdGVyICdIV01PTicuCgo+ID4gPiArTU9EVUxFX0RFVklDRV9U
QUJMRShpMmMsIG1lbmYyMWJtY19pZF90YWJsZSk7Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzdHJ1
Y3QgaTJjX2RyaXZlciBtZW5mMjFibWNfZHJpdmVyID0gewo+ID4gPiArCS5kcml2ZXIubmFtZQk9
ICJtZW5mMjFibWMiLAo+ID4gPiArCS5pZF90YWJsZQk9IG1lbmYyMWJtY19pZF90YWJsZSwKPiA+
ID4gKwkucHJvYmUJCT0gbWVuZjIxYm1jX3Byb2JlLAo+ID4gPiArCS5yZW1vdmUJCT0gbWVuZjIx
Ym1jX3JlbW92ZSwKPiA+ID4gK307Cj4gPiAKPiA+IE5vIERUIHN1cHBvcnQ/Cj4gPiAKPiAKPiBO
byBub3QgYXQgdGhlIG1vbWVudCBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBvbiB4ODYgc3lzdGVt
LgoKQWggb2theS4gIFNob3VsZG4ndCB0aGUgS2NvbmZpZyBkZXBlbmQgb24gWDg2IHRoZW4/ICBX
aGF0IGFib3V0IEFDUEk/Cgo+ID4gPiArbW9kdWxlX2kyY19kcml2ZXIobWVuZjIxYm1jX2RyaXZl
cik7Cj4gPiA+ICsKPiA+ID4gK01PRFVMRV9ERVNDUklQVElPTigiTUVOIDE0RjAyMVAwMCBCTUMg
bWZkIGNvcmUgZHJpdmVyIik7Cj4gPiAKPiA+IHMvbWZkL01GRAo+ID4gCj4gPiA+ICtNT0RVTEVf
QVVUSE9SKCJBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJuZXJAbWVuLmRlPiIpOwo+ID4gPiAr
TU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ID4gCgotLSAKTGVlIEpvbmVzCkxpbmFybyBTVE1p
Y3JvZWxlY3Ryb25pY3MgTGFuZGluZyBUZWFtIExlYWQKTGluYXJvLm9yZyDilIIgT3BlbiBzb3Vy
Y2Ugc29mdHdhcmUgZm9yIEFSTSBTb0NzCkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRl
ciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
CmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDov
L2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw=

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27 12:00           ` Andreas Werner
@ 2014-08-27 11:29             ` Lee Jones
  -1 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 11:29 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

On Wed, 27 Aug 2014, Andreas Werner wrote:

> On Wed, Aug 27, 2014 at 12:01:42PM +0100, Lee Jones wrote:
> > On Wed, 27 Aug 2014, Andreas Werner wrote:
> > > On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> > > > On Tue, 26 Aug 2014, Andreas Werner wrote:
> > > > > The MEN 14F021P00 Board Management Controller provides an
> > > > > I2C interface to the host to access the feature implemented in the BMC.
> > > > > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > > > > and on a few Box/Display Computer.
> > > > > 
> > > > > Added MFD Core driver, supporting the I2C communication to the device.
> > > > > 
> > > > > The MFD driver currently supports the following features:
> > > > >  	- Watchdog
> > > > >  	- LEDs
> > > > > 	- Hwmon (voltage monitoring)
> > > > > 
> > > > > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > > > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > > > ---
> > > > >  drivers/mfd/Kconfig     |  12 +++++
> > > > >  drivers/mfd/Makefile    |   1 +
> > > > >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > > >  3 files changed, 145 insertions(+)
> > > > >  create mode 100644 drivers/mfd/menf21bmc.c
> > > > > 
> > > > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > > > index b8d9ca0..6a9f101 100644
> > > > > --- a/drivers/mfd/Kconfig
> > > > > +++ b/drivers/mfd/Kconfig
> > > > > @@ -453,6 +453,18 @@ config MFD_MAX8998
> > > > >  	  additional drivers must be enabled in order to use the functionality
> > > > >  	  of the device.
> > > > >  
> > > > > +config MFD_MENF21BMC
> > > > > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > > > > +	depends on I2C
> > > > > +	select MFD_CORE
> > > > > +	help
> > > > > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > > > > +	  which is a Board Management Controller connected to the I2C bus.
> > > > > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> > > > 
> > > > Nit: Whitespace error.
> > > > 
> > > 
> > > I run checkpatch but did not find any whitespace error.
> > > Where is it?
> > 
> > After 'HWMON'.
> >
> 
> Ah ok.
>  
> > > > > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > > > > +
> > > > > +static struct i2c_driver menf21bmc_driver = {
> > > > > +	.driver.name	= "menf21bmc",
> > > > > +	.id_table	= menf21bmc_id_table,
> > > > > +	.probe		= menf21bmc_probe,
> > > > > +	.remove		= menf21bmc_remove,
> > > > > +};
> > > > 
> > > > No DT support?
> > > > 
> > > 
> > > No not at the moment because it is used only on x86 system.
> > 
> > Ah okay.  Shouldn't the Kconfig depend on X86 then?  What about ACPI?
> 
> Yes and no. Could be also instantiated manually withouth DT. (e.g. i2c sysfs)
> So for me it is better to not depend on x86 to have the possibility to use
> the driver without DT on another arch.
> ACPI is no option because there are a lot boards out without
> the BMC in ACPI Table.
> 
> I think i will implement DT support if we have on board which is not x86.

Very well.

> > > > > +module_i2c_driver(menf21bmc_driver);
> > > > > +
> > > > > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> > > > 
> > > > s/mfd/MFD
> > > > 
> > > > > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > > > > +MODULE_LICENSE("GPL v2");
> > > > 
> > 

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 11:29             ` Lee Jones
  0 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 11:29 UTC (permalink / raw)
  To: Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, linux, lm-sensors, johannes.thumshirn

T24gV2VkLCAyNyBBdWcgMjAxNCwgQW5kcmVhcyBXZXJuZXIgd3JvdGU6Cgo+IE9uIFdlZCwgQXVn
IDI3LCAyMDE0IGF0IDEyOjAxOjQyUE0gKzAxMDAsIExlZSBKb25lcyB3cm90ZToKPiA+IE9uIFdl
ZCwgMjcgQXVnIDIwMTQsIEFuZHJlYXMgV2VybmVyIHdyb3RlOgo+ID4gPiBPbiBXZWQsIEF1ZyAy
NywgMjAxNCBhdCAwODoyNjozM0FNICswMTAwLCBMZWUgSm9uZXMgd3JvdGU6Cj4gPiA+ID4gT24g
VHVlLCAyNiBBdWcgMjAxNCwgQW5kcmVhcyBXZXJuZXIgd3JvdGU6Cj4gPiA+ID4gPiBUaGUgTUVO
IDE0RjAyMVAwMCBCb2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgcHJvdmlkZXMgYW4KPiA+ID4g
PiA+IEkyQyBpbnRlcmZhY2UgdG8gdGhlIGhvc3QgdG8gYWNjZXNzIHRoZSBmZWF0dXJlIGltcGxl
bWVudGVkIGluIHRoZSBCTUMuCj4gPiA+ID4gPiBUaGUgQk1DIGlzIGEgUElDIE1pY3JvbnRyb2xs
ZXIgYXNzZW1ibGVkIG9uIENQQ0kgQ2FyZCBmcm9tIE1FTiBNaWtyb2VsZWt0cm9uaWsKPiA+ID4g
PiA+IGFuZCBvbiBhIGZldyBCb3gvRGlzcGxheSBDb21wdXRlci4KPiA+ID4gPiA+IAo+ID4gPiA+
ID4gQWRkZWQgTUZEIENvcmUgZHJpdmVyLCBzdXBwb3J0aW5nIHRoZSBJMkMgY29tbXVuaWNhdGlv
biB0byB0aGUgZGV2aWNlLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBUaGUgTUZEIGRyaXZlciBjdXJy
ZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKPiA+ID4gPiA+ICAJLSBXYXRj
aGRvZwo+ID4gPiA+ID4gIAktIExFRHMKPiA+ID4gPiA+IAktIEh3bW9uICh2b2x0YWdlIG1vbml0
b3JpbmcpCj4gPiA+ID4gPiAKPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEFuZHJlYXMgV2VybmVy
IDxhbmRyZWFzLndlcm5lckBtZW4uZGU+Cj4gPiA+ID4gPiBBY2tlZC1ieTogTGVlIEpvbmVzIDxs
ZWUuam9uZXNAbGluYXJvLm9yZz4KPiA+ID4gPiA+IC0tLQo+ID4gPiA+ID4gIGRyaXZlcnMvbWZk
L0tjb25maWcgICAgIHwgIDEyICsrKysrCj4gPiA+ID4gPiAgZHJpdmVycy9tZmQvTWFrZWZpbGUg
ICAgfCAgIDEgKwo+ID4gPiA+ID4gIGRyaXZlcnMvbWZkL21lbmYyMWJtYy5jIHwgMTMyICsrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gPiA+ID4gIDMg
ZmlsZXMgY2hhbmdlZCwgMTQ1IGluc2VydGlvbnMoKykKPiA+ID4gPiA+ICBjcmVhdGUgbW9kZSAx
MDA2NDQgZHJpdmVycy9tZmQvbWVuZjIxYm1jLmMKPiA+ID4gPiA+IAo+ID4gPiA+ID4gZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCj4gPiA+ID4g
PiBpbmRleCBiOGQ5Y2EwLi42YTlmMTAxIDEwMDY0NAo+ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9t
ZmQvS2NvbmZpZwo+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+ID4gPiA+ID4g
QEAgLTQ1Myw2ICs0NTMsMTggQEAgY29uZmlnIE1GRF9NQVg4OTk4Cj4gPiA+ID4gPiAgCSAgYWRk
aXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGZ1bmN0
aW9uYWxpdHkKPiA+ID4gPiA+ICAJICBvZiB0aGUgZGV2aWNlLgo+ID4gPiA+ID4gIAo+ID4gPiA+
ID4gK2NvbmZpZyBNRkRfTUVORjIxQk1DCj4gPiA+ID4gPiArCXRyaXN0YXRlICJNRU4gMTRGMDIx
UDAwIEJvYXJkIE1hbmFnZW1lbnQgQ29udHJvbGxlciBTdXBwb3J0Igo+ID4gPiA+ID4gKwlkZXBl
bmRzIG9uIEkyQwo+ID4gPiA+ID4gKwlzZWxlY3QgTUZEX0NPUkUKPiA+ID4gPiA+ICsJaGVscAo+
ID4gPiA+ID4gKwkgIFNheSB5ZXMgaGVyZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIE1FTiAxNEYw
MjFQMDAgQk1DCj4gPiA+ID4gPiArCSAgd2hpY2ggaXMgYSBCb2FyZCBNYW5hZ2VtZW50IENvbnRy
b2xsZXIgY29ubmVjdGVkIHRvIHRoZSBJMkMgYnVzLgo+ID4gPiA+ID4gKwkgIFRoZSBkZXZpY2Ug
c3VwcG9ydHMgbXVsdGlwbGUgc3ViLWRldmljZXMgbGlrZSBMRUQsIEhXTU9OICBhbmQgV0RULgo+
ID4gPiA+IAo+ID4gPiA+IE5pdDogV2hpdGVzcGFjZSBlcnJvci4KPiA+ID4gPiAKPiA+ID4gCj4g
PiA+IEkgcnVuIGNoZWNrcGF0Y2ggYnV0IGRpZCBub3QgZmluZCBhbnkgd2hpdGVzcGFjZSBlcnJv
ci4KPiA+ID4gV2hlcmUgaXMgaXQ/Cj4gPiAKPiA+IEFmdGVyICdIV01PTicuCj4gPgo+IAo+IEFo
IG9rLgo+ICAKPiA+ID4gPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWVuZjIxYm1jX2lk
X3RhYmxlKTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICtzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIg
bWVuZjIxYm1jX2RyaXZlciA9IHsKPiA+ID4gPiA+ICsJLmRyaXZlci5uYW1lCT0gIm1lbmYyMWJt
YyIsCj4gPiA+ID4gPiArCS5pZF90YWJsZQk9IG1lbmYyMWJtY19pZF90YWJsZSwKPiA+ID4gPiA+
ICsJLnByb2JlCQk9IG1lbmYyMWJtY19wcm9iZSwKPiA+ID4gPiA+ICsJLnJlbW92ZQkJPSBtZW5m
MjFibWNfcmVtb3ZlLAo+ID4gPiA+ID4gK307Cj4gPiA+ID4gCj4gPiA+ID4gTm8gRFQgc3VwcG9y
dD8KPiA+ID4gPiAKPiA+ID4gCj4gPiA+IE5vIG5vdCBhdCB0aGUgbW9tZW50IGJlY2F1c2UgaXQg
aXMgdXNlZCBvbmx5IG9uIHg4NiBzeXN0ZW0uCj4gPiAKPiA+IEFoIG9rYXkuICBTaG91bGRuJ3Qg
dGhlIEtjb25maWcgZGVwZW5kIG9uIFg4NiB0aGVuPyAgV2hhdCBhYm91dCBBQ1BJPwo+IAo+IFll
cyBhbmQgbm8uIENvdWxkIGJlIGFsc28gaW5zdGFudGlhdGVkIG1hbnVhbGx5IHdpdGhvdXRoIERU
LiAoZS5nLiBpMmMgc3lzZnMpCj4gU28gZm9yIG1lIGl0IGlzIGJldHRlciB0byBub3QgZGVwZW5k
IG9uIHg4NiB0byBoYXZlIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UKPiB0aGUgZHJpdmVyIHdpdGhv
dXQgRFQgb24gYW5vdGhlciBhcmNoLgo+IEFDUEkgaXMgbm8gb3B0aW9uIGJlY2F1c2UgdGhlcmUg
YXJlIGEgbG90IGJvYXJkcyBvdXQgd2l0aG91dAo+IHRoZSBCTUMgaW4gQUNQSSBUYWJsZS4KPiAK
PiBJIHRoaW5rIGkgd2lsbCBpbXBsZW1lbnQgRFQgc3VwcG9ydCBpZiB3ZSBoYXZlIG9uIGJvYXJk
IHdoaWNoIGlzIG5vdCB4ODYuCgpWZXJ5IHdlbGwuCgo+ID4gPiA+ID4gK21vZHVsZV9pMmNfZHJp
dmVyKG1lbmYyMWJtY19kcml2ZXIpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gK01PRFVMRV9ERVND
UklQVElPTigiTUVOIDE0RjAyMVAwMCBCTUMgbWZkIGNvcmUgZHJpdmVyIik7Cj4gPiA+ID4gCj4g
PiA+ID4gcy9tZmQvTUZECj4gPiA+ID4gCj4gPiA+ID4gPiArTU9EVUxFX0FVVEhPUigiQW5kcmVh
cyBXZXJuZXIgPGFuZHJlYXMud2VybmVyQG1lbi5kZT4iKTsKPiA+ID4gPiA+ICtNT0RVTEVfTElD
RU5TRSgiR1BMIHYyIik7Cj4gPiA+ID4gCj4gPiAKCi0tIApMZWUgSm9uZXMKTGluYXJvIFNUTWlj
cm9lbGVjdHJvbmljcyBMYW5kaW5nIFRlYW0gTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJj
ZSBzb2Z0d2FyZSBmb3IgQVJNIFNvQ3MKRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVy
IHwgQmxvZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
bG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8v
bGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27 11:01         ` [lm-sensors] " Lee Jones
  (?)
@ 2014-08-27 12:00           ` Andreas Werner
  -1 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 12:00 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 12:01:42PM +0100, Lee Jones wrote:
> On Wed, 27 Aug 2014, Andreas Werner wrote:
> > On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> > > On Tue, 26 Aug 2014, Andreas Werner wrote:
> > > > The MEN 14F021P00 Board Management Controller provides an
> > > > I2C interface to the host to access the feature implemented in the BMC.
> > > > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > > > and on a few Box/Display Computer.
> > > > 
> > > > Added MFD Core driver, supporting the I2C communication to the device.
> > > > 
> > > > The MFD driver currently supports the following features:
> > > >  	- Watchdog
> > > >  	- LEDs
> > > > 	- Hwmon (voltage monitoring)
> > > > 
> > > > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > > ---
> > > >  drivers/mfd/Kconfig     |  12 +++++
> > > >  drivers/mfd/Makefile    |   1 +
> > > >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  3 files changed, 145 insertions(+)
> > > >  create mode 100644 drivers/mfd/menf21bmc.c
> > > > 
> > > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > > index b8d9ca0..6a9f101 100644
> > > > --- a/drivers/mfd/Kconfig
> > > > +++ b/drivers/mfd/Kconfig
> > > > @@ -453,6 +453,18 @@ config MFD_MAX8998
> > > >  	  additional drivers must be enabled in order to use the functionality
> > > >  	  of the device.
> > > >  
> > > > +config MFD_MENF21BMC
> > > > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > > > +	depends on I2C
> > > > +	select MFD_CORE
> > > > +	help
> > > > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > > > +	  which is a Board Management Controller connected to the I2C bus.
> > > > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> > > 
> > > Nit: Whitespace error.
> > > 
> > 
> > I run checkpatch but did not find any whitespace error.
> > Where is it?
> 
> After 'HWMON'.
>

Ah ok.
 
> > > > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > > > +
> > > > +static struct i2c_driver menf21bmc_driver = {
> > > > +	.driver.name	= "menf21bmc",
> > > > +	.id_table	= menf21bmc_id_table,
> > > > +	.probe		= menf21bmc_probe,
> > > > +	.remove		= menf21bmc_remove,
> > > > +};
> > > 
> > > No DT support?
> > > 
> > 
> > No not at the moment because it is used only on x86 system.
> 
> Ah okay.  Shouldn't the Kconfig depend on X86 then?  What about ACPI?

Yes and no. Could be also instantiated manually withouth DT. (e.g. i2c sysfs)
So for me it is better to not depend on x86 to have the possibility to use
the driver without DT on another arch.
ACPI is no option because there are a lot boards out without
the BMC in ACPI Table.

I think i will implement DT support if we have on board which is not x86.

> 
> > > > +module_i2c_driver(menf21bmc_driver);
> > > > +
> > > > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> > > 
> > > s/mfd/MFD
> > > 
> > > > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > > > +MODULE_LICENSE("GPL v2");
> > > 
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 12:00           ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 12:00 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

On Wed, Aug 27, 2014 at 12:01:42PM +0100, Lee Jones wrote:
> On Wed, 27 Aug 2014, Andreas Werner wrote:
> > On Wed, Aug 27, 2014 at 08:26:33AM +0100, Lee Jones wrote:
> > > On Tue, 26 Aug 2014, Andreas Werner wrote:
> > > > The MEN 14F021P00 Board Management Controller provides an
> > > > I2C interface to the host to access the feature implemented in the BMC.
> > > > The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> > > > and on a few Box/Display Computer.
> > > > 
> > > > Added MFD Core driver, supporting the I2C communication to the device.
> > > > 
> > > > The MFD driver currently supports the following features:
> > > >  	- Watchdog
> > > >  	- LEDs
> > > > 	- Hwmon (voltage monitoring)
> > > > 
> > > > Signed-off-by: Andreas Werner <andreas.werner@men.de>
> > > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > > ---
> > > >  drivers/mfd/Kconfig     |  12 +++++
> > > >  drivers/mfd/Makefile    |   1 +
> > > >  drivers/mfd/menf21bmc.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  3 files changed, 145 insertions(+)
> > > >  create mode 100644 drivers/mfd/menf21bmc.c
> > > > 
> > > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > > index b8d9ca0..6a9f101 100644
> > > > --- a/drivers/mfd/Kconfig
> > > > +++ b/drivers/mfd/Kconfig
> > > > @@ -453,6 +453,18 @@ config MFD_MAX8998
> > > >  	  additional drivers must be enabled in order to use the functionality
> > > >  	  of the device.
> > > >  
> > > > +config MFD_MENF21BMC
> > > > +	tristate "MEN 14F021P00 Board Management Controller Support"
> > > > +	depends on I2C
> > > > +	select MFD_CORE
> > > > +	help
> > > > +	  Say yes here to add support for the MEN 14F021P00 BMC
> > > > +	  which is a Board Management Controller connected to the I2C bus.
> > > > +	  The device supports multiple sub-devices like LED, HWMON  and WDT.
> > > 
> > > Nit: Whitespace error.
> > > 
> > 
> > I run checkpatch but did not find any whitespace error.
> > Where is it?
> 
> After 'HWMON'.
>

Ah ok.
 
> > > > +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> > > > +
> > > > +static struct i2c_driver menf21bmc_driver = {
> > > > +	.driver.name	= "menf21bmc",
> > > > +	.id_table	= menf21bmc_id_table,
> > > > +	.probe		= menf21bmc_probe,
> > > > +	.remove		= menf21bmc_remove,
> > > > +};
> > > 
> > > No DT support?
> > > 
> > 
> > No not at the moment because it is used only on x86 system.
> 
> Ah okay.  Shouldn't the Kconfig depend on X86 then?  What about ACPI?

Yes and no. Could be also instantiated manually withouth DT. (e.g. i2c sysfs)
So for me it is better to not depend on x86 to have the possibility to use
the driver without DT on another arch.
ACPI is no option because there are a lot boards out without
the BMC in ACPI Table.

I think i will implement DT support if we have on board which is not x86.

> 
> > > > +module_i2c_driver(menf21bmc_driver);
> > > > +
> > > > +MODULE_DESCRIPTION("MEN 14F021P00 BMC mfd core driver");
> > > 
> > > s/mfd/MFD
> > > 
> > > > +MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");
> > > > +MODULE_LICENSE("GPL v2");
> > > 
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 12:00           ` Andreas Werner
  0 siblings, 0 replies; 42+ messages in thread
From: Andreas Werner @ 2014-08-27 12:00 UTC (permalink / raw)
  To: Lee Jones
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, linux, lm-sensors,
	johannes.thumshirn

T24gV2VkLCBBdWcgMjcsIDIwMTQgYXQgMTI6MDE6NDJQTSArMDEwMCwgTGVlIEpvbmVzIHdyb3Rl
Ogo+IE9uIFdlZCwgMjcgQXVnIDIwMTQsIEFuZHJlYXMgV2VybmVyIHdyb3RlOgo+ID4gT24gV2Vk
LCBBdWcgMjcsIDIwMTQgYXQgMDg6MjY6MzNBTSArMDEwMCwgTGVlIEpvbmVzIHdyb3RlOgo+ID4g
PiBPbiBUdWUsIDI2IEF1ZyAyMDE0LCBBbmRyZWFzIFdlcm5lciB3cm90ZToKPiA+ID4gPiBUaGUg
TUVOIDE0RjAyMVAwMCBCb2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgcHJvdmlkZXMgYW4KPiA+
ID4gPiBJMkMgaW50ZXJmYWNlIHRvIHRoZSBob3N0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZSBpbXBs
ZW1lbnRlZCBpbiB0aGUgQk1DLgo+ID4gPiA+IFRoZSBCTUMgaXMgYSBQSUMgTWljcm9udHJvbGxl
ciBhc3NlbWJsZWQgb24gQ1BDSSBDYXJkIGZyb20gTUVOIE1pa3JvZWxla3Ryb25pawo+ID4gPiA+
IGFuZCBvbiBhIGZldyBCb3gvRGlzcGxheSBDb21wdXRlci4KPiA+ID4gPiAKPiA+ID4gPiBBZGRl
ZCBNRkQgQ29yZSBkcml2ZXIsIHN1cHBvcnRpbmcgdGhlIEkyQyBjb21tdW5pY2F0aW9uIHRvIHRo
ZSBkZXZpY2UuCj4gPiA+ID4gCj4gPiA+ID4gVGhlIE1GRCBkcml2ZXIgY3VycmVudGx5IHN1cHBv
cnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Cj4gPiA+ID4gIAktIFdhdGNoZG9nCj4gPiA+ID4g
IAktIExFRHMKPiA+ID4gPiAJLSBId21vbiAodm9sdGFnZSBtb25pdG9yaW5nKQo+ID4gPiA+IAo+
ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEFuZHJlYXMgV2VybmVyIDxhbmRyZWFzLndlcm5lckBtZW4u
ZGU+Cj4gPiA+ID4gQWNrZWQtYnk6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+Cj4g
PiA+ID4gLS0tCj4gPiA+ID4gIGRyaXZlcnMvbWZkL0tjb25maWcgICAgIHwgIDEyICsrKysrCj4g
PiA+ID4gIGRyaXZlcnMvbWZkL01ha2VmaWxlICAgIHwgICAxICsKPiA+ID4gPiAgZHJpdmVycy9t
ZmQvbWVuZjIxYm1jLmMgfCAxMzIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrCj4gPiA+ID4gIDMgZmlsZXMgY2hhbmdlZCwgMTQ1IGluc2VydGlvbnMoKykK
PiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWZkL21lbmYyMWJtYy5jCj4gPiA+
ID4gCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21m
ZC9LY29uZmlnCj4gPiA+ID4gaW5kZXggYjhkOWNhMC4uNmE5ZjEwMSAxMDA2NDQKPiA+ID4gPiAt
LS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCj4gPiA+ID4gKysrIGIvZHJpdmVycy9tZmQvS2NvbmZp
Zwo+ID4gPiA+IEBAIC00NTMsNiArNDUzLDE4IEBAIGNvbmZpZyBNRkRfTUFYODk5OAo+ID4gPiA+
ICAJICBhZGRpdGlvbmFsIGRyaXZlcnMgbXVzdCBiZSBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0
aGUgZnVuY3Rpb25hbGl0eQo+ID4gPiA+ICAJICBvZiB0aGUgZGV2aWNlLgo+ID4gPiA+ICAKPiA+
ID4gPiArY29uZmlnIE1GRF9NRU5GMjFCTUMKPiA+ID4gPiArCXRyaXN0YXRlICJNRU4gMTRGMDIx
UDAwIEJvYXJkIE1hbmFnZW1lbnQgQ29udHJvbGxlciBTdXBwb3J0Igo+ID4gPiA+ICsJZGVwZW5k
cyBvbiBJMkMKPiA+ID4gPiArCXNlbGVjdCBNRkRfQ09SRQo+ID4gPiA+ICsJaGVscAo+ID4gPiA+
ICsJICBTYXkgeWVzIGhlcmUgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBNRU4gMTRGMDIxUDAwIEJN
Qwo+ID4gPiA+ICsJICB3aGljaCBpcyBhIEJvYXJkIE1hbmFnZW1lbnQgQ29udHJvbGxlciBjb25u
ZWN0ZWQgdG8gdGhlIEkyQyBidXMuCj4gPiA+ID4gKwkgIFRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVs
dGlwbGUgc3ViLWRldmljZXMgbGlrZSBMRUQsIEhXTU9OICBhbmQgV0RULgo+ID4gPiAKPiA+ID4g
Tml0OiBXaGl0ZXNwYWNlIGVycm9yLgo+ID4gPiAKPiA+IAo+ID4gSSBydW4gY2hlY2twYXRjaCBi
dXQgZGlkIG5vdCBmaW5kIGFueSB3aGl0ZXNwYWNlIGVycm9yLgo+ID4gV2hlcmUgaXMgaXQ/Cj4g
Cj4gQWZ0ZXIgJ0hXTU9OJy4KPgoKQWggb2suCiAKPiA+ID4gPiArTU9EVUxFX0RFVklDRV9UQUJM
RShpMmMsIG1lbmYyMWJtY19pZF90YWJsZSk7Cj4gPiA+ID4gKwo+ID4gPiA+ICtzdGF0aWMgc3Ry
dWN0IGkyY19kcml2ZXIgbWVuZjIxYm1jX2RyaXZlciA9IHsKPiA+ID4gPiArCS5kcml2ZXIubmFt
ZQk9ICJtZW5mMjFibWMiLAo+ID4gPiA+ICsJLmlkX3RhYmxlCT0gbWVuZjIxYm1jX2lkX3RhYmxl
LAo+ID4gPiA+ICsJLnByb2JlCQk9IG1lbmYyMWJtY19wcm9iZSwKPiA+ID4gPiArCS5yZW1vdmUJ
CT0gbWVuZjIxYm1jX3JlbW92ZSwKPiA+ID4gPiArfTsKPiA+ID4gCj4gPiA+IE5vIERUIHN1cHBv
cnQ/Cj4gPiA+IAo+ID4gCj4gPiBObyBub3QgYXQgdGhlIG1vbWVudCBiZWNhdXNlIGl0IGlzIHVz
ZWQgb25seSBvbiB4ODYgc3lzdGVtLgo+IAo+IEFoIG9rYXkuICBTaG91bGRuJ3QgdGhlIEtjb25m
aWcgZGVwZW5kIG9uIFg4NiB0aGVuPyAgV2hhdCBhYm91dCBBQ1BJPwoKWWVzIGFuZCBuby4gQ291
bGQgYmUgYWxzbyBpbnN0YW50aWF0ZWQgbWFudWFsbHkgd2l0aG91dGggRFQuIChlLmcuIGkyYyBz
eXNmcykKU28gZm9yIG1lIGl0IGlzIGJldHRlciB0byBub3QgZGVwZW5kIG9uIHg4NiB0byBoYXZl
IHRoZSBwb3NzaWJpbGl0eSB0byB1c2UKdGhlIGRyaXZlciB3aXRob3V0IERUIG9uIGFub3RoZXIg
YXJjaC4KQUNQSSBpcyBubyBvcHRpb24gYmVjYXVzZSB0aGVyZSBhcmUgYSBsb3QgYm9hcmRzIG91
dCB3aXRob3V0CnRoZSBCTUMgaW4gQUNQSSBUYWJsZS4KCkkgdGhpbmsgaSB3aWxsIGltcGxlbWVu
dCBEVCBzdXBwb3J0IGlmIHdlIGhhdmUgb24gYm9hcmQgd2hpY2ggaXMgbm90IHg4Ni4KCj4gCj4g
PiA+ID4gK21vZHVsZV9pMmNfZHJpdmVyKG1lbmYyMWJtY19kcml2ZXIpOwo+ID4gPiA+ICsKPiA+
ID4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNRU4gMTRGMDIxUDAwIEJNQyBtZmQgY29yZSBkcml2
ZXIiKTsKPiA+ID4gCj4gPiA+IHMvbWZkL01GRAo+ID4gPiAKPiA+ID4gPiArTU9EVUxFX0FVVEhP
UigiQW5kcmVhcyBXZXJuZXIgPGFuZHJlYXMud2VybmVyQG1lbi5kZT4iKTsKPiA+ID4gPiArTU9E
VUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ID4gPiAKPiAKPiAtLSAKPiBMZWUgSm9uZXMKPiBMaW5h
cm8gU1RNaWNyb2VsZWN0cm9uaWNzIExhbmRpbmcgVGVhbSBMZWFkCj4gTGluYXJvLm9yZyDilIIg
T3BlbiBzb3VyY2Ugc29mdHdhcmUgZm9yIEFSTSBTb0NzCj4gRm9sbG93IExpbmFybzogRmFjZWJv
b2sgfCBUd2l0dGVyIHwgQmxvZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3Jz
Lm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5z
b3Jz

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27  7:26     ` Lee Jones
@ 2014-08-27 13:37       ` Guenter Roeck
  -1 siblings, 0 replies; 42+ messages in thread
From: Guenter Roeck @ 2014-08-27 13:37 UTC (permalink / raw)
  To: Lee Jones, Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, lm-sensors, johannes.thumshirn

On 08/27/2014 12:26 AM, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
>> The MEN 14F021P00 Board Management Controller provides an
>> I2C interface to the host to access the feature implemented in the BMC.
>> The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
>> and on a few Box/Display Computer.
>>
>> Added MFD Core driver, supporting the I2C communication to the device.
>>
>> The MFD driver currently supports the following features:
>>   	- Watchdog
>>   	- LEDs
>> 	- Hwmon (voltage monitoring)
>>

>> +	{ }
>> +};
>> +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
>> +
>> +static struct i2c_driver menf21bmc_driver = {
>> +	.driver.name	= "menf21bmc",
>> +	.id_table	= menf21bmc_id_table,
>> +	.probe		= menf21bmc_probe,
>> +	.remove		= menf21bmc_remove,
>> +};
>
> No DT support?
>
i2c devices auto-instantiate from dt entries even if there is no
explicit devicetree configuration here. The devicetree entry
would have to be something like "men,menf21bmc", ie it needs
to match the driver name.

Guenter

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 13:37       ` Guenter Roeck
  0 siblings, 0 replies; 42+ messages in thread
From: Guenter Roeck @ 2014-08-27 13:37 UTC (permalink / raw)
  To: Lee Jones, Andreas Werner
  Cc: linux-kernel, sameo, wim, linux-watchdog, cooloney, rpurdie,
	linux-leds, jdelvare, lm-sensors, johannes.thumshirn

On 08/27/2014 12:26 AM, Lee Jones wrote:
> On Tue, 26 Aug 2014, Andreas Werner wrote:
>> The MEN 14F021P00 Board Management Controller provides an
>> I2C interface to the host to access the feature implemented in the BMC.
>> The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
>> and on a few Box/Display Computer.
>>
>> Added MFD Core driver, supporting the I2C communication to the device.
>>
>> The MFD driver currently supports the following features:
>>   	- Watchdog
>>   	- LEDs
>> 	- Hwmon (voltage monitoring)
>>

>> +	{ }
>> +};
>> +MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
>> +
>> +static struct i2c_driver menf21bmc_driver = {
>> +	.driver.name	= "menf21bmc",
>> +	.id_table	= menf21bmc_id_table,
>> +	.probe		= menf21bmc_probe,
>> +	.remove		= menf21bmc_remove,
>> +};
>
> No DT support?
>
i2c devices auto-instantiate from dt entries even if there is no
explicit devicetree configuration here. The devicetree entry
would have to be something like "men,menf21bmc", ie it needs
to match the driver name.

Guenter


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

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

* Re: [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
  2014-08-27 13:37       ` [lm-sensors] " Guenter Roeck
@ 2014-08-27 13:46         ` Lee Jones
  -1 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 13:46 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, lm-sensors,
	johannes.thumshirn

On Wed, 27 Aug 2014, Guenter Roeck wrote:
> On 08/27/2014 12:26 AM, Lee Jones wrote:
> >On Tue, 26 Aug 2014, Andreas Werner wrote:
> >>The MEN 14F021P00 Board Management Controller provides an
> >>I2C interface to the host to access the feature implemented in the BMC.
> >>The BMC is a PIC Microntroller assembled on CPCI Card from MEN Mikroelektronik
> >>and on a few Box/Display Computer.
> >>
> >>Added MFD Core driver, supporting the I2C communication to the device.
> >>
> >>The MFD driver currently supports the following features:
> >>  	- Watchdog
> >>  	- LEDs
> >>	- Hwmon (voltage monitoring)
> >>
> 
> >>+	{ }
> >>+};
> >>+MODULE_DEVICE_TABLE(i2c, menf21bmc_id_table);
> >>+
> >>+static struct i2c_driver menf21bmc_driver = {
> >>+	.driver.name	= "menf21bmc",
> >>+	.id_table	= menf21bmc_id_table,
> >>+	.probe		= menf21bmc_probe,
> >>+	.remove		= menf21bmc_remove,
> >>+};
> >
> >No DT support?
> >
> i2c devices auto-instantiate from dt entries even if there is no
> explicit devicetree configuration here. The devicetree entry
> would have to be something like "men,menf21bmc", ie it needs
> to match the driver name.

https://patchwork.ozlabs.org/patch/362180/

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [lm-sensors] [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver
@ 2014-08-27 13:46         ` Lee Jones
  0 siblings, 0 replies; 42+ messages in thread
From: Lee Jones @ 2014-08-27 13:46 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Andreas Werner, linux-kernel, sameo, wim, linux-watchdog,
	cooloney, rpurdie, linux-leds, jdelvare, lm-sensors,
	johannes.thumshirn

T24gV2VkLCAyNyBBdWcgMjAxNCwgR3VlbnRlciBSb2VjayB3cm90ZToKPiBPbiAwOC8yNy8yMDE0
IDEyOjI2IEFNLCBMZWUgSm9uZXMgd3JvdGU6Cj4gPk9uIFR1ZSwgMjYgQXVnIDIwMTQsIEFuZHJl
YXMgV2VybmVyIHdyb3RlOgo+ID4+VGhlIE1FTiAxNEYwMjFQMDAgQm9hcmQgTWFuYWdlbWVudCBD
b250cm9sbGVyIHByb3ZpZGVzIGFuCj4gPj5JMkMgaW50ZXJmYWNlIHRvIHRoZSBob3N0IHRvIGFj
Y2VzcyB0aGUgZmVhdHVyZSBpbXBsZW1lbnRlZCBpbiB0aGUgQk1DLgo+ID4+VGhlIEJNQyBpcyBh
IFBJQyBNaWNyb250cm9sbGVyIGFzc2VtYmxlZCBvbiBDUENJIENhcmQgZnJvbSBNRU4gTWlrcm9l
bGVrdHJvbmlrCj4gPj5hbmQgb24gYSBmZXcgQm94L0Rpc3BsYXkgQ29tcHV0ZXIuCj4gPj4KPiA+
PkFkZGVkIE1GRCBDb3JlIGRyaXZlciwgc3VwcG9ydGluZyB0aGUgSTJDIGNvbW11bmljYXRpb24g
dG8gdGhlIGRldmljZS4KPiA+Pgo+ID4+VGhlIE1GRCBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRz
IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Cj4gPj4gIAktIFdhdGNoZG9nCj4gPj4gIAktIExFRHMK
PiA+PgktIEh3bW9uICh2b2x0YWdlIG1vbml0b3JpbmcpCj4gPj4KPiAKPiA+PisJeyB9Cj4gPj4r
fTsKPiA+PitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWVuZjIxYm1jX2lkX3RhYmxlKTsKPiA+
PisKPiA+PitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWVuZjIxYm1jX2RyaXZlciA9IHsKPiA+
PisJLmRyaXZlci5uYW1lCT0gIm1lbmYyMWJtYyIsCj4gPj4rCS5pZF90YWJsZQk9IG1lbmYyMWJt
Y19pZF90YWJsZSwKPiA+PisJLnByb2JlCQk9IG1lbmYyMWJtY19wcm9iZSwKPiA+PisJLnJlbW92
ZQkJPSBtZW5mMjFibWNfcmVtb3ZlLAo+ID4+K307Cj4gPgo+ID5ObyBEVCBzdXBwb3J0Pwo+ID4K
PiBpMmMgZGV2aWNlcyBhdXRvLWluc3RhbnRpYXRlIGZyb20gZHQgZW50cmllcyBldmVuIGlmIHRo
ZXJlIGlzIG5vCj4gZXhwbGljaXQgZGV2aWNldHJlZSBjb25maWd1cmF0aW9uIGhlcmUuIFRoZSBk
ZXZpY2V0cmVlIGVudHJ5Cj4gd291bGQgaGF2ZSB0byBiZSBzb21ldGhpbmcgbGlrZSAibWVuLG1l
bmYyMWJtYyIsIGllIGl0IG5lZWRzCj4gdG8gbWF0Y2ggdGhlIGRyaXZlciBuYW1lLgoKaHR0cHM6
Ly9wYXRjaHdvcmsub3psYWJzLm9yZy9wYXRjaC8zNjIxODAvCgotLSAKTGVlIEpvbmVzCkxpbmFy
byBTVE1pY3JvZWxlY3Ryb25pY3MgTGFuZGluZyBUZWFtIExlYWQKTGluYXJvLm9yZyDilIIgT3Bl
biBzb3VyY2Ugc29mdHdhcmUgZm9yIEFSTSBTb0NzCkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwg
VHdpdHRlciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcK
aHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw=

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

end of thread, other threads:[~2014-08-27 13:46 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-26 17:45 [PATCH v5 0/4] Introduce MEN 14F021P00 BMC driver series Andreas Werner
2014-08-26 17:45 ` [lm-sensors] " Andreas Werner
2014-08-26 17:45 ` Andreas Werner
2014-08-26 17:45 ` [PATCH v5 1/4] drivers/mfd/menf21bmc: introduce MEN 14F021P00 BMC MFD Core driver Andreas Werner
2014-08-26 17:45   ` [lm-sensors] " Andreas Werner
2014-08-26 17:45   ` Andreas Werner
2014-08-27  7:26   ` Lee Jones
2014-08-27  7:26     ` [lm-sensors] " Lee Jones
2014-08-27  7:26     ` Lee Jones
2014-08-27 10:36     ` Andreas Werner
2014-08-27 10:36       ` [lm-sensors] " Andreas Werner
2014-08-27 10:36       ` Andreas Werner
2014-08-27 10:36       ` Andreas Werner
2014-08-27 10:52     ` Andreas Werner
2014-08-27 10:52       ` [lm-sensors] " Andreas Werner
2014-08-27 10:52       ` Andreas Werner
2014-08-27 10:52       ` Andreas Werner
2014-08-27 11:01       ` Lee Jones
2014-08-27 11:01         ` [lm-sensors] " Lee Jones
2014-08-27 12:00         ` Andreas Werner
2014-08-27 12:00           ` [lm-sensors] " Andreas Werner
2014-08-27 12:00           ` Andreas Werner
2014-08-27 11:29           ` Lee Jones
2014-08-27 11:29             ` [lm-sensors] " Lee Jones
2014-08-27 13:37     ` Guenter Roeck
2014-08-27 13:37       ` [lm-sensors] " Guenter Roeck
2014-08-27 13:46       ` Lee Jones
2014-08-27 13:46         ` [lm-sensors] " Lee Jones
2014-08-26 17:46 ` [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog driver Andreas Werner
2014-08-26 17:46   ` [lm-sensors] [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog dri Andreas Werner
2014-08-26 17:46   ` [PATCH v5 2/4] drivers/watchdog/menf21bmc_wdt: introduce MEN 14F021P00 BMC Watchdog driver Andreas Werner
2014-08-26 17:46 ` [PATCH v5 3/4] drivers/leds/leds-menf21bmc: introduce MEN 14F021P00 BMC LED driver Andreas Werner
2014-08-26 17:46   ` [lm-sensors] " Andreas Werner
2014-08-26 17:46   ` Andreas Werner
2014-08-26 17:46 ` [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver Andreas Werner
2014-08-26 17:46   ` [lm-sensors] " Andreas Werner
2014-08-26 17:46   ` Andreas Werner
2014-08-26 17:15   ` Guenter Roeck
2014-08-26 17:15     ` [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driv Guenter Roeck
2014-08-27  7:58     ` [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver Andreas Werner
2014-08-27  7:58       ` [lm-sensors] [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driv Andreas Werner
2014-08-27  7:58       ` [PATCH v5 4/4] drivers/hwmon/menf21bmc_hwmon: introduce MEN14F021P00 BMC HWMON driver Andreas Werner

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