All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
  2014-03-23 20:37 ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Lee Jones, Samuel Ortiz
  Cc: David Dajun Chen, Guenter Roeck, Jean Delvare, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Dependencies required for DA9063 HWMON support.

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 core.h                    total: 0 errors, 0 warnings, 100 lines checked
 pdata.h                   total: 0 errors, 0 warnings, 129 lines checked
 da9063-core.c             total: 0 errors, 0 warnings, 199 lines checked

This patch includes the following changes:

There are small changes to da9063-core.c to allow reading the temperature
trimming offset value from the PMIC register list. This value is passed
to HWMON and is used during its calculations of the PMIC's internal junction
temperature.

There are also changes to the platform data definitions so that values may
be set for the current sources ADCIN[123]_CUR. These are provided so that
they may be configured outside the driver.

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 drivers/mfd/da9063-core.c        |   13 ++++++++++++-
 include/linux/mfd/da9063/core.h  |    3 +++
 include/linux/mfd/da9063/pdata.h |   18 ++++++++++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
index e70ae31..24c1838 100644
--- a/drivers/mfd/da9063-core.c
+++ b/drivers/mfd/da9063-core.c
@@ -111,6 +111,7 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
 {
 	struct da9063_pdata *pdata = da9063->dev->platform_data;
 	int model, variant_id, variant_code;
+	int t_offset = 0;
 	int ret;
 
 	if (pdata) {
@@ -171,8 +172,18 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
 	ret = mfd_add_devices(da9063->dev, -1, da9063_devs,
 			      ARRAY_SIZE(da9063_devs), NULL, da9063->irq_base,
 			      NULL);
-	if (ret)
+	if (ret) {
 		dev_err(da9063->dev, "Cannot add MFD cells\n");
+		return ret;
+	}
+
+	ret = regmap_read(da9063->regmap, DA9063_REG_T_OFFSET, &t_offset);
+	if (ret < 0)
+		dev_warn(da9063->dev,
+			 "Temperature trimming value cannot be read (defaulting to 0)\n");
+
+	/* pass this on to the hwmon driver */
+	da9063->t_offset = t_offset;
 
 	return ret;
 }
diff --git a/include/linux/mfd/da9063/core.h b/include/linux/mfd/da9063/core.h
index 00a9aac..7327d37 100644
--- a/include/linux/mfd/da9063/core.h
+++ b/include/linux/mfd/da9063/core.h
@@ -86,6 +86,9 @@ struct da9063 {
 	int		chip_irq;
 	unsigned int	irq_base;
 	struct regmap_irq_chip_data *regmap_irq;
+
+	/* Trimming */
+	int		t_offset;
 };
 
 int da9063_device_init(struct da9063 *da9063, unsigned int irq);
diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
index 95c8742..576033e 100644
--- a/include/linux/mfd/da9063/pdata.h
+++ b/include/linux/mfd/da9063/pdata.h
@@ -62,6 +62,23 @@ struct da9063_regulators_pdata {
 	struct da9063_regulator_data	*regulator_data;
 };
 
+/* HWMON platform data */
+#define DA9063_SET_ADCIN1_CUR_1UA	0x00
+#define DA9063_SET_ADCIN1_CUR_2UA	0x01
+#define DA9063_SET_ADCIN1_CUR_10UA	0x02
+#define DA9063_SET_ADCIN1_CUR_40UA	0x03
+#define DA9063_SET_ADCIN2_CUR_1UA	0x00
+#define DA9063_SET_ADCIN2_CUR_2UA	0x01
+#define DA9063_SET_ADCIN2_CUR_10UA	0x02
+#define DA9063_SET_ADCIN2_CUR_40UA	0x03
+#define DA9063_SET_ADCIN3_CUR_10UA	0x00
+
+struct da9063_hwmon_pdata {
+	unsigned char adcin1_cur;
+	unsigned char adcin2_cur;
+	unsigned char adcin3_cur;
+};
+
 
 /*
  * RGB LED configuration
@@ -106,6 +123,7 @@ struct da9063_pdata {
 	unsigned			flags;
 	struct da9063_regulators_pdata	*regulators_pdata;
 	struct led_platform_data	*leds_pdata;
+	struct da9063_hwmon_pdata	*hwmon_pdata;
 };
 
 #endif	/* __MFD_DA9063_PDATA_H__ */
-- 
end-of-patch for RFC V1


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

* [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-23 20:37 ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Add the HWMON driver for DA9063

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
 Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
 Makefile                  total: 0 errors, 0 warnings, 154 lines checked
 registers.h               total: 0 errors, 0 warnings, 1066 lines checked
There are errors and warning in Kconfig, however they are not caused
by this patch.

This is the hardware monitor driver component for DA9063 PMIC.

The manual measurement allows monitoring of the system voltage
VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
measures of the backup battery voltage and a Tjunc value for the
internal junction temperature sensor.

This patch also includes the necessary register changes, especially
the definitions for ADC_CFG (addr=0xC9) to allow settings for the
current sources.

Dependencies:

The patch in this set titled:  "mfd: da9063: Add HWMON dependencies"
- The da9063-core.c changes allows for reading the temperature trimming
  offset value from the PMIC. This used by HWMON in its calculation of
  the internal junction temperature.
- Changes to platform data definitions so that ADCIN[123]_CUR values
  may be set from outside the driver.

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 drivers/hwmon/Kconfig                |   10 +
 drivers/hwmon/Makefile               |    1 +
 drivers/hwmon/da9063-hwmon.c         |  456 ++++++++++++++++++++++++++++++++++
 include/linux/mfd/da9063/registers.h |   34 +++
 4 files changed, 501 insertions(+)
 create mode 100644 drivers/hwmon/da9063-hwmon.c

diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index f288b60..68aa886 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -391,6 +391,16 @@ config SENSORS_DA9055
 	  This driver can also be built as a module.  If so, the module
 	  will be called da9055-hwmon.
 
+config SENSORS_DA9063
+	tristate "Dialog Semiconductor DA9063"
+	depends on MFD_DA9063
+	help
+	  If you say yes here you get support for the hardware
+	  monitoring features of the DA9063 Power Management IC.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called da9063-hwmon.
+
 config SENSORS_I5K_AMB
 	tristate "FB-DIMM AMB temperature sensor on Intel 5000 series chipsets"
 	depends on PCI
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index c48f987..4174b07 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1)	+= atxp1.o
 obj-$(CONFIG_SENSORS_CORETEMP)	+= coretemp.o
 obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o
 obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
+obj-$(CONFIG_SENSORS_DA9063)	+= da9063-hwmon.o
 obj-$(CONFIG_SENSORS_DME1737)	+= dme1737.o
 obj-$(CONFIG_SENSORS_DS620)	+= ds620.o
 obj-$(CONFIG_SENSORS_DS1621)	+= ds1621.o
diff --git a/drivers/hwmon/da9063-hwmon.c b/drivers/hwmon/da9063-hwmon.c
new file mode 100644
index 0000000..7756cb2
--- /dev/null
+++ b/drivers/hwmon/da9063-hwmon.c
@@ -0,0 +1,456 @@
+/* da9063-hwmon.c - Hardware monitor support for DA9063
+ * Copyright (C) 2014 Dialog Semiconductor Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/regmap.h>
+#include <linux/mfd/da9063/core.h>
+#include <linux/mfd/da9063/pdata.h>
+
+#define DA9063_ADC_RES	(1 << (DA9063_ADC_RES_L_BITS + DA9063_ADC_RES_M_BITS))
+#define DA9063_ADC_MAX	(DA9063_ADC_RES - 1)
+#define DA9063_2V5	2500
+#define DA9063_5V0	5000
+#define DA9063_5V5	5500
+#define DA9063_TJUNC_M	-420
+#define DA9063_TJUNC_C	-812
+#define DA9063_VBBAT_M	2048
+
+enum da9063_adc {
+	DA9063_CHAN_VSYS = DA9063_ADC_MUX_VSYS,
+	DA9063_CHAN_ADCIN1 = DA9063_ADC_MUX_ADCIN1,
+	DA9063_CHAN_ADCIN2 = DA9063_ADC_MUX_ADCIN2,
+	DA9063_CHAN_ADCIN3 = DA9063_ADC_MUX_ADCIN3,
+	DA9063_CHAN_TJUNC = DA9063_ADC_MUX_T_SENSE,
+	DA9063_CHAN_VBBAT = DA9063_ADC_MUX_VBBAT,
+	DA9063_CHAN_LDO_G1 = DA9063_ADC_MUX_LDO_G1,
+	DA9063_CHAN_LDO_G2 = DA9063_ADC_MUX_LDO_G2,
+	DA9063_CHAN_LDO_G3 = DA9063_ADC_MUX_LDO_G3
+};
+
+struct da9063_hwmon {
+	struct da9063 *da9063;
+	struct device *classdev;
+	struct mutex hwmon_mutex;
+	struct completion adc_ready;
+	signed char tjunc_offset;
+	int irq;
+};
+
+static int da9063_adc_convert(struct da9063_hwmon *hwmon, int channel,
+			      int *value)
+{
+	int val = *value;
+	int ret = 0;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+	case DA9063_CHAN_ADCIN2:
+	case DA9063_CHAN_ADCIN3:
+		val = (DA9063_2V5 * val) / DA9063_ADC_MAX;
+		break;
+	case DA9063_CHAN_VSYS:
+		val = ((DA9063_5V5 - DA9063_2V5) * val) / DA9063_ADC_MAX +
+			DA9063_2V5;
+		break;
+	case DA9063_CHAN_TJUNC:
+		val -= hwmon->tjunc_offset;
+		val = (DA9063_TJUNC_M * (val + DA9063_TJUNC_C)) >> 10;
+		break;
+	case DA9063_CHAN_VBBAT:
+		val = (DA9063_5V0 * val) / DA9063_ADC_MAX;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err_convert;
+	}
+
+	*value = val;
+err_convert:
+	return ret;
+}
+
+static int da9063_adc_current_switch(struct da9063_hwmon *hwmon, int channel,
+				     bool on)
+{
+	int ret;
+	unsigned int val;
+	unsigned int mask;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+		mask = DA9063_ADC_AD1_ISRC_EN;
+		break;
+	case DA9063_CHAN_ADCIN2:
+		mask = DA9063_ADC_AD2_ISRC_EN;
+		break;
+	case DA9063_CHAN_ADCIN3:
+		mask = DA9063_ADC_AD3_ISRC_EN;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err_switch;
+	}
+
+	if (on)
+		val = mask;
+	else
+		val = ~mask;
+
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CONT,
+				 mask, val);
+err_switch:
+	return ret;
+
+}
+
+static int da9063_adc_manual_read(struct da9063_hwmon *hwmon, int channel)
+{
+	int ret;
+	unsigned char val;
+	unsigned char data[2];
+	int adc_man;
+
+	mutex_lock(&hwmon->hwmon_mutex);
+
+	init_completion(&hwmon->adc_ready);
+
+	val = (channel & DA9063_ADC_MUX_MASK) | DA9063_ADC_MAN;
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_MAN,
+				 DA9063_ADC_MUX_MASK | DA9063_ADC_MAN, val);
+	if (ret < 0)
+		goto err_mread;
+
+	ret = wait_for_completion_timeout(&hwmon->adc_ready,
+					  msecs_to_jiffies(1000));
+	if (ret == 0) {
+		ret = -ETIMEDOUT;
+		goto err_mread;
+	}
+
+	ret = regmap_read(hwmon->da9063->regmap, DA9063_REG_ADC_MAN, &adc_man);
+	if (ret < 0)
+		goto err_mread;
+
+	/* data value is not ready */
+	if (adc_man & DA9063_ADC_MAN == 0) {
+		ret = -EINVAL;
+		goto err_mread;
+	}
+
+	ret = regmap_bulk_read(hwmon->da9063->regmap,
+			       DA9063_REG_ADC_RES_L, data, 2);
+	if (ret < 0)
+		goto err_mread;
+
+	ret = (data[0] & DA9063_ADC_RES_L_MASK) >> DA9063_ADC_RES_L_SHIFT;
+	ret |= data[1] << DA9063_ADC_RES_L_BITS;
+err_mread:
+	mutex_unlock(&hwmon->hwmon_mutex);
+	return ret;
+}
+
+static irqreturn_t da9063_hwmon_irq_handler(int irq, void *irq_data)
+{
+	struct da9063_hwmon *hwmon = irq_data;
+	complete(&hwmon->adc_ready);
+	return IRQ_HANDLED;
+}
+
+static ssize_t da9063_adc_read(struct device *dev,
+			       struct device_attribute *devattr, char *buf)
+{
+	struct da9063_hwmon *hwmon = dev_get_drvdata(dev);
+	int channel = to_sensor_dev_attr(devattr)->index;
+	int val;
+	int ret;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+	case DA9063_CHAN_ADCIN2:
+	case DA9063_CHAN_ADCIN3:
+		/* fallthrough for ADC measures */
+		ret = da9063_adc_current_switch(hwmon, channel, true);
+		if (ret < 0)
+			goto err_read;
+
+		val = da9063_adc_manual_read(hwmon, channel);
+		if (val < 0) {
+			ret = val;
+			if (ret == -EINVAL)
+				dev_err(dev, "Conversion was not completed\n");
+			else
+				dev_err(dev, "ADC read error %d\n", ret);
+			goto err_read;
+		}
+
+		ret = da9063_adc_current_switch(hwmon, channel, false);
+		if (ret < 0) {
+			dev_err(dev, "Could not switch current\n");
+			goto err_read;
+		}
+		break;
+
+	case DA9063_CHAN_VSYS:
+	case DA9063_CHAN_TJUNC:
+	case DA9063_CHAN_VBBAT:
+		/* fallthrough for internal measures */
+		val = da9063_adc_manual_read(hwmon, channel);
+		if (val < 0) {
+			dev_err(dev, "ADC read error %d\n", val);
+			return val;
+		}
+		break;
+
+	default:
+		/* error case */
+		ret = -EINVAL;
+		goto err_read;
+	}
+
+	ret = da9063_adc_convert(hwmon, channel, &val);
+	if (ret < 0) {
+		dev_err(dev, "Failed to convert ADC value %d\n", ret);
+		goto err_read;
+	}
+
+	return sprintf(buf, "%d\n", val);
+err_read:
+	return ret;
+}
+
+static ssize_t da9063_show_name(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	return sprintf(buf, DA9063_DRVNAME_HWMON "\n");
+}
+
+static ssize_t da9063_show_label(struct device *dev,
+				 struct device_attribute *devattr, char *buf)
+{
+	int channel = to_sensor_dev_attr(devattr)->index;
+	char *label;
+
+	switch (channel) {
+	case DA9063_CHAN_VSYS:
+		label = "VSYS";
+		break;
+	case DA9063_CHAN_ADCIN1:
+		label = "ADCIN1";
+		break;
+	case DA9063_CHAN_ADCIN2:
+		label = "ADCIN2";
+		break;
+	case DA9063_CHAN_ADCIN3:
+		label = "ADCIN3";
+		break;
+	case DA9063_CHAN_TJUNC:
+		label = "TJUNC";
+		break;
+	case DA9063_CHAN_VBBAT:
+		label = "VBBAT";
+		break;
+	default:
+		label = "UNKNOWN";
+	}
+
+	return sprintf(buf, "%s\n", label);
+}
+
+static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_VSYS);
+static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_VSYS);
+
+static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN1);
+static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN1);
+
+static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN2);
+static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN2);
+
+static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN3);
+static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN3);
+
+static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_VBBAT);
+static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_VBBAT);
+
+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_TJUNC);
+
+static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_TJUNC);
+
+static DEVICE_ATTR(name, S_IRUGO, da9063_show_name, NULL);
+
+static struct attribute *da9063_attributes[] = {
+	&dev_attr_name.attr,
+	&sensor_dev_attr_in0_input.dev_attr.attr,
+	&sensor_dev_attr_in0_label.dev_attr.attr,
+	&sensor_dev_attr_in1_input.dev_attr.attr,
+	&sensor_dev_attr_in1_label.dev_attr.attr,
+	&sensor_dev_attr_in2_input.dev_attr.attr,
+	&sensor_dev_attr_in2_label.dev_attr.attr,
+	&sensor_dev_attr_in3_input.dev_attr.attr,
+	&sensor_dev_attr_in3_label.dev_attr.attr,
+	&sensor_dev_attr_in4_input.dev_attr.attr,
+	&sensor_dev_attr_in4_label.dev_attr.attr,
+	&sensor_dev_attr_temp1_input.dev_attr.attr,
+	&sensor_dev_attr_temp1_label.dev_attr.attr,
+	NULL
+};
+
+static const struct attribute_group da9063_attr_group = {
+	.attrs = da9063_attributes,
+};
+
+static int da9063_hwmon_probe(struct platform_device *pdev)
+{
+	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
+	struct da9063_pdata *pdata = da9063->dev->platform_data;
+	struct da9063_hwmon *hwmon;
+	int ret;
+	unsigned int val;
+
+	hwmon = devm_kzalloc(&pdev->dev, sizeof(struct da9063_hwmon),
+			     GFP_KERNEL);
+	if (!hwmon)
+		return -ENOMEM;
+
+	mutex_init(&hwmon->hwmon_mutex);
+	init_completion(&hwmon->adc_ready);
+	hwmon->da9063 = da9063;
+
+	/* enable the ADC functions for GPIO 0,1,2 */
+	val = (DA9063_GPIO0_PIN_ADCIN1 << DA9063_GPIO0_PIN_MASK_SHIFT |
+	       DA9063_GPIO1_PIN_ADCIN2_COMP << DA9063_GPIO1_PIN_MASK_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_0_1,
+				 (DA9063_GPIO0_PIN_MASK |
+				  DA9063_GPIO1_PIN_MASK), val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADCIN 1,2 bits for the GPIO 0,1 register\n");
+		return -EIO;
+	}
+
+	val = DA9063_GPIO2_PIN_ADCIN3 << DA9063_GPIO2_PIN_MASK_SHIFT;
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_2_3,
+				 DA9063_GPIO2_PIN_MASK, val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADCIN 3 bits for the GPIO 2,3 register\n");
+		return -EIO;
+	}
+
+	/* debounce ADC I settings */
+	val = (DA9063_ADCIN1_DEB_ON << DA9063_REG_ADCIN1_DEB_SHIFT |
+	       DA9063_ADCIN2_DEB_ON << DA9063_REG_ADCIN2_DEB_SHIFT |
+	       DA9063_ADCIN3_DEB_ON << DA9063_REG_ADCIN3_DEB_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
+				 (DA9063_REG_ADCIN1_DEB_MASK |
+				  DA9063_REG_ADCIN2_DEB_MASK |
+				  DA9063_REG_ADCIN3_DEB_MASK), val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADC configuration register\n");
+		return -EIO;
+	}
+
+	/* set up the current configurations */
+	val = (pdata->hwmon_pdata->adcin1_cur << DA9063_REG_ADCIN1_CUR_SHIFT |
+	       pdata->hwmon_pdata->adcin2_cur << DA9063_REG_ADCIN2_CUR_SHIFT |
+	       pdata->hwmon_pdata->adcin3_cur << DA9063_REG_ADCIN3_CUR_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
+				 (DA9063_REG_ADCIN1_CUR_MASK |
+				  DA9063_REG_ADCIN2_CUR_MASK |
+				  DA9063_REG_ADCIN3_CUR_MASK), val);
+
+	ret = regmap_read(da9063->regmap, DA9063_REG_ADC_CFG, &val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to read read the ADC configuration register\n");
+		return -EIO;
+	}
+
+	hwmon->irq = platform_get_irq_byname(pdev, DA9063_DRVNAME_HWMON);
+	if (hwmon->irq < 0)
+		return hwmon->irq;
+
+	ret = devm_request_threaded_irq(&pdev->dev, hwmon->irq, NULL,
+					da9063_hwmon_irq_handler,
+					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+					"HWMON", hwmon);
+	if (ret) {
+		dev_err(&pdev->dev, "Failed to request IRQ.\n");
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, hwmon);
+
+	/* set trim temperature offset to value read at startup */
+	hwmon->tjunc_offset = (signed char)hwmon->da9063->t_offset;
+
+	ret = sysfs_create_group(&pdev->dev.kobj, &da9063_attr_group);
+	if (ret)
+		return ret;
+
+	hwmon->classdev = hwmon_device_register(&pdev->dev);
+	if (IS_ERR(hwmon->classdev)) {
+		sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
+		return PTR_ERR(hwmon->classdev);
+	}
+
+	return 0;
+}
+
+static int da9063_hwmon_remove(struct platform_device *pdev)
+{
+	struct da9063_hwmon *hwmon = platform_get_drvdata(pdev);
+
+	hwmon_device_unregister(hwmon->classdev);
+	sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
+
+	return 0;
+}
+
+static struct platform_driver da9063_hwmon_driver = {
+	.probe = da9063_hwmon_probe,
+	.remove = da9063_hwmon_remove,
+	.driver = {
+		   .name = DA9063_DRVNAME_HWMON,
+		   .owner = THIS_MODULE,
+		   },
+};
+
+module_platform_driver(da9063_hwmon_driver);
+
+MODULE_DESCRIPTION("Hardware monitor support device driver for Dialog DA9063");
+MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DA9063_DRVNAME_HWMON);
diff --git a/include/linux/mfd/da9063/registers.h b/include/linux/mfd/da9063/registers.h
index 09a85c6..922371b 100644
--- a/include/linux/mfd/da9063/registers.h
+++ b/include/linux/mfd/da9063/registers.h
@@ -474,6 +474,7 @@
 
 /* DA9063_REG_GPIO_0_1 (addr=0x15) */
 #define	DA9063_GPIO0_PIN_MASK			0x03
+#define	DA9063_GPIO0_PIN_MASK_SHIFT		0
 #define		DA9063_GPIO0_PIN_ADCIN1		0x00
 #define		DA9063_GPIO0_PIN_GPI		0x01
 #define		DA9063_GPIO0_PIN_GPO_OD		0x02
@@ -485,6 +486,7 @@
 #define		DA9063_GPIO0_TYPE_GPO_VDD_IO2	0x04
 #define	DA9063_GPIO0_NO_WAKEUP			0x08
 #define	DA9063_GPIO1_PIN_MASK			0x30
+#define	DA9063_GPIO1_PIN_MASK_SHIFT		4
 #define		DA9063_GPIO1_PIN_ADCIN2_COMP	0x00
 #define		DA9063_GPIO1_PIN_GPI		0x10
 #define		DA9063_GPIO1_PIN_GPO_OD		0x20
@@ -498,6 +500,7 @@
 
 /* DA9063_REG_GPIO_2_3 (addr=0x16) */
 #define	DA9063_GPIO2_PIN_MASK			0x03
+#define	DA9063_GPIO2_PIN_MASK_SHIFT		0
 #define		DA9063_GPIO2_PIN_ADCIN3		0x00
 #define		DA9063_GPIO2_PIN_GPI		0x01
 #define		DA9063_GPIO2_PIN_GPO_PSS	0x02
@@ -813,6 +816,7 @@
 #define	DA9063_VSYS_VAL_BASE			0x00
 
 /* DA9063_REG_ADC_RES_L (addr=0x37) */
+#define	DA9063_ADC_RES_L_SHIFT			6
 #define	DA9063_ADC_RES_L_BITS			2
 #define	DA9063_ADC_RES_L_MASK			0xC0
 
@@ -979,6 +983,36 @@
 #define DA9063_GPIO_DIM				0x80
 #define DA9063_GPIO_PWM_MASK			0x7F
 
+/* DA9063_REG_ADC_CFG (addr=0xC9) */
+#define DA9063_REG_ADCIN1_CUR_MASK		0x03
+#define DA9063_REG_ADCIN1_CUR_SHIFT		0
+#define		DA9063_ADCIN1_CUR_1UA		0x00
+#define		DA9063_ADCIN1_CUR_2UA		0x01
+#define		DA9063_ADCIN1_CUR_10UA		0x02
+#define		DA9063_ADCIN1_CUR_40UA		0x03
+#define DA9063_REG_ADCIN2_CUR_MASK		0x0C
+#define DA9063_REG_ADCIN2_CUR_SHIFT		2
+#define		DA9063_ADCIN2_CUR_1UA		0x00
+#define		DA9063_ADCIN2_CUR_2UA		0x01
+#define		DA9063_ADCIN2_CUR_10UA		0x02
+#define		DA9063_ADCIN2_CUR_40UA		0x03
+#define DA9063_REG_ADCIN3_CUR_MASK		0x10
+#define DA9063_REG_ADCIN3_CUR_SHIFT		4
+#define		DA9063_ADCIN3_CUR_10UA		0x00
+#define		DA9063_ADCIN3_CUR_40UA		0x01
+#define DA9063_REG_ADCIN1_DEB_MASK		0x20
+#define DA9063_REG_ADCIN1_DEB_SHIFT		5
+#define		DA9063_ADCIN1_DEB_OFF		0x00
+#define		DA9063_ADCIN1_DEB_ON		0x01
+#define DA9063_REG_ADCIN2_DEB_MASK		0x40
+#define DA9063_REG_ADCIN2_DEB_SHIFT		6
+#define		DA9063_ADCIN2_DEB_OFF		0x00
+#define		DA9063_ADCIN2_DEB_ON		0x01
+#define DA9063_REG_ADCIN3_DEB_MASK		0x80
+#define DA9063_REG_ADCIN3_DEB_SHIFT		7
+#define		DA9063_ADCIN3_DEB_OFF		0x00
+#define		DA9063_ADCIN3_DEB_ON		0x01
+
 /* DA9063_REG_CONFIG_H (addr=0x10D) */
 #define DA9063_PWM_CLK_MASK			0x01
 #define		DA9063_PWM_CLK_PWM2MHZ		0x00
-- 
end-of-patch for RFC V1


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

* [lm-sensors] [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Lee Jones, Samuel Ortiz
  Cc: David Dajun Chen, Guenter Roeck, Jean Delvare, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Dependencies required for DA9063 HWMON support.

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 core.h                    total: 0 errors, 0 warnings, 100 lines checked
 pdata.h                   total: 0 errors, 0 warnings, 129 lines checked
 da9063-core.c             total: 0 errors, 0 warnings, 199 lines checked

This patch includes the following changes:

There are small changes to da9063-core.c to allow reading the temperature
trimming offset value from the PMIC register list. This value is passed
to HWMON and is used during its calculations of the PMIC's internal junction
temperature.

There are also changes to the platform data definitions so that values may
be set for the current sources ADCIN[123]_CUR. These are provided so that
they may be configured outside the driver.

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 drivers/mfd/da9063-core.c        |   13 ++++++++++++-
 include/linux/mfd/da9063/core.h  |    3 +++
 include/linux/mfd/da9063/pdata.h |   18 ++++++++++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
index e70ae31..24c1838 100644
--- a/drivers/mfd/da9063-core.c
+++ b/drivers/mfd/da9063-core.c
@@ -111,6 +111,7 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
 {
 	struct da9063_pdata *pdata = da9063->dev->platform_data;
 	int model, variant_id, variant_code;
+	int t_offset = 0;
 	int ret;
 
 	if (pdata) {
@@ -171,8 +172,18 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
 	ret = mfd_add_devices(da9063->dev, -1, da9063_devs,
 			      ARRAY_SIZE(da9063_devs), NULL, da9063->irq_base,
 			      NULL);
-	if (ret)
+	if (ret) {
 		dev_err(da9063->dev, "Cannot add MFD cells\n");
+		return ret;
+	}
+
+	ret = regmap_read(da9063->regmap, DA9063_REG_T_OFFSET, &t_offset);
+	if (ret < 0)
+		dev_warn(da9063->dev,
+			 "Temperature trimming value cannot be read (defaulting to 0)\n");
+
+	/* pass this on to the hwmon driver */
+	da9063->t_offset = t_offset;
 
 	return ret;
 }
diff --git a/include/linux/mfd/da9063/core.h b/include/linux/mfd/da9063/core.h
index 00a9aac..7327d37 100644
--- a/include/linux/mfd/da9063/core.h
+++ b/include/linux/mfd/da9063/core.h
@@ -86,6 +86,9 @@ struct da9063 {
 	int		chip_irq;
 	unsigned int	irq_base;
 	struct regmap_irq_chip_data *regmap_irq;
+
+	/* Trimming */
+	int		t_offset;
 };
 
 int da9063_device_init(struct da9063 *da9063, unsigned int irq);
diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
index 95c8742..576033e 100644
--- a/include/linux/mfd/da9063/pdata.h
+++ b/include/linux/mfd/da9063/pdata.h
@@ -62,6 +62,23 @@ struct da9063_regulators_pdata {
 	struct da9063_regulator_data	*regulator_data;
 };
 
+/* HWMON platform data */
+#define DA9063_SET_ADCIN1_CUR_1UA	0x00
+#define DA9063_SET_ADCIN1_CUR_2UA	0x01
+#define DA9063_SET_ADCIN1_CUR_10UA	0x02
+#define DA9063_SET_ADCIN1_CUR_40UA	0x03
+#define DA9063_SET_ADCIN2_CUR_1UA	0x00
+#define DA9063_SET_ADCIN2_CUR_2UA	0x01
+#define DA9063_SET_ADCIN2_CUR_10UA	0x02
+#define DA9063_SET_ADCIN2_CUR_40UA	0x03
+#define DA9063_SET_ADCIN3_CUR_10UA	0x00
+
+struct da9063_hwmon_pdata {
+	unsigned char adcin1_cur;
+	unsigned char adcin2_cur;
+	unsigned char adcin3_cur;
+};
+
 
 /*
  * RGB LED configuration
@@ -106,6 +123,7 @@ struct da9063_pdata {
 	unsigned			flags;
 	struct da9063_regulators_pdata	*regulators_pdata;
 	struct led_platform_data	*leds_pdata;
+	struct da9063_hwmon_pdata	*hwmon_pdata;
 };
 
 #endif	/* __MFD_DA9063_PDATA_H__ */
-- 
end-of-patch for RFC V1


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

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

* [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Add the HWMON driver for DA9063

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
 Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
 Makefile                  total: 0 errors, 0 warnings, 154 lines checked
 registers.h               total: 0 errors, 0 warnings, 1066 lines checked
There are errors and warning in Kconfig, however they are not caused
by this patch.

This is the hardware monitor driver component for DA9063 PMIC.

The manual measurement allows monitoring of the system voltage
VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
measures of the backup battery voltage and a Tjunc value for the
internal junction temperature sensor.

This patch also includes the necessary register changes, especially
the definitions for ADC_CFG (addr=0xC9) to allow settings for the
current sources.

Dependencies:

The patch in this set titled:  "mfd: da9063: Add HWMON dependencies"
- The da9063-core.c changes allows for reading the temperature trimming
  offset value from the PMIC. This used by HWMON in its calculation of
  the internal junction temperature.
- Changes to platform data definitions so that ADCIN[123]_CUR values
  may be set from outside the driver.

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 drivers/hwmon/Kconfig                |   10 +
 drivers/hwmon/Makefile               |    1 +
 drivers/hwmon/da9063-hwmon.c         |  456 ++++++++++++++++++++++++++++++++++
 include/linux/mfd/da9063/registers.h |   34 +++
 4 files changed, 501 insertions(+)
 create mode 100644 drivers/hwmon/da9063-hwmon.c

diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index f288b60..68aa886 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -391,6 +391,16 @@ config SENSORS_DA9055
 	  This driver can also be built as a module.  If so, the module
 	  will be called da9055-hwmon.
 
+config SENSORS_DA9063
+	tristate "Dialog Semiconductor DA9063"
+	depends on MFD_DA9063
+	help
+	  If you say yes here you get support for the hardware
+	  monitoring features of the DA9063 Power Management IC.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called da9063-hwmon.
+
 config SENSORS_I5K_AMB
 	tristate "FB-DIMM AMB temperature sensor on Intel 5000 series chipsets"
 	depends on PCI
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index c48f987..4174b07 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1)	+= atxp1.o
 obj-$(CONFIG_SENSORS_CORETEMP)	+= coretemp.o
 obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o
 obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
+obj-$(CONFIG_SENSORS_DA9063)	+= da9063-hwmon.o
 obj-$(CONFIG_SENSORS_DME1737)	+= dme1737.o
 obj-$(CONFIG_SENSORS_DS620)	+= ds620.o
 obj-$(CONFIG_SENSORS_DS1621)	+= ds1621.o
diff --git a/drivers/hwmon/da9063-hwmon.c b/drivers/hwmon/da9063-hwmon.c
new file mode 100644
index 0000000..7756cb2
--- /dev/null
+++ b/drivers/hwmon/da9063-hwmon.c
@@ -0,0 +1,456 @@
+/* da9063-hwmon.c - Hardware monitor support for DA9063
+ * Copyright (C) 2014 Dialog Semiconductor Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/regmap.h>
+#include <linux/mfd/da9063/core.h>
+#include <linux/mfd/da9063/pdata.h>
+
+#define DA9063_ADC_RES	(1 << (DA9063_ADC_RES_L_BITS + DA9063_ADC_RES_M_BITS))
+#define DA9063_ADC_MAX	(DA9063_ADC_RES - 1)
+#define DA9063_2V5	2500
+#define DA9063_5V0	5000
+#define DA9063_5V5	5500
+#define DA9063_TJUNC_M	-420
+#define DA9063_TJUNC_C	-812
+#define DA9063_VBBAT_M	2048
+
+enum da9063_adc {
+	DA9063_CHAN_VSYS = DA9063_ADC_MUX_VSYS,
+	DA9063_CHAN_ADCIN1 = DA9063_ADC_MUX_ADCIN1,
+	DA9063_CHAN_ADCIN2 = DA9063_ADC_MUX_ADCIN2,
+	DA9063_CHAN_ADCIN3 = DA9063_ADC_MUX_ADCIN3,
+	DA9063_CHAN_TJUNC = DA9063_ADC_MUX_T_SENSE,
+	DA9063_CHAN_VBBAT = DA9063_ADC_MUX_VBBAT,
+	DA9063_CHAN_LDO_G1 = DA9063_ADC_MUX_LDO_G1,
+	DA9063_CHAN_LDO_G2 = DA9063_ADC_MUX_LDO_G2,
+	DA9063_CHAN_LDO_G3 = DA9063_ADC_MUX_LDO_G3
+};
+
+struct da9063_hwmon {
+	struct da9063 *da9063;
+	struct device *classdev;
+	struct mutex hwmon_mutex;
+	struct completion adc_ready;
+	signed char tjunc_offset;
+	int irq;
+};
+
+static int da9063_adc_convert(struct da9063_hwmon *hwmon, int channel,
+			      int *value)
+{
+	int val = *value;
+	int ret = 0;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+	case DA9063_CHAN_ADCIN2:
+	case DA9063_CHAN_ADCIN3:
+		val = (DA9063_2V5 * val) / DA9063_ADC_MAX;
+		break;
+	case DA9063_CHAN_VSYS:
+		val = ((DA9063_5V5 - DA9063_2V5) * val) / DA9063_ADC_MAX +
+			DA9063_2V5;
+		break;
+	case DA9063_CHAN_TJUNC:
+		val -= hwmon->tjunc_offset;
+		val = (DA9063_TJUNC_M * (val + DA9063_TJUNC_C)) >> 10;
+		break;
+	case DA9063_CHAN_VBBAT:
+		val = (DA9063_5V0 * val) / DA9063_ADC_MAX;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err_convert;
+	}
+
+	*value = val;
+err_convert:
+	return ret;
+}
+
+static int da9063_adc_current_switch(struct da9063_hwmon *hwmon, int channel,
+				     bool on)
+{
+	int ret;
+	unsigned int val;
+	unsigned int mask;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+		mask = DA9063_ADC_AD1_ISRC_EN;
+		break;
+	case DA9063_CHAN_ADCIN2:
+		mask = DA9063_ADC_AD2_ISRC_EN;
+		break;
+	case DA9063_CHAN_ADCIN3:
+		mask = DA9063_ADC_AD3_ISRC_EN;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err_switch;
+	}
+
+	if (on)
+		val = mask;
+	else
+		val = ~mask;
+
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CONT,
+				 mask, val);
+err_switch:
+	return ret;
+
+}
+
+static int da9063_adc_manual_read(struct da9063_hwmon *hwmon, int channel)
+{
+	int ret;
+	unsigned char val;
+	unsigned char data[2];
+	int adc_man;
+
+	mutex_lock(&hwmon->hwmon_mutex);
+
+	init_completion(&hwmon->adc_ready);
+
+	val = (channel & DA9063_ADC_MUX_MASK) | DA9063_ADC_MAN;
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_MAN,
+				 DA9063_ADC_MUX_MASK | DA9063_ADC_MAN, val);
+	if (ret < 0)
+		goto err_mread;
+
+	ret = wait_for_completion_timeout(&hwmon->adc_ready,
+					  msecs_to_jiffies(1000));
+	if (ret = 0) {
+		ret = -ETIMEDOUT;
+		goto err_mread;
+	}
+
+	ret = regmap_read(hwmon->da9063->regmap, DA9063_REG_ADC_MAN, &adc_man);
+	if (ret < 0)
+		goto err_mread;
+
+	/* data value is not ready */
+	if (adc_man & DA9063_ADC_MAN = 0) {
+		ret = -EINVAL;
+		goto err_mread;
+	}
+
+	ret = regmap_bulk_read(hwmon->da9063->regmap,
+			       DA9063_REG_ADC_RES_L, data, 2);
+	if (ret < 0)
+		goto err_mread;
+
+	ret = (data[0] & DA9063_ADC_RES_L_MASK) >> DA9063_ADC_RES_L_SHIFT;
+	ret |= data[1] << DA9063_ADC_RES_L_BITS;
+err_mread:
+	mutex_unlock(&hwmon->hwmon_mutex);
+	return ret;
+}
+
+static irqreturn_t da9063_hwmon_irq_handler(int irq, void *irq_data)
+{
+	struct da9063_hwmon *hwmon = irq_data;
+	complete(&hwmon->adc_ready);
+	return IRQ_HANDLED;
+}
+
+static ssize_t da9063_adc_read(struct device *dev,
+			       struct device_attribute *devattr, char *buf)
+{
+	struct da9063_hwmon *hwmon = dev_get_drvdata(dev);
+	int channel = to_sensor_dev_attr(devattr)->index;
+	int val;
+	int ret;
+
+	switch (channel) {
+	case DA9063_CHAN_ADCIN1:
+	case DA9063_CHAN_ADCIN2:
+	case DA9063_CHAN_ADCIN3:
+		/* fallthrough for ADC measures */
+		ret = da9063_adc_current_switch(hwmon, channel, true);
+		if (ret < 0)
+			goto err_read;
+
+		val = da9063_adc_manual_read(hwmon, channel);
+		if (val < 0) {
+			ret = val;
+			if (ret = -EINVAL)
+				dev_err(dev, "Conversion was not completed\n");
+			else
+				dev_err(dev, "ADC read error %d\n", ret);
+			goto err_read;
+		}
+
+		ret = da9063_adc_current_switch(hwmon, channel, false);
+		if (ret < 0) {
+			dev_err(dev, "Could not switch current\n");
+			goto err_read;
+		}
+		break;
+
+	case DA9063_CHAN_VSYS:
+	case DA9063_CHAN_TJUNC:
+	case DA9063_CHAN_VBBAT:
+		/* fallthrough for internal measures */
+		val = da9063_adc_manual_read(hwmon, channel);
+		if (val < 0) {
+			dev_err(dev, "ADC read error %d\n", val);
+			return val;
+		}
+		break;
+
+	default:
+		/* error case */
+		ret = -EINVAL;
+		goto err_read;
+	}
+
+	ret = da9063_adc_convert(hwmon, channel, &val);
+	if (ret < 0) {
+		dev_err(dev, "Failed to convert ADC value %d\n", ret);
+		goto err_read;
+	}
+
+	return sprintf(buf, "%d\n", val);
+err_read:
+	return ret;
+}
+
+static ssize_t da9063_show_name(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	return sprintf(buf, DA9063_DRVNAME_HWMON "\n");
+}
+
+static ssize_t da9063_show_label(struct device *dev,
+				 struct device_attribute *devattr, char *buf)
+{
+	int channel = to_sensor_dev_attr(devattr)->index;
+	char *label;
+
+	switch (channel) {
+	case DA9063_CHAN_VSYS:
+		label = "VSYS";
+		break;
+	case DA9063_CHAN_ADCIN1:
+		label = "ADCIN1";
+		break;
+	case DA9063_CHAN_ADCIN2:
+		label = "ADCIN2";
+		break;
+	case DA9063_CHAN_ADCIN3:
+		label = "ADCIN3";
+		break;
+	case DA9063_CHAN_TJUNC:
+		label = "TJUNC";
+		break;
+	case DA9063_CHAN_VBBAT:
+		label = "VBBAT";
+		break;
+	default:
+		label = "UNKNOWN";
+	}
+
+	return sprintf(buf, "%s\n", label);
+}
+
+static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_VSYS);
+static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_VSYS);
+
+static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN1);
+static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN1);
+
+static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN2);
+static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN2);
+
+static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN3);
+static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_ADCIN3);
+
+static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_VBBAT);
+static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_VBBAT);
+
+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
+			  da9063_adc_read, NULL, DA9063_CHAN_TJUNC);
+
+static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO,
+			  da9063_show_label, NULL, DA9063_CHAN_TJUNC);
+
+static DEVICE_ATTR(name, S_IRUGO, da9063_show_name, NULL);
+
+static struct attribute *da9063_attributes[] = {
+	&dev_attr_name.attr,
+	&sensor_dev_attr_in0_input.dev_attr.attr,
+	&sensor_dev_attr_in0_label.dev_attr.attr,
+	&sensor_dev_attr_in1_input.dev_attr.attr,
+	&sensor_dev_attr_in1_label.dev_attr.attr,
+	&sensor_dev_attr_in2_input.dev_attr.attr,
+	&sensor_dev_attr_in2_label.dev_attr.attr,
+	&sensor_dev_attr_in3_input.dev_attr.attr,
+	&sensor_dev_attr_in3_label.dev_attr.attr,
+	&sensor_dev_attr_in4_input.dev_attr.attr,
+	&sensor_dev_attr_in4_label.dev_attr.attr,
+	&sensor_dev_attr_temp1_input.dev_attr.attr,
+	&sensor_dev_attr_temp1_label.dev_attr.attr,
+	NULL
+};
+
+static const struct attribute_group da9063_attr_group = {
+	.attrs = da9063_attributes,
+};
+
+static int da9063_hwmon_probe(struct platform_device *pdev)
+{
+	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
+	struct da9063_pdata *pdata = da9063->dev->platform_data;
+	struct da9063_hwmon *hwmon;
+	int ret;
+	unsigned int val;
+
+	hwmon = devm_kzalloc(&pdev->dev, sizeof(struct da9063_hwmon),
+			     GFP_KERNEL);
+	if (!hwmon)
+		return -ENOMEM;
+
+	mutex_init(&hwmon->hwmon_mutex);
+	init_completion(&hwmon->adc_ready);
+	hwmon->da9063 = da9063;
+
+	/* enable the ADC functions for GPIO 0,1,2 */
+	val = (DA9063_GPIO0_PIN_ADCIN1 << DA9063_GPIO0_PIN_MASK_SHIFT |
+	       DA9063_GPIO1_PIN_ADCIN2_COMP << DA9063_GPIO1_PIN_MASK_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_0_1,
+				 (DA9063_GPIO0_PIN_MASK |
+				  DA9063_GPIO1_PIN_MASK), val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADCIN 1,2 bits for the GPIO 0,1 register\n");
+		return -EIO;
+	}
+
+	val = DA9063_GPIO2_PIN_ADCIN3 << DA9063_GPIO2_PIN_MASK_SHIFT;
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_2_3,
+				 DA9063_GPIO2_PIN_MASK, val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADCIN 3 bits for the GPIO 2,3 register\n");
+		return -EIO;
+	}
+
+	/* debounce ADC I settings */
+	val = (DA9063_ADCIN1_DEB_ON << DA9063_REG_ADCIN1_DEB_SHIFT |
+	       DA9063_ADCIN2_DEB_ON << DA9063_REG_ADCIN2_DEB_SHIFT |
+	       DA9063_ADCIN3_DEB_ON << DA9063_REG_ADCIN3_DEB_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
+				 (DA9063_REG_ADCIN1_DEB_MASK |
+				  DA9063_REG_ADCIN2_DEB_MASK |
+				  DA9063_REG_ADCIN3_DEB_MASK), val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to alter the ADC configuration register\n");
+		return -EIO;
+	}
+
+	/* set up the current configurations */
+	val = (pdata->hwmon_pdata->adcin1_cur << DA9063_REG_ADCIN1_CUR_SHIFT |
+	       pdata->hwmon_pdata->adcin2_cur << DA9063_REG_ADCIN2_CUR_SHIFT |
+	       pdata->hwmon_pdata->adcin3_cur << DA9063_REG_ADCIN3_CUR_SHIFT);
+	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
+				 (DA9063_REG_ADCIN1_CUR_MASK |
+				  DA9063_REG_ADCIN2_CUR_MASK |
+				  DA9063_REG_ADCIN3_CUR_MASK), val);
+
+	ret = regmap_read(da9063->regmap, DA9063_REG_ADC_CFG, &val);
+	if (ret < 0) {
+		dev_err(&pdev->dev,
+			"Failed to read read the ADC configuration register\n");
+		return -EIO;
+	}
+
+	hwmon->irq = platform_get_irq_byname(pdev, DA9063_DRVNAME_HWMON);
+	if (hwmon->irq < 0)
+		return hwmon->irq;
+
+	ret = devm_request_threaded_irq(&pdev->dev, hwmon->irq, NULL,
+					da9063_hwmon_irq_handler,
+					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+					"HWMON", hwmon);
+	if (ret) {
+		dev_err(&pdev->dev, "Failed to request IRQ.\n");
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, hwmon);
+
+	/* set trim temperature offset to value read at startup */
+	hwmon->tjunc_offset = (signed char)hwmon->da9063->t_offset;
+
+	ret = sysfs_create_group(&pdev->dev.kobj, &da9063_attr_group);
+	if (ret)
+		return ret;
+
+	hwmon->classdev = hwmon_device_register(&pdev->dev);
+	if (IS_ERR(hwmon->classdev)) {
+		sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
+		return PTR_ERR(hwmon->classdev);
+	}
+
+	return 0;
+}
+
+static int da9063_hwmon_remove(struct platform_device *pdev)
+{
+	struct da9063_hwmon *hwmon = platform_get_drvdata(pdev);
+
+	hwmon_device_unregister(hwmon->classdev);
+	sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
+
+	return 0;
+}
+
+static struct platform_driver da9063_hwmon_driver = {
+	.probe = da9063_hwmon_probe,
+	.remove = da9063_hwmon_remove,
+	.driver = {
+		   .name = DA9063_DRVNAME_HWMON,
+		   .owner = THIS_MODULE,
+		   },
+};
+
+module_platform_driver(da9063_hwmon_driver);
+
+MODULE_DESCRIPTION("Hardware monitor support device driver for Dialog DA9063");
+MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DA9063_DRVNAME_HWMON);
diff --git a/include/linux/mfd/da9063/registers.h b/include/linux/mfd/da9063/registers.h
index 09a85c6..922371b 100644
--- a/include/linux/mfd/da9063/registers.h
+++ b/include/linux/mfd/da9063/registers.h
@@ -474,6 +474,7 @@
 
 /* DA9063_REG_GPIO_0_1 (addr=0x15) */
 #define	DA9063_GPIO0_PIN_MASK			0x03
+#define	DA9063_GPIO0_PIN_MASK_SHIFT		0
 #define		DA9063_GPIO0_PIN_ADCIN1		0x00
 #define		DA9063_GPIO0_PIN_GPI		0x01
 #define		DA9063_GPIO0_PIN_GPO_OD		0x02
@@ -485,6 +486,7 @@
 #define		DA9063_GPIO0_TYPE_GPO_VDD_IO2	0x04
 #define	DA9063_GPIO0_NO_WAKEUP			0x08
 #define	DA9063_GPIO1_PIN_MASK			0x30
+#define	DA9063_GPIO1_PIN_MASK_SHIFT		4
 #define		DA9063_GPIO1_PIN_ADCIN2_COMP	0x00
 #define		DA9063_GPIO1_PIN_GPI		0x10
 #define		DA9063_GPIO1_PIN_GPO_OD		0x20
@@ -498,6 +500,7 @@
 
 /* DA9063_REG_GPIO_2_3 (addr=0x16) */
 #define	DA9063_GPIO2_PIN_MASK			0x03
+#define	DA9063_GPIO2_PIN_MASK_SHIFT		0
 #define		DA9063_GPIO2_PIN_ADCIN3		0x00
 #define		DA9063_GPIO2_PIN_GPI		0x01
 #define		DA9063_GPIO2_PIN_GPO_PSS	0x02
@@ -813,6 +816,7 @@
 #define	DA9063_VSYS_VAL_BASE			0x00
 
 /* DA9063_REG_ADC_RES_L (addr=0x37) */
+#define	DA9063_ADC_RES_L_SHIFT			6
 #define	DA9063_ADC_RES_L_BITS			2
 #define	DA9063_ADC_RES_L_MASK			0xC0
 
@@ -979,6 +983,36 @@
 #define DA9063_GPIO_DIM				0x80
 #define DA9063_GPIO_PWM_MASK			0x7F
 
+/* DA9063_REG_ADC_CFG (addr=0xC9) */
+#define DA9063_REG_ADCIN1_CUR_MASK		0x03
+#define DA9063_REG_ADCIN1_CUR_SHIFT		0
+#define		DA9063_ADCIN1_CUR_1UA		0x00
+#define		DA9063_ADCIN1_CUR_2UA		0x01
+#define		DA9063_ADCIN1_CUR_10UA		0x02
+#define		DA9063_ADCIN1_CUR_40UA		0x03
+#define DA9063_REG_ADCIN2_CUR_MASK		0x0C
+#define DA9063_REG_ADCIN2_CUR_SHIFT		2
+#define		DA9063_ADCIN2_CUR_1UA		0x00
+#define		DA9063_ADCIN2_CUR_2UA		0x01
+#define		DA9063_ADCIN2_CUR_10UA		0x02
+#define		DA9063_ADCIN2_CUR_40UA		0x03
+#define DA9063_REG_ADCIN3_CUR_MASK		0x10
+#define DA9063_REG_ADCIN3_CUR_SHIFT		4
+#define		DA9063_ADCIN3_CUR_10UA		0x00
+#define		DA9063_ADCIN3_CUR_40UA		0x01
+#define DA9063_REG_ADCIN1_DEB_MASK		0x20
+#define DA9063_REG_ADCIN1_DEB_SHIFT		5
+#define		DA9063_ADCIN1_DEB_OFF		0x00
+#define		DA9063_ADCIN1_DEB_ON		0x01
+#define DA9063_REG_ADCIN2_DEB_MASK		0x40
+#define DA9063_REG_ADCIN2_DEB_SHIFT		6
+#define		DA9063_ADCIN2_DEB_OFF		0x00
+#define		DA9063_ADCIN2_DEB_ON		0x01
+#define DA9063_REG_ADCIN3_DEB_MASK		0x80
+#define DA9063_REG_ADCIN3_DEB_SHIFT		7
+#define		DA9063_ADCIN3_DEB_OFF		0x00
+#define		DA9063_ADCIN3_DEB_ON		0x01
+
 /* DA9063_REG_CONFIG_H (addr=0x10D) */
 #define DA9063_PWM_CLK_MASK			0x01
 #define		DA9063_PWM_CLK_PWM2MHZ		0x00
-- 
end-of-patch for RFC V1


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

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

* [RFC V1 0/3]  da9063: Addition of HWMON support for DA9063
@ 2014-03-23 20:37 ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare, Lee Jones, Rob Landley, Samuel Ortiz
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS,
	Mark Brown, Philipp Zabel

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

This patch series covers hardware monitoring support for the DA9063 PMIC.

There are three patches in this set:
 - Add a new HWMON driver component
 - Minor MFD core and platform data changes for HWMON
 - Documentation

Thank you,
Steve Twiss, Dialog Semiconductor Ltd.

S Twiss (3):
  hwmon: da9063: HWMON driver
  mfd: da9063: Add HWMON dependencies
  Documentation: hwmon: New information for DA9063

 Documentation/hwmon/da9063           |   67 +++++
 drivers/hwmon/Kconfig                |   10 +
 drivers/hwmon/Makefile               |    1 +
 drivers/hwmon/da9063-hwmon.c         |  456 ++++++++++++++++++++++++++++++++++
 drivers/mfd/da9063-core.c            |   13 +-
 include/linux/mfd/da9063/core.h      |    3 +
 include/linux/mfd/da9063/pdata.h     |   18 ++
 include/linux/mfd/da9063/registers.h |   34 +++
 8 files changed, 601 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/hwmon/da9063
 create mode 100644 drivers/hwmon/da9063-hwmon.c

-- 
end-of-patch for RFC V1


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

* [RFC V1 3/3] Documentation: hwmon: New information for DA9063
  2014-03-23 20:37 ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare, Rob Landley
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Samuel Ortiz

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Addition of HWMON documentation for the DA9063 driver.

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 da9063                    total: 0 errors, 0 warnings, 67 lines checked

This is the documentation that goes along with the DA9063 HWMON driver
and the associated changes to the DA9063 mfd core and platform data.

Dependencies:

- The two other patches in this patch set:
  These are the HWMON driver and the MFD core changes

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 Documentation/hwmon/da9063 |   67 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)
 create mode 100644 Documentation/hwmon/da9063

diff --git a/Documentation/hwmon/da9063 b/Documentation/hwmon/da9063
new file mode 100644
index 0000000..fa616bb
--- /dev/null
+++ b/Documentation/hwmon/da9063
@@ -0,0 +1,67 @@
+
+Kernel driver da9063-hwmon
+==========================
+
+Supported chips:
+ * Dialog Semiconductor DA9063 PMIC
+    Prefix: 'da9063'
+    Datasheet:
+	http://www.dialog-semiconductor.com/products/power-management/DA9063
+
+Authors: S Twiss <stwiss.opensource@diasemi.com>
+
+Description
+-----------
+
+The DA9063 PMIC provides a general purpose ADC with 10 bits of resolution.
+It uses track and hold circuitry with an analogue input multiplexer which
+allows the conversion of up to 9 different inputs.
+
+ Channel  0: VSYS_RES	measurement of the system VDD (2.5 - 5.5V)
+ Channel  1: ADCIN1_RES	high impedance input (0 - 2.5V)
+ Channel  2: ADCIN2_RES	high impedance input (0 - 2.5V)
+ Channel  3: ADCIN3_RES	high impedance input (0 - 2.5V)
+ Channel  4: Tjunc	measurement of internal temperature sensor
+ Channel  5: VBBAT	measurement of the backup battery voltage (0 - 5.0V)
+ Channel  6: N/A	Reserved
+ Channel  7: N/A	Reserved
+ Channel  8: MON1_RES	group 1 internal regulators voltage (0 - 5.0V)
+ Channel  9: MON2_RES	group 2 internal regulators voltage (0 - 5.0V)
+ Channel 10: MON3_RES	group 3 internal regulators voltage (0 - 5.0V)
+
+The MUX selects from and isolates the 9 inputs and presents the channel to
+be measured to the ADC input. When selected, an input amplifier on the VSYS
+channel subtracts the VDDCORE reference voltage and scales the signal to the
+correct value for the ADC.
+
+The analog ADC includes current sources at ADC_IN1, ADC_IN2 and ADC_IN3 to
+support resistive measurements.
+
+Channels 1, 2 and 3 current source capability can be set through the ADC
+thresholds ADC_CFG register and values for ADCIN1_CUR, ADCIN2_CUR and
+ADCIN3_CUR. Settings for ADCIN1_CUR and ADCIN2_CUR are 1.0, 2.0, 10 and
+40 micro Amps. The setting for ADCIN3_CUR is 10 micro Amps.
+
+Voltage Monitoring
+------------------
+
+The manual measurement allows monitoring of the system voltage VSYS, the
+auxiliary channels ADCIN1, ADCIN2 and ADCIN3, and a VBBAT measurement of
+the backup battery voltage (0 - 5.0V). The manual measurements store 10
+bits of ADC resolution.
+
+The manual ADC measurements attributes described above are supported by
+the driver.
+
+The automatic ADC measurement is not supported by the driver.
+
+Temperature Monitoring
+----------------------
+
+Channel 4 (Tjunc) will be used to measure the output of the internal
+temperature sensor. The ADC measurement result and the T_OFFSET value can
+be used by the host to calculate the internal junction temperature
+
+	Tjunc = -0.41 * (ADC - T_OFFSET - 812.5);
+
+The junction temperature attribute is supported by the driver.
-- 
end-of-patch for RFC V1


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

* [lm-sensors] [RFC V1 3/3] Documentation: hwmon: New information for DA9063
@ 2014-03-23 20:37   ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare, Rob Landley
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Samuel Ortiz

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

Addition of HWMON documentation for the DA9063 driver.

Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
---
Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
 da9063                    total: 0 errors, 0 warnings, 67 lines checked

This is the documentation that goes along with the DA9063 HWMON driver
and the associated changes to the DA9063 mfd core and platform data.

Dependencies:

- The two other patches in this patch set:
  These are the HWMON driver and the MFD core changes

This patch applies against linux-next and next-20140321

Regards,
Steve Twiss, Dialog Semiconductor Ltd.



 Documentation/hwmon/da9063 |   67 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)
 create mode 100644 Documentation/hwmon/da9063

diff --git a/Documentation/hwmon/da9063 b/Documentation/hwmon/da9063
new file mode 100644
index 0000000..fa616bb
--- /dev/null
+++ b/Documentation/hwmon/da9063
@@ -0,0 +1,67 @@
+
+Kernel driver da9063-hwmon
+=============
+
+Supported chips:
+ * Dialog Semiconductor DA9063 PMIC
+    Prefix: 'da9063'
+    Datasheet:
+	http://www.dialog-semiconductor.com/products/power-management/DA9063
+
+Authors: S Twiss <stwiss.opensource@diasemi.com>
+
+Description
+-----------
+
+The DA9063 PMIC provides a general purpose ADC with 10 bits of resolution.
+It uses track and hold circuitry with an analogue input multiplexer which
+allows the conversion of up to 9 different inputs.
+
+ Channel  0: VSYS_RES	measurement of the system VDD (2.5 - 5.5V)
+ Channel  1: ADCIN1_RES	high impedance input (0 - 2.5V)
+ Channel  2: ADCIN2_RES	high impedance input (0 - 2.5V)
+ Channel  3: ADCIN3_RES	high impedance input (0 - 2.5V)
+ Channel  4: Tjunc	measurement of internal temperature sensor
+ Channel  5: VBBAT	measurement of the backup battery voltage (0 - 5.0V)
+ Channel  6: N/A	Reserved
+ Channel  7: N/A	Reserved
+ Channel  8: MON1_RES	group 1 internal regulators voltage (0 - 5.0V)
+ Channel  9: MON2_RES	group 2 internal regulators voltage (0 - 5.0V)
+ Channel 10: MON3_RES	group 3 internal regulators voltage (0 - 5.0V)
+
+The MUX selects from and isolates the 9 inputs and presents the channel to
+be measured to the ADC input. When selected, an input amplifier on the VSYS
+channel subtracts the VDDCORE reference voltage and scales the signal to the
+correct value for the ADC.
+
+The analog ADC includes current sources at ADC_IN1, ADC_IN2 and ADC_IN3 to
+support resistive measurements.
+
+Channels 1, 2 and 3 current source capability can be set through the ADC
+thresholds ADC_CFG register and values for ADCIN1_CUR, ADCIN2_CUR and
+ADCIN3_CUR. Settings for ADCIN1_CUR and ADCIN2_CUR are 1.0, 2.0, 10 and
+40 micro Amps. The setting for ADCIN3_CUR is 10 micro Amps.
+
+Voltage Monitoring
+------------------
+
+The manual measurement allows monitoring of the system voltage VSYS, the
+auxiliary channels ADCIN1, ADCIN2 and ADCIN3, and a VBBAT measurement of
+the backup battery voltage (0 - 5.0V). The manual measurements store 10
+bits of ADC resolution.
+
+The manual ADC measurements attributes described above are supported by
+the driver.
+
+The automatic ADC measurement is not supported by the driver.
+
+Temperature Monitoring
+----------------------
+
+Channel 4 (Tjunc) will be used to measure the output of the internal
+temperature sensor. The ADC measurement result and the T_OFFSET value can
+be used by the host to calculate the internal junction temperature
+
+	Tjunc = -0.41 * (ADC - T_OFFSET - 812.5);
+
+The junction temperature attribute is supported by the driver.
-- 
end-of-patch for RFC V1


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

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

* [lm-sensors] [RFC V1 0/3] da9063: Addition of HWMON support for DA9063
@ 2014-03-23 20:37 ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-23 20:37 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare, Lee Jones, Rob Landley, Samuel Ortiz
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS,
	Mark Brown, Philipp Zabel

From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>

This patch series covers hardware monitoring support for the DA9063 PMIC.

There are three patches in this set:
 - Add a new HWMON driver component
 - Minor MFD core and platform data changes for HWMON
 - Documentation

Thank you,
Steve Twiss, Dialog Semiconductor Ltd.

S Twiss (3):
  hwmon: da9063: HWMON driver
  mfd: da9063: Add HWMON dependencies
  Documentation: hwmon: New information for DA9063

 Documentation/hwmon/da9063           |   67 +++++
 drivers/hwmon/Kconfig                |   10 +
 drivers/hwmon/Makefile               |    1 +
 drivers/hwmon/da9063-hwmon.c         |  456 ++++++++++++++++++++++++++++++++++
 drivers/mfd/da9063-core.c            |   13 +-
 include/linux/mfd/da9063/core.h      |    3 +
 include/linux/mfd/da9063/pdata.h     |   18 ++
 include/linux/mfd/da9063/registers.h |   34 +++
 8 files changed, 601 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/hwmon/da9063
 create mode 100644 drivers/hwmon/da9063-hwmon.c

-- 
end-of-patch for RFC V1


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

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

* Re: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-24  3:27     ` Guenter Roeck
  -1 siblings, 0 replies; 24+ messages in thread
From: Guenter Roeck @ 2014-03-24  3:27 UTC (permalink / raw)
  To: Opensource [Steve Twiss], Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>
> Add the HWMON driver for DA9063
>
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---

> +
> +	ret = sysfs_create_group(&pdev->dev.kobj, &da9063_attr_group);
> +	if (ret)
> +		return ret;
> +
> +	hwmon->classdev = hwmon_device_register(&pdev->dev);
> +	if (IS_ERR(hwmon->classdev)) {
> +		sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
> +		return PTR_ERR(hwmon->classdev);
> +	}
> +

Hi Steve,

This looks like an ideal candidate for devm_hwmon_device_register_with_groups().
Can you use that API, please ?

Thanks,
Guenter


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

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  3:27     ` Guenter Roeck
  0 siblings, 0 replies; 24+ messages in thread
From: Guenter Roeck @ 2014-03-24  3:27 UTC (permalink / raw)
  To: Opensource [Steve Twiss], Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>
> Add the HWMON driver for DA9063
>
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---

> +
> +	ret = sysfs_create_group(&pdev->dev.kobj, &da9063_attr_group);
> +	if (ret)
> +		return ret;
> +
> +	hwmon->classdev = hwmon_device_register(&pdev->dev);
> +	if (IS_ERR(hwmon->classdev)) {
> +		sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
> +		return PTR_ERR(hwmon->classdev);
> +	}
> +

Hi Steve,

This looks like an ideal candidate for devm_hwmon_device_register_with_groups().
Can you use that API, please ?

Thanks,
Guenter


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

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

* Re: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-24  3:39     ` Guenter Roeck
  -1 siblings, 0 replies; 24+ messages in thread
From: Guenter Roeck @ 2014-03-24  3:39 UTC (permalink / raw)
  To: Opensource [Steve Twiss], Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>
> Add the HWMON driver for DA9063
>
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---
> Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
>   da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
>   Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
>   Makefile                  total: 0 errors, 0 warnings, 154 lines checked
>   registers.h               total: 0 errors, 0 warnings, 1066 lines checked
> There are errors and warning in Kconfig, however they are not caused
> by this patch.
>
> This is the hardware monitor driver component for DA9063 PMIC.
>
> The manual measurement allows monitoring of the system voltage
> VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
> measures of the backup battery voltage and a Tjunc value for the
> internal junction temperature sensor.
>

At least this part belongs into the summary.

After browsing through patch 2/3, I got suspicious and tried to compile
the driver after applying this patch.

Here is the result:

drivers/hwmon/da9063-hwmon.c: In function 'da9063_adc_manual_read':
drivers/hwmon/da9063-hwmon.c:155:2: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
drivers/hwmon/da9063-hwmon.c: In function 'da9063_hwmon_probe':
drivers/hwmon/da9063-hwmon.c:386:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:387:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:388:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:417:50: error: 'struct da9063' has no member named 't_offset'
make[1]: *** [drivers/hwmon/da9063-hwmon.o] Error 1
make: *** [drivers/hwmon/da9063-hwmon.ko] Error 2

Please make sure that each patch, if applied one after another, compiles.
Patch 1/3 must not depend on patch 2/3.

Thanks,
Guenter


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

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  3:39     ` Guenter Roeck
  0 siblings, 0 replies; 24+ messages in thread
From: Guenter Roeck @ 2014-03-24  3:39 UTC (permalink / raw)
  To: Opensource [Steve Twiss], Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>
> Add the HWMON driver for DA9063
>
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---
> Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
>   da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
>   Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
>   Makefile                  total: 0 errors, 0 warnings, 154 lines checked
>   registers.h               total: 0 errors, 0 warnings, 1066 lines checked
> There are errors and warning in Kconfig, however they are not caused
> by this patch.
>
> This is the hardware monitor driver component for DA9063 PMIC.
>
> The manual measurement allows monitoring of the system voltage
> VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
> measures of the backup battery voltage and a Tjunc value for the
> internal junction temperature sensor.
>

At least this part belongs into the summary.

After browsing through patch 2/3, I got suspicious and tried to compile
the driver after applying this patch.

Here is the result:

drivers/hwmon/da9063-hwmon.c: In function 'da9063_adc_manual_read':
drivers/hwmon/da9063-hwmon.c:155:2: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
drivers/hwmon/da9063-hwmon.c: In function 'da9063_hwmon_probe':
drivers/hwmon/da9063-hwmon.c:386:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:387:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:388:14: error: 'struct da9063_pdata' has no member named 'hwmon_pdata'
drivers/hwmon/da9063-hwmon.c:417:50: error: 'struct da9063' has no member named 't_offset'
make[1]: *** [drivers/hwmon/da9063-hwmon.o] Error 1
make: *** [drivers/hwmon/da9063-hwmon.ko] Error 2

Please make sure that each patch, if applied one after another, compiles.
Patch 1/3 must not depend on patch 2/3.

Thanks,
Guenter


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

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

* RE: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-24  3:39     ` [lm-sensors] " Guenter Roeck
@ 2014-03-24  7:48       ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  7:48 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 24 March 2014 03:39, Guenter Roeck wrote:

>On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
>> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>>
>> Add the HWMON driver for DA9063
>>
>> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>> ---
>> Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
>>   da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
>>   Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
>>   Makefile                  total: 0 errors, 0 warnings, 154 lines checked
>>   registers.h               total: 0 errors, 0 warnings, 1066 lines checked
>> There are errors and warning in Kconfig, however they are not caused
>> by this patch.
>>
>> This is the hardware monitor driver component for DA9063 PMIC.
>>
>> The manual measurement allows monitoring of the system voltage
>> VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
>> measures of the backup battery voltage and a Tjunc value for the
>> internal junction temperature sensor.
>>
>
>At least this part belongs into the summary.
>
>After browsing through patch 2/3, I got suspicious and tried to compile
>the driver after applying this patch.
>
>Here is the result:
>
>drivers/hwmon/da9063-hwmon.c: In function 'da9063_adc_manual_read':
>drivers/hwmon/da9063-hwmon.c:155:2: warning: suggest parentheses around
>comparison in operand of '&' [-Wparentheses]
>drivers/hwmon/da9063-hwmon.c: In function 'da9063_hwmon_probe':
>drivers/hwmon/da9063-hwmon.c:386:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:387:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:388:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:417:50: error: 'struct da9063' has no member
>named 't_offset'
>make[1]: *** [drivers/hwmon/da9063-hwmon.o] Error 1
>make: *** [drivers/hwmon/da9063-hwmon.ko] Error 2
>
>Please make sure that each patch, if applied one after another, compiles.
>Patch 1/3 must not depend on patch 2/3.

Hi Guenter,

Thank you for this fast response.

Ah, the dependencies were not in order. I will check for that in future.

I will also look into using the API with devm_hwmon_device_register_with_groups
and will resubmit with a RFC V2 later.

Thank you,
Steve

>
>Thanks,
>Guenter


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

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  7:48       ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  7:48 UTC (permalink / raw)
  To: Guenter Roeck, Jean Delvare
  Cc: David Dajun Chen, LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Lee Jones,
	Mark Brown, Philipp Zabel, Rob Landley, Samuel Ortiz

On 24 March 2014 03:39, Guenter Roeck wrote:

>On 03/23/2014 01:37 PM, Opensource [Steve Twiss] wrote:
>> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>>
>> Add the HWMON driver for DA9063
>>
>> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>> ---
>> Checks performed with linux-next/next-20140321/scripts/checkpatch.pl
>>   da9063-hwmon.c            total: 0 errors, 0 warnings, 456 lines checked
>>   Kconfig                   total: 1 errors, 3 warnings, 1643 lines checked
>>   Makefile                  total: 0 errors, 0 warnings, 154 lines checked
>>   registers.h               total: 0 errors, 0 warnings, 1066 lines checked
>> There are errors and warning in Kconfig, however they are not caused
>> by this patch.
>>
>> This is the hardware monitor driver component for DA9063 PMIC.
>>
>> The manual measurement allows monitoring of the system voltage
>> VSYS, the auxiliary channels ADCIN1, ADCIN2 and ADCIN3, VBBAT
>> measures of the backup battery voltage and a Tjunc value for the
>> internal junction temperature sensor.
>>
>
>At least this part belongs into the summary.
>
>After browsing through patch 2/3, I got suspicious and tried to compile
>the driver after applying this patch.
>
>Here is the result:
>
>drivers/hwmon/da9063-hwmon.c: In function 'da9063_adc_manual_read':
>drivers/hwmon/da9063-hwmon.c:155:2: warning: suggest parentheses around
>comparison in operand of '&' [-Wparentheses]
>drivers/hwmon/da9063-hwmon.c: In function 'da9063_hwmon_probe':
>drivers/hwmon/da9063-hwmon.c:386:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:387:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:388:14: error: 'struct da9063_pdata' has no
>member named 'hwmon_pdata'
>drivers/hwmon/da9063-hwmon.c:417:50: error: 'struct da9063' has no member
>named 't_offset'
>make[1]: *** [drivers/hwmon/da9063-hwmon.o] Error 1
>make: *** [drivers/hwmon/da9063-hwmon.ko] Error 2
>
>Please make sure that each patch, if applied one after another, compiles.
>Patch 1/3 must not depend on patch 2/3.

Hi Guenter,

Thank you for this fast response.

Ah, the dependencies were not in order. I will check for that in future.

I will also look into using the API with devm_hwmon_device_register_with_groups
and will resubmit with a RFC V2 later.

Thank you,
Steve

>
>Thanks,
>Guenter


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

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

* Re: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-24  7:52     ` Lee Jones
  -1 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  7:52 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> 
> Add the HWMON driver for DA9063
> 
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---
> 
>  drivers/hwmon/Kconfig                |   10 +
>  drivers/hwmon/Makefile               |    1 +
>  drivers/hwmon/da9063-hwmon.c         |  456 ++++++++++++++++++++++++++++++++++
>  include/linux/mfd/da9063/registers.h |   34 +++

I'd prefer to see all values in hex, but this probably a preference
thing rather than something which would prevent acceptance.

For the MFD header changes:
  Acked-by: Lee Jones <lee.jones@linaro.org>

>  4 files changed, 501 insertions(+)
>  create mode 100644 drivers/hwmon/da9063-hwmon.c
> 
> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index f288b60..68aa886 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -391,6 +391,16 @@ config SENSORS_DA9055
>  	  This driver can also be built as a module.  If so, the module
>  	  will be called da9055-hwmon.
>  
> +config SENSORS_DA9063
> +	tristate "Dialog Semiconductor DA9063"
> +	depends on MFD_DA9063
> +	help
> +	  If you say yes here you get support for the hardware
> +	  monitoring features of the DA9063 Power Management IC.
> +
> +	  This driver can also be built as a module. If so, the module
> +	  will be called da9063-hwmon.
> +
>  config SENSORS_I5K_AMB
>  	tristate "FB-DIMM AMB temperature sensor on Intel 5000 series chipsets"
>  	depends on PCI
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index c48f987..4174b07 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1)	+= atxp1.o
>  obj-$(CONFIG_SENSORS_CORETEMP)	+= coretemp.o
>  obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o
>  obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
> +obj-$(CONFIG_SENSORS_DA9063)	+= da9063-hwmon.o
>  obj-$(CONFIG_SENSORS_DME1737)	+= dme1737.o
>  obj-$(CONFIG_SENSORS_DS620)	+= ds620.o
>  obj-$(CONFIG_SENSORS_DS1621)	+= ds1621.o
> diff --git a/drivers/hwmon/da9063-hwmon.c b/drivers/hwmon/da9063-hwmon.c
> new file mode 100644
> index 0000000..7756cb2
> --- /dev/null
> +++ b/drivers/hwmon/da9063-hwmon.c
> @@ -0,0 +1,456 @@
> +/* da9063-hwmon.c - Hardware monitor support for DA9063
> + * Copyright (C) 2014 Dialog Semiconductor Ltd.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/err.h>
> +#include <linux/delay.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/string.h>
> +#include <linux/platform_device.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/regmap.h>
> +#include <linux/mfd/da9063/core.h>
> +#include <linux/mfd/da9063/pdata.h>
> +
> +#define DA9063_ADC_RES	(1 << (DA9063_ADC_RES_L_BITS + DA9063_ADC_RES_M_BITS))
> +#define DA9063_ADC_MAX	(DA9063_ADC_RES - 1)
> +#define DA9063_2V5	2500
> +#define DA9063_5V0	5000
> +#define DA9063_5V5	5500
> +#define DA9063_TJUNC_M	-420
> +#define DA9063_TJUNC_C	-812
> +#define DA9063_VBBAT_M	2048
> +
> +enum da9063_adc {
> +	DA9063_CHAN_VSYS = DA9063_ADC_MUX_VSYS,
> +	DA9063_CHAN_ADCIN1 = DA9063_ADC_MUX_ADCIN1,
> +	DA9063_CHAN_ADCIN2 = DA9063_ADC_MUX_ADCIN2,
> +	DA9063_CHAN_ADCIN3 = DA9063_ADC_MUX_ADCIN3,
> +	DA9063_CHAN_TJUNC = DA9063_ADC_MUX_T_SENSE,
> +	DA9063_CHAN_VBBAT = DA9063_ADC_MUX_VBBAT,
> +	DA9063_CHAN_LDO_G1 = DA9063_ADC_MUX_LDO_G1,
> +	DA9063_CHAN_LDO_G2 = DA9063_ADC_MUX_LDO_G2,
> +	DA9063_CHAN_LDO_G3 = DA9063_ADC_MUX_LDO_G3
> +};
> +
> +struct da9063_hwmon {
> +	struct da9063 *da9063;
> +	struct device *classdev;
> +	struct mutex hwmon_mutex;
> +	struct completion adc_ready;
> +	signed char tjunc_offset;
> +	int irq;
> +};
> +
> +static int da9063_adc_convert(struct da9063_hwmon *hwmon, int channel,
> +			      int *value)
> +{
> +	int val = *value;
> +	int ret = 0;
> +
> +	switch (channel) {
> +	case DA9063_CHAN_ADCIN1:
> +	case DA9063_CHAN_ADCIN2:
> +	case DA9063_CHAN_ADCIN3:
> +		val = (DA9063_2V5 * val) / DA9063_ADC_MAX;
> +		break;
> +	case DA9063_CHAN_VSYS:
> +		val = ((DA9063_5V5 - DA9063_2V5) * val) / DA9063_ADC_MAX +
> +			DA9063_2V5;
> +		break;
> +	case DA9063_CHAN_TJUNC:
> +		val -= hwmon->tjunc_offset;
> +		val = (DA9063_TJUNC_M * (val + DA9063_TJUNC_C)) >> 10;
> +		break;
> +	case DA9063_CHAN_VBBAT:
> +		val = (DA9063_5V0 * val) / DA9063_ADC_MAX;
> +		break;
> +	default:
> +		ret = -EINVAL;
> +		goto err_convert;
> +	}
> +
> +	*value = val;
> +err_convert:
> +	return ret;
> +}
> +
> +static int da9063_adc_current_switch(struct da9063_hwmon *hwmon, int channel,
> +				     bool on)
> +{
> +	int ret;
> +	unsigned int val;
> +	unsigned int mask;
> +
> +	switch (channel) {
> +	case DA9063_CHAN_ADCIN1:
> +		mask = DA9063_ADC_AD1_ISRC_EN;
> +		break;
> +	case DA9063_CHAN_ADCIN2:
> +		mask = DA9063_ADC_AD2_ISRC_EN;
> +		break;
> +	case DA9063_CHAN_ADCIN3:
> +		mask = DA9063_ADC_AD3_ISRC_EN;
> +		break;
> +	default:
> +		ret = -EINVAL;
> +		goto err_switch;
> +	}
> +
> +	if (on)
> +		val = mask;
> +	else
> +		val = ~mask;
> +
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CONT,
> +				 mask, val);
> +err_switch:
> +	return ret;
> +
> +}
> +
> +static int da9063_adc_manual_read(struct da9063_hwmon *hwmon, int channel)
> +{
> +	int ret;
> +	unsigned char val;
> +	unsigned char data[2];
> +	int adc_man;
> +
> +	mutex_lock(&hwmon->hwmon_mutex);
> +
> +	init_completion(&hwmon->adc_ready);
> +
> +	val = (channel & DA9063_ADC_MUX_MASK) | DA9063_ADC_MAN;
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_MAN,
> +				 DA9063_ADC_MUX_MASK | DA9063_ADC_MAN, val);
> +	if (ret < 0)
> +		goto err_mread;
> +
> +	ret = wait_for_completion_timeout(&hwmon->adc_ready,
> +					  msecs_to_jiffies(1000));
> +	if (ret == 0) {
> +		ret = -ETIMEDOUT;
> +		goto err_mread;
> +	}
> +
> +	ret = regmap_read(hwmon->da9063->regmap, DA9063_REG_ADC_MAN, &adc_man);
> +	if (ret < 0)
> +		goto err_mread;
> +
> +	/* data value is not ready */
> +	if (adc_man & DA9063_ADC_MAN == 0) {
> +		ret = -EINVAL;
> +		goto err_mread;
> +	}
> +
> +	ret = regmap_bulk_read(hwmon->da9063->regmap,
> +			       DA9063_REG_ADC_RES_L, data, 2);
> +	if (ret < 0)
> +		goto err_mread;
> +
> +	ret = (data[0] & DA9063_ADC_RES_L_MASK) >> DA9063_ADC_RES_L_SHIFT;
> +	ret |= data[1] << DA9063_ADC_RES_L_BITS;
> +err_mread:
> +	mutex_unlock(&hwmon->hwmon_mutex);
> +	return ret;
> +}
> +
> +static irqreturn_t da9063_hwmon_irq_handler(int irq, void *irq_data)
> +{
> +	struct da9063_hwmon *hwmon = irq_data;
> +	complete(&hwmon->adc_ready);
> +	return IRQ_HANDLED;
> +}
> +
> +static ssize_t da9063_adc_read(struct device *dev,
> +			       struct device_attribute *devattr, char *buf)
> +{
> +	struct da9063_hwmon *hwmon = dev_get_drvdata(dev);
> +	int channel = to_sensor_dev_attr(devattr)->index;
> +	int val;
> +	int ret;
> +
> +	switch (channel) {
> +	case DA9063_CHAN_ADCIN1:
> +	case DA9063_CHAN_ADCIN2:
> +	case DA9063_CHAN_ADCIN3:
> +		/* fallthrough for ADC measures */
> +		ret = da9063_adc_current_switch(hwmon, channel, true);
> +		if (ret < 0)
> +			goto err_read;
> +
> +		val = da9063_adc_manual_read(hwmon, channel);
> +		if (val < 0) {
> +			ret = val;
> +			if (ret == -EINVAL)
> +				dev_err(dev, "Conversion was not completed\n");
> +			else
> +				dev_err(dev, "ADC read error %d\n", ret);
> +			goto err_read;
> +		}
> +
> +		ret = da9063_adc_current_switch(hwmon, channel, false);
> +		if (ret < 0) {
> +			dev_err(dev, "Could not switch current\n");
> +			goto err_read;
> +		}
> +		break;
> +
> +	case DA9063_CHAN_VSYS:
> +	case DA9063_CHAN_TJUNC:
> +	case DA9063_CHAN_VBBAT:
> +		/* fallthrough for internal measures */
> +		val = da9063_adc_manual_read(hwmon, channel);
> +		if (val < 0) {
> +			dev_err(dev, "ADC read error %d\n", val);
> +			return val;
> +		}
> +		break;
> +
> +	default:
> +		/* error case */
> +		ret = -EINVAL;
> +		goto err_read;
> +	}
> +
> +	ret = da9063_adc_convert(hwmon, channel, &val);
> +	if (ret < 0) {
> +		dev_err(dev, "Failed to convert ADC value %d\n", ret);
> +		goto err_read;
> +	}
> +
> +	return sprintf(buf, "%d\n", val);
> +err_read:
> +	return ret;
> +}
> +
> +static ssize_t da9063_show_name(struct device *dev,
> +				struct device_attribute *attr, char *buf)
> +{
> +	return sprintf(buf, DA9063_DRVNAME_HWMON "\n");
> +}
> +
> +static ssize_t da9063_show_label(struct device *dev,
> +				 struct device_attribute *devattr, char *buf)
> +{
> +	int channel = to_sensor_dev_attr(devattr)->index;
> +	char *label;
> +
> +	switch (channel) {
> +	case DA9063_CHAN_VSYS:
> +		label = "VSYS";
> +		break;
> +	case DA9063_CHAN_ADCIN1:
> +		label = "ADCIN1";
> +		break;
> +	case DA9063_CHAN_ADCIN2:
> +		label = "ADCIN2";
> +		break;
> +	case DA9063_CHAN_ADCIN3:
> +		label = "ADCIN3";
> +		break;
> +	case DA9063_CHAN_TJUNC:
> +		label = "TJUNC";
> +		break;
> +	case DA9063_CHAN_VBBAT:
> +		label = "VBBAT";
> +		break;
> +	default:
> +		label = "UNKNOWN";
> +	}
> +
> +	return sprintf(buf, "%s\n", label);
> +}
> +
> +static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_VSYS);
> +static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_VSYS);
> +
> +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN1);
> +static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_ADCIN1);
> +
> +static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN2);
> +static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_ADCIN2);
> +
> +static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_ADCIN3);
> +static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_ADCIN3);
> +
> +static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_VBBAT);
> +static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_VBBAT);
> +
> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
> +			  da9063_adc_read, NULL, DA9063_CHAN_TJUNC);
> +
> +static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO,
> +			  da9063_show_label, NULL, DA9063_CHAN_TJUNC);
> +
> +static DEVICE_ATTR(name, S_IRUGO, da9063_show_name, NULL);
> +
> +static struct attribute *da9063_attributes[] = {
> +	&dev_attr_name.attr,
> +	&sensor_dev_attr_in0_input.dev_attr.attr,
> +	&sensor_dev_attr_in0_label.dev_attr.attr,
> +	&sensor_dev_attr_in1_input.dev_attr.attr,
> +	&sensor_dev_attr_in1_label.dev_attr.attr,
> +	&sensor_dev_attr_in2_input.dev_attr.attr,
> +	&sensor_dev_attr_in2_label.dev_attr.attr,
> +	&sensor_dev_attr_in3_input.dev_attr.attr,
> +	&sensor_dev_attr_in3_label.dev_attr.attr,
> +	&sensor_dev_attr_in4_input.dev_attr.attr,
> +	&sensor_dev_attr_in4_label.dev_attr.attr,
> +	&sensor_dev_attr_temp1_input.dev_attr.attr,
> +	&sensor_dev_attr_temp1_label.dev_attr.attr,
> +	NULL
> +};
> +
> +static const struct attribute_group da9063_attr_group = {
> +	.attrs = da9063_attributes,
> +};
> +
> +static int da9063_hwmon_probe(struct platform_device *pdev)
> +{
> +	struct da9063 *da9063 = dev_get_drvdata(pdev->dev.parent);
> +	struct da9063_pdata *pdata = da9063->dev->platform_data;
> +	struct da9063_hwmon *hwmon;
> +	int ret;
> +	unsigned int val;
> +
> +	hwmon = devm_kzalloc(&pdev->dev, sizeof(struct da9063_hwmon),
> +			     GFP_KERNEL);
> +	if (!hwmon)
> +		return -ENOMEM;
> +
> +	mutex_init(&hwmon->hwmon_mutex);
> +	init_completion(&hwmon->adc_ready);
> +	hwmon->da9063 = da9063;
> +
> +	/* enable the ADC functions for GPIO 0,1,2 */
> +	val = (DA9063_GPIO0_PIN_ADCIN1 << DA9063_GPIO0_PIN_MASK_SHIFT |
> +	       DA9063_GPIO1_PIN_ADCIN2_COMP << DA9063_GPIO1_PIN_MASK_SHIFT);
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_0_1,
> +				 (DA9063_GPIO0_PIN_MASK |
> +				  DA9063_GPIO1_PIN_MASK), val);
> +	if (ret < 0) {
> +		dev_err(&pdev->dev,
> +			"Failed to alter the ADCIN 1,2 bits for the GPIO 0,1 register\n");
> +		return -EIO;
> +	}
> +
> +	val = DA9063_GPIO2_PIN_ADCIN3 << DA9063_GPIO2_PIN_MASK_SHIFT;
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_GPIO_2_3,
> +				 DA9063_GPIO2_PIN_MASK, val);
> +	if (ret < 0) {
> +		dev_err(&pdev->dev,
> +			"Failed to alter the ADCIN 3 bits for the GPIO 2,3 register\n");
> +		return -EIO;
> +	}
> +
> +	/* debounce ADC I settings */
> +	val = (DA9063_ADCIN1_DEB_ON << DA9063_REG_ADCIN1_DEB_SHIFT |
> +	       DA9063_ADCIN2_DEB_ON << DA9063_REG_ADCIN2_DEB_SHIFT |
> +	       DA9063_ADCIN3_DEB_ON << DA9063_REG_ADCIN3_DEB_SHIFT);
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
> +				 (DA9063_REG_ADCIN1_DEB_MASK |
> +				  DA9063_REG_ADCIN2_DEB_MASK |
> +				  DA9063_REG_ADCIN3_DEB_MASK), val);
> +	if (ret < 0) {
> +		dev_err(&pdev->dev,
> +			"Failed to alter the ADC configuration register\n");
> +		return -EIO;
> +	}
> +
> +	/* set up the current configurations */
> +	val = (pdata->hwmon_pdata->adcin1_cur << DA9063_REG_ADCIN1_CUR_SHIFT |
> +	       pdata->hwmon_pdata->adcin2_cur << DA9063_REG_ADCIN2_CUR_SHIFT |
> +	       pdata->hwmon_pdata->adcin3_cur << DA9063_REG_ADCIN3_CUR_SHIFT);
> +	ret = regmap_update_bits(hwmon->da9063->regmap, DA9063_REG_ADC_CFG,
> +				 (DA9063_REG_ADCIN1_CUR_MASK |
> +				  DA9063_REG_ADCIN2_CUR_MASK |
> +				  DA9063_REG_ADCIN3_CUR_MASK), val);
> +
> +	ret = regmap_read(da9063->regmap, DA9063_REG_ADC_CFG, &val);
> +	if (ret < 0) {
> +		dev_err(&pdev->dev,
> +			"Failed to read read the ADC configuration register\n");
> +		return -EIO;
> +	}
> +
> +	hwmon->irq = platform_get_irq_byname(pdev, DA9063_DRVNAME_HWMON);
> +	if (hwmon->irq < 0)
> +		return hwmon->irq;
> +
> +	ret = devm_request_threaded_irq(&pdev->dev, hwmon->irq, NULL,
> +					da9063_hwmon_irq_handler,
> +					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> +					"HWMON", hwmon);
> +	if (ret) {
> +		dev_err(&pdev->dev, "Failed to request IRQ.\n");
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, hwmon);
> +
> +	/* set trim temperature offset to value read at startup */
> +	hwmon->tjunc_offset = (signed char)hwmon->da9063->t_offset;
> +
> +	ret = sysfs_create_group(&pdev->dev.kobj, &da9063_attr_group);
> +	if (ret)
> +		return ret;
> +
> +	hwmon->classdev = hwmon_device_register(&pdev->dev);
> +	if (IS_ERR(hwmon->classdev)) {
> +		sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
> +		return PTR_ERR(hwmon->classdev);
> +	}
> +
> +	return 0;
> +}
> +
> +static int da9063_hwmon_remove(struct platform_device *pdev)
> +{
> +	struct da9063_hwmon *hwmon = platform_get_drvdata(pdev);
> +
> +	hwmon_device_unregister(hwmon->classdev);
> +	sysfs_remove_group(&pdev->dev.kobj, &da9063_attr_group);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver da9063_hwmon_driver = {
> +	.probe = da9063_hwmon_probe,
> +	.remove = da9063_hwmon_remove,
> +	.driver = {
> +		   .name = DA9063_DRVNAME_HWMON,
> +		   .owner = THIS_MODULE,
> +		   },
> +};
> +
> +module_platform_driver(da9063_hwmon_driver);
> +
> +MODULE_DESCRIPTION("Hardware monitor support device driver for Dialog DA9063");
> +MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
> +MODULE_LICENSE("GPL v2");
> +MODULE_ALIAS("platform:" DA9063_DRVNAME_HWMON);
> diff --git a/include/linux/mfd/da9063/registers.h b/include/linux/mfd/da9063/registers.h
> index 09a85c6..922371b 100644
> --- a/include/linux/mfd/da9063/registers.h
> +++ b/include/linux/mfd/da9063/registers.h
> @@ -474,6 +474,7 @@
>  
>  /* DA9063_REG_GPIO_0_1 (addr=0x15) */
>  #define	DA9063_GPIO0_PIN_MASK			0x03
> +#define	DA9063_GPIO0_PIN_MASK_SHIFT		0
>  #define		DA9063_GPIO0_PIN_ADCIN1		0x00
>  #define		DA9063_GPIO0_PIN_GPI		0x01
>  #define		DA9063_GPIO0_PIN_GPO_OD		0x02
> @@ -485,6 +486,7 @@
>  #define		DA9063_GPIO0_TYPE_GPO_VDD_IO2	0x04
>  #define	DA9063_GPIO0_NO_WAKEUP			0x08
>  #define	DA9063_GPIO1_PIN_MASK			0x30
> +#define	DA9063_GPIO1_PIN_MASK_SHIFT		4
>  #define		DA9063_GPIO1_PIN_ADCIN2_COMP	0x00
>  #define		DA9063_GPIO1_PIN_GPI		0x10
>  #define		DA9063_GPIO1_PIN_GPO_OD		0x20
> @@ -498,6 +500,7 @@
>  
>  /* DA9063_REG_GPIO_2_3 (addr=0x16) */
>  #define	DA9063_GPIO2_PIN_MASK			0x03
> +#define	DA9063_GPIO2_PIN_MASK_SHIFT		0
>  #define		DA9063_GPIO2_PIN_ADCIN3		0x00
>  #define		DA9063_GPIO2_PIN_GPI		0x01
>  #define		DA9063_GPIO2_PIN_GPO_PSS	0x02
> @@ -813,6 +816,7 @@
>  #define	DA9063_VSYS_VAL_BASE			0x00
>  
>  /* DA9063_REG_ADC_RES_L (addr=0x37) */
> +#define	DA9063_ADC_RES_L_SHIFT			6
>  #define	DA9063_ADC_RES_L_BITS			2
>  #define	DA9063_ADC_RES_L_MASK			0xC0
>  
> @@ -979,6 +983,36 @@
>  #define DA9063_GPIO_DIM				0x80
>  #define DA9063_GPIO_PWM_MASK			0x7F
>  
> +/* DA9063_REG_ADC_CFG (addr=0xC9) */
> +#define DA9063_REG_ADCIN1_CUR_MASK		0x03
> +#define DA9063_REG_ADCIN1_CUR_SHIFT		0
> +#define		DA9063_ADCIN1_CUR_1UA		0x00
> +#define		DA9063_ADCIN1_CUR_2UA		0x01
> +#define		DA9063_ADCIN1_CUR_10UA		0x02
> +#define		DA9063_ADCIN1_CUR_40UA		0x03
> +#define DA9063_REG_ADCIN2_CUR_MASK		0x0C
> +#define DA9063_REG_ADCIN2_CUR_SHIFT		2
> +#define		DA9063_ADCIN2_CUR_1UA		0x00
> +#define		DA9063_ADCIN2_CUR_2UA		0x01
> +#define		DA9063_ADCIN2_CUR_10UA		0x02
> +#define		DA9063_ADCIN2_CUR_40UA		0x03
> +#define DA9063_REG_ADCIN3_CUR_MASK		0x10
> +#define DA9063_REG_ADCIN3_CUR_SHIFT		4
> +#define		DA9063_ADCIN3_CUR_10UA		0x00
> +#define		DA9063_ADCIN3_CUR_40UA		0x01
> +#define DA9063_REG_ADCIN1_DEB_MASK		0x20
> +#define DA9063_REG_ADCIN1_DEB_SHIFT		5
> +#define		DA9063_ADCIN1_DEB_OFF		0x00
> +#define		DA9063_ADCIN1_DEB_ON		0x01
> +#define DA9063_REG_ADCIN2_DEB_MASK		0x40
> +#define DA9063_REG_ADCIN2_DEB_SHIFT		6
> +#define		DA9063_ADCIN2_DEB_OFF		0x00
> +#define		DA9063_ADCIN2_DEB_ON		0x01
> +#define DA9063_REG_ADCIN3_DEB_MASK		0x80
> +#define DA9063_REG_ADCIN3_DEB_SHIFT		7
> +#define		DA9063_ADCIN3_DEB_OFF		0x00
> +#define		DA9063_ADCIN3_DEB_ON		0x01
> +
>  /* DA9063_REG_CONFIG_H (addr=0x10D) */
>  #define DA9063_PWM_CLK_MASK			0x01
>  #define		DA9063_PWM_CLK_PWM2MHZ		0x00

-- 
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] 24+ messages in thread

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  7:52     ` Lee Jones
  0 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  7:52 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

PiBGcm9tOiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNl
bWkuY29tPgo+IAo+IEFkZCB0aGUgSFdNT04gZHJpdmVyIGZvciBEQTkwNjMKPiAKPiBTaWduZWQt
b2ZmLWJ5OiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNl
bWkuY29tPgo+IC0tLQo+IAo+ICBkcml2ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgICAgICAg
fCAgIDEwICsKPiAgZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgMSAr
Cj4gIGRyaXZlcnMvaHdtb24vZGE5MDYzLWh3bW9uLmMgICAgICAgICB8ICA0NTYgKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKwo+ICBpbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcmVn
aXN0ZXJzLmggfCAgIDM0ICsrKwoKSSdkIHByZWZlciB0byBzZWUgYWxsIHZhbHVlcyBpbiBoZXgs
IGJ1dCB0aGlzIHByb2JhYmx5IGEgcHJlZmVyZW5jZQp0aGluZyByYXRoZXIgdGhhbiBzb21ldGhp
bmcgd2hpY2ggd291bGQgcHJldmVudCBhY2NlcHRhbmNlLgoKRm9yIHRoZSBNRkQgaGVhZGVyIGNo
YW5nZXM6CiAgQWNrZWQtYnk6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+Cgo+ICA0
IGZpbGVzIGNoYW5nZWQsIDUwMSBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBk
cml2ZXJzL2h3bW9uL2RhOTA2My1od21vbi5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdt
b24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+IGluZGV4IGYyODhiNjAuLjY4YWE4
ODYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9o
d21vbi9LY29uZmlnCj4gQEAgLTM5MSw2ICszOTEsMTYgQEAgY29uZmlnIFNFTlNPUlNfREE5MDU1
Cj4gIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28s
IHRoZSBtb2R1bGUKPiAgCSAgd2lsbCBiZSBjYWxsZWQgZGE5MDU1LWh3bW9uLgo+ICAKPiArY29u
ZmlnIFNFTlNPUlNfREE5MDYzCj4gKwl0cmlzdGF0ZSAiRGlhbG9nIFNlbWljb25kdWN0b3IgREE5
MDYzIgo+ICsJZGVwZW5kcyBvbiBNRkRfREE5MDYzCj4gKwloZWxwCj4gKwkgIElmIHlvdSBzYXkg
eWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKPiArCSAgbW9uaXRvcmlu
ZyBmZWF0dXJlcyBvZiB0aGUgREE5MDYzIFBvd2VyIE1hbmFnZW1lbnQgSUMuCj4gKwo+ICsJICBU
aGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1
bGUKPiArCSAgd2lsbCBiZSBjYWxsZWQgZGE5MDYzLWh3bW9uLgo+ICsKPiAgY29uZmlnIFNFTlNP
UlNfSTVLX0FNQgo+ICAJdHJpc3RhdGUgIkZCLURJTU0gQU1CIHRlbXBlcmF0dXJlIHNlbnNvciBv
biBJbnRlbCA1MDAwIHNlcmllcyBjaGlwc2V0cyIKPiAgCWRlcGVuZHMgb24gUENJCj4gZGlmZiAt
LWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4g
aW5kZXggYzQ4Zjk4Ny4uNDE3NGIwNyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2h3bW9uL01ha2Vm
aWxlCj4gKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQo+IEBAIC00OSw2ICs0OSw3IEBAIG9i
ai0kKENPTkZJR19TRU5TT1JTX0FUWFAxKQkrPSBhdHhwMS5vCj4gIG9iai0kKENPTkZJR19TRU5T
T1JTX0NPUkVURU1QKQkrPSBjb3JldGVtcC5vCj4gIG9iai0kKENPTkZJR19TRU5TT1JTX0RBOTA1
Ml9BREMpKz0gZGE5MDUyLWh3bW9uLm8KPiAgb2JqLSQoQ09ORklHX1NFTlNPUlNfREE5MDU1KSs9
IGRhOTA1NS1od21vbi5vCj4gK29iai0kKENPTkZJR19TRU5TT1JTX0RBOTA2MykJKz0gZGE5MDYz
LWh3bW9uLm8KPiAgb2JqLSQoQ09ORklHX1NFTlNPUlNfRE1FMTczNykJKz0gZG1lMTczNy5vCj4g
IG9iai0kKENPTkZJR19TRU5TT1JTX0RTNjIwKQkrPSBkczYyMC5vCj4gIG9iai0kKENPTkZJR19T
RU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9k
YTkwNjMtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vZGE5MDYzLWh3bW9uLmMKPiBuZXcgZmlsZSBt
b2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjc3NTZjYjIKPiAtLS0gL2Rldi9udWxsCj4gKysr
IGIvZHJpdmVycy9od21vbi9kYTkwNjMtaHdtb24uYwo+IEBAIC0wLDAgKzEsNDU2IEBACj4gKy8q
IGRhOTA2My1od21vbi5jIC0gSGFyZHdhcmUgbW9uaXRvciBzdXBwb3J0IGZvciBEQTkwNjMKPiAr
ICogQ29weXJpZ2h0IChDKSAyMDE0IERpYWxvZyBTZW1pY29uZHVjdG9yIEx0ZC4KPiArICoKPiAr
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgo+ICsgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYwo+ICsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKPiArICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKPiArICogTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4
L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51
eC9lcnIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9p
bml0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zdHJp
bmcuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8
bGludXgvaHdtb24uaD4KPiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+Cj4gKyNpbmNs
dWRlIDxsaW51eC9yZWdtYXAuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNjMvY29yZS5o
Pgo+ICsjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA2My9wZGF0YS5oPgo+ICsKPiArI2RlZmluZSBE
QTkwNjNfQURDX1JFUwkoMSA8PCAoREE5MDYzX0FEQ19SRVNfTF9CSVRTICsgREE5MDYzX0FEQ19S
RVNfTV9CSVRTKSkKPiArI2RlZmluZSBEQTkwNjNfQURDX01BWAkoREE5MDYzX0FEQ19SRVMgLSAx
KQo+ICsjZGVmaW5lIERBOTA2M18yVjUJMjUwMAo+ICsjZGVmaW5lIERBOTA2M181VjAJNTAwMAo+
ICsjZGVmaW5lIERBOTA2M181VjUJNTUwMAo+ICsjZGVmaW5lIERBOTA2M19USlVOQ19NCS00MjAK
PiArI2RlZmluZSBEQTkwNjNfVEpVTkNfQwktODEyCj4gKyNkZWZpbmUgREE5MDYzX1ZCQkFUX00J
MjA0OAo+ICsKPiArZW51bSBkYTkwNjNfYWRjIHsKPiArCURBOTA2M19DSEFOX1ZTWVMgPSBEQTkw
NjNfQURDX01VWF9WU1lTLAo+ICsJREE5MDYzX0NIQU5fQURDSU4xID0gREE5MDYzX0FEQ19NVVhf
QURDSU4xLAo+ICsJREE5MDYzX0NIQU5fQURDSU4yID0gREE5MDYzX0FEQ19NVVhfQURDSU4yLAo+
ICsJREE5MDYzX0NIQU5fQURDSU4zID0gREE5MDYzX0FEQ19NVVhfQURDSU4zLAo+ICsJREE5MDYz
X0NIQU5fVEpVTkMgPSBEQTkwNjNfQURDX01VWF9UX1NFTlNFLAo+ICsJREE5MDYzX0NIQU5fVkJC
QVQgPSBEQTkwNjNfQURDX01VWF9WQkJBVCwKPiArCURBOTA2M19DSEFOX0xET19HMSA9IERBOTA2
M19BRENfTVVYX0xET19HMSwKPiArCURBOTA2M19DSEFOX0xET19HMiA9IERBOTA2M19BRENfTVVY
X0xET19HMiwKPiArCURBOTA2M19DSEFOX0xET19HMyA9IERBOTA2M19BRENfTVVYX0xET19HMwo+
ICt9Owo+ICsKPiArc3RydWN0IGRhOTA2M19od21vbiB7Cj4gKwlzdHJ1Y3QgZGE5MDYzICpkYTkw
NjM7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpjbGFzc2RldjsKPiArCXN0cnVjdCBtdXRleCBod21vbl9t
dXRleDsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGFkY19yZWFkeTsKPiArCXNpZ25lZCBjaGFyIHRq
dW5jX29mZnNldDsKPiArCWludCBpcnE7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGRhOTA2M19h
ZGNfY29udmVydChzdHJ1Y3QgZGE5MDYzX2h3bW9uICpod21vbiwgaW50IGNoYW5uZWwsCj4gKwkJ
CSAgICAgIGludCAqdmFsdWUpCj4gK3sKPiArCWludCB2YWwgPSAqdmFsdWU7Cj4gKwlpbnQgcmV0
ID0gMDsKPiArCj4gKwlzd2l0Y2ggKGNoYW5uZWwpIHsKPiArCWNhc2UgREE5MDYzX0NIQU5fQURD
SU4xOgo+ICsJY2FzZSBEQTkwNjNfQ0hBTl9BRENJTjI6Cj4gKwljYXNlIERBOTA2M19DSEFOX0FE
Q0lOMzoKPiArCQl2YWwgPSAoREE5MDYzXzJWNSAqIHZhbCkgLyBEQTkwNjNfQURDX01BWDsKPiAr
CQlicmVhazsKPiArCWNhc2UgREE5MDYzX0NIQU5fVlNZUzoKPiArCQl2YWwgPSAoKERBOTA2M181
VjUgLSBEQTkwNjNfMlY1KSAqIHZhbCkgLyBEQTkwNjNfQURDX01BWCArCj4gKwkJCURBOTA2M18y
VjU7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIERBOTA2M19DSEFOX1RKVU5DOgo+ICsJCXZhbCAtPSBo
d21vbi0+dGp1bmNfb2Zmc2V0Owo+ICsJCXZhbCA9IChEQTkwNjNfVEpVTkNfTSAqICh2YWwgKyBE
QTkwNjNfVEpVTkNfQykpID4+IDEwOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEQTkwNjNfQ0hBTl9W
QkJBVDoKPiArCQl2YWwgPSAoREE5MDYzXzVWMCAqIHZhbCkgLyBEQTkwNjNfQURDX01BWDsKPiAr
CQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0ID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycl9j
b252ZXJ0Owo+ICsJfQo+ICsKPiArCSp2YWx1ZSA9IHZhbDsKPiArZXJyX2NvbnZlcnQ6Cj4gKwly
ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRhOTA2M19hZGNfY3VycmVudF9zd2l0
Y2goc3RydWN0IGRhOTA2M19od21vbiAqaHdtb24sIGludCBjaGFubmVsLAo+ICsJCQkJICAgICBi
b29sIG9uKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsJdW5zaWduZWQgaW50IHZhbDsKPiArCXVuc2ln
bmVkIGludCBtYXNrOwo+ICsKPiArCXN3aXRjaCAoY2hhbm5lbCkgewo+ICsJY2FzZSBEQTkwNjNf
Q0hBTl9BRENJTjE6Cj4gKwkJbWFzayA9IERBOTA2M19BRENfQUQxX0lTUkNfRU47Cj4gKwkJYnJl
YWs7Cj4gKwljYXNlIERBOTA2M19DSEFOX0FEQ0lOMjoKPiArCQltYXNrID0gREE5MDYzX0FEQ19B
RDJfSVNSQ19FTjsKPiArCQlicmVhazsKPiArCWNhc2UgREE5MDYzX0NIQU5fQURDSU4zOgo+ICsJ
CW1hc2sgPSBEQTkwNjNfQURDX0FEM19JU1JDX0VOOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoK
PiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXJyX3N3aXRjaDsKPiArCX0KPiArCj4gKwlp
ZiAob24pCj4gKwkJdmFsID0gbWFzazsKPiArCWVsc2UKPiArCQl2YWwgPSB+bWFzazsKPiArCj4g
KwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaHdtb24tPmRhOTA2My0+cmVnbWFwLCBEQTkwNjNf
UkVHX0FEQ19DT05ULAo+ICsJCQkJIG1hc2ssIHZhbCk7Cj4gK2Vycl9zd2l0Y2g6Cj4gKwlyZXR1
cm4gcmV0Owo+ICsKPiArfQo+ICsKPiArc3RhdGljIGludCBkYTkwNjNfYWRjX21hbnVhbF9yZWFk
KHN0cnVjdCBkYTkwNjNfaHdtb24gKmh3bW9uLCBpbnQgY2hhbm5lbCkKPiArewo+ICsJaW50IHJl
dDsKPiArCXVuc2lnbmVkIGNoYXIgdmFsOwo+ICsJdW5zaWduZWQgY2hhciBkYXRhWzJdOwo+ICsJ
aW50IGFkY19tYW47Cj4gKwo+ICsJbXV0ZXhfbG9jaygmaHdtb24tPmh3bW9uX211dGV4KTsKPiAr
Cj4gKwlpbml0X2NvbXBsZXRpb24oJmh3bW9uLT5hZGNfcmVhZHkpOwo+ICsKPiArCXZhbCA9IChj
aGFubmVsICYgREE5MDYzX0FEQ19NVVhfTUFTSykgfCBEQTkwNjNfQURDX01BTjsKPiArCXJldCA9
IHJlZ21hcF91cGRhdGVfYml0cyhod21vbi0+ZGE5MDYzLT5yZWdtYXAsIERBOTA2M19SRUdfQURD
X01BTiwKPiArCQkJCSBEQTkwNjNfQURDX01VWF9NQVNLIHwgREE5MDYzX0FEQ19NQU4sIHZhbCk7
Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlnb3RvIGVycl9tcmVhZDsKPiArCj4gKwlyZXQgPSB3YWl0
X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmh3bW9uLT5hZGNfcmVhZHksCj4gKwkJCQkJICBtc2Vj
c190b19qaWZmaWVzKDEwMDApKTsKPiArCWlmIChyZXQgPT0gMCkgewo+ICsJCXJldCA9IC1FVElN
RURPVVQ7Cj4gKwkJZ290byBlcnJfbXJlYWQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gcmVnbWFwX3Jl
YWQoaHdtb24tPmRhOTA2My0+cmVnbWFwLCBEQTkwNjNfUkVHX0FEQ19NQU4sICZhZGNfbWFuKTsK
PiArCWlmIChyZXQgPCAwKQo+ICsJCWdvdG8gZXJyX21yZWFkOwo+ICsKPiArCS8qIGRhdGEgdmFs
dWUgaXMgbm90IHJlYWR5ICovCj4gKwlpZiAoYWRjX21hbiAmIERBOTA2M19BRENfTUFOID09IDAp
IHsKPiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXJyX21yZWFkOwo+ICsJfQo+ICsKPiAr
CXJldCA9IHJlZ21hcF9idWxrX3JlYWQoaHdtb24tPmRhOTA2My0+cmVnbWFwLAo+ICsJCQkgICAg
ICAgREE5MDYzX1JFR19BRENfUkVTX0wsIGRhdGEsIDIpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJ
Z290byBlcnJfbXJlYWQ7Cj4gKwo+ICsJcmV0ID0gKGRhdGFbMF0gJiBEQTkwNjNfQURDX1JFU19M
X01BU0spID4+IERBOTA2M19BRENfUkVTX0xfU0hJRlQ7Cj4gKwlyZXQgfD0gZGF0YVsxXSA8PCBE
QTkwNjNfQURDX1JFU19MX0JJVFM7Cj4gK2Vycl9tcmVhZDoKPiArCW11dGV4X3VubG9jaygmaHdt
b24tPmh3bW9uX211dGV4KTsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpcnFy
ZXR1cm5fdCBkYTkwNjNfaHdtb25faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqaXJxX2RhdGEp
Cj4gK3sKPiArCXN0cnVjdCBkYTkwNjNfaHdtb24gKmh3bW9uID0gaXJxX2RhdGE7Cj4gKwljb21w
bGV0ZSgmaHdtb24tPmFkY19yZWFkeSk7Cj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gK30KPiAr
Cj4gK3N0YXRpYyBzc2l6ZV90IGRhOTA2M19hZGNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4g
KwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQo+
ICt7Cj4gKwlzdHJ1Y3QgZGE5MDYzX2h3bW9uICpod21vbiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp
Owo+ICsJaW50IGNoYW5uZWwgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4Owo+
ICsJaW50IHZhbDsKPiArCWludCByZXQ7Cj4gKwo+ICsJc3dpdGNoIChjaGFubmVsKSB7Cj4gKwlj
YXNlIERBOTA2M19DSEFOX0FEQ0lOMToKPiArCWNhc2UgREE5MDYzX0NIQU5fQURDSU4yOgo+ICsJ
Y2FzZSBEQTkwNjNfQ0hBTl9BRENJTjM6Cj4gKwkJLyogZmFsbHRocm91Z2ggZm9yIEFEQyBtZWFz
dXJlcyAqLwo+ICsJCXJldCA9IGRhOTA2M19hZGNfY3VycmVudF9zd2l0Y2goaHdtb24sIGNoYW5u
ZWwsIHRydWUpOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlnb3RvIGVycl9yZWFkOwo+ICsKPiAr
CQl2YWwgPSBkYTkwNjNfYWRjX21hbnVhbF9yZWFkKGh3bW9uLCBjaGFubmVsKTsKPiArCQlpZiAo
dmFsIDwgMCkgewo+ICsJCQlyZXQgPSB2YWw7Cj4gKwkJCWlmIChyZXQgPT0gLUVJTlZBTCkKPiAr
CQkJCWRldl9lcnIoZGV2LCAiQ29udmVyc2lvbiB3YXMgbm90IGNvbXBsZXRlZFxuIik7Cj4gKwkJ
CWVsc2UKPiArCQkJCWRldl9lcnIoZGV2LCAiQURDIHJlYWQgZXJyb3IgJWRcbiIsIHJldCk7Cj4g
KwkJCWdvdG8gZXJyX3JlYWQ7Cj4gKwkJfQo+ICsKPiArCQlyZXQgPSBkYTkwNjNfYWRjX2N1cnJl
bnRfc3dpdGNoKGh3bW9uLCBjaGFubmVsLCBmYWxzZSk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiAr
CQkJZGV2X2VycihkZXYsICJDb3VsZCBub3Qgc3dpdGNoIGN1cnJlbnRcbiIpOwo+ICsJCQlnb3Rv
IGVycl9yZWFkOwo+ICsJCX0KPiArCQlicmVhazsKPiArCj4gKwljYXNlIERBOTA2M19DSEFOX1ZT
WVM6Cj4gKwljYXNlIERBOTA2M19DSEFOX1RKVU5DOgo+ICsJY2FzZSBEQTkwNjNfQ0hBTl9WQkJB
VDoKPiArCQkvKiBmYWxsdGhyb3VnaCBmb3IgaW50ZXJuYWwgbWVhc3VyZXMgKi8KPiArCQl2YWwg
PSBkYTkwNjNfYWRjX21hbnVhbF9yZWFkKGh3bW9uLCBjaGFubmVsKTsKPiArCQlpZiAodmFsIDwg
MCkgewo+ICsJCQlkZXZfZXJyKGRldiwgIkFEQyByZWFkIGVycm9yICVkXG4iLCB2YWwpOwo+ICsJ
CQlyZXR1cm4gdmFsOwo+ICsJCX0KPiArCQlicmVhazsKPiArCj4gKwlkZWZhdWx0Ogo+ICsJCS8q
IGVycm9yIGNhc2UgKi8KPiArCQlyZXQgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXJyX3JlYWQ7Cj4g
Kwl9Cj4gKwo+ICsJcmV0ID0gZGE5MDYzX2FkY19jb252ZXJ0KGh3bW9uLCBjaGFubmVsLCAmdmFs
KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29udmVy
dCBBREMgdmFsdWUgJWRcbiIsIHJldCk7Cj4gKwkJZ290byBlcnJfcmVhZDsKPiArCX0KPiArCj4g
KwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKPiArZXJyX3JlYWQ6Cj4gKwlyZXR1
cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBkYTkwNjNfc2hvd19uYW1lKHN0cnVj
dCBkZXZpY2UgKmRldiwKPiArCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFy
ICpidWYpCj4gK3sKPiArCXJldHVybiBzcHJpbnRmKGJ1ZiwgREE5MDYzX0RSVk5BTUVfSFdNT04g
IlxuIik7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGRhOTA2M19zaG93X2xhYmVsKHN0cnVj
dCBkZXZpY2UgKmRldiwKPiArCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwg
Y2hhciAqYnVmKQo+ICt7Cj4gKwlpbnQgY2hhbm5lbCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZh
dHRyKS0+aW5kZXg7Cj4gKwljaGFyICpsYWJlbDsKPiArCj4gKwlzd2l0Y2ggKGNoYW5uZWwpIHsK
PiArCWNhc2UgREE5MDYzX0NIQU5fVlNZUzoKPiArCQlsYWJlbCA9ICJWU1lTIjsKPiArCQlicmVh
azsKPiArCWNhc2UgREE5MDYzX0NIQU5fQURDSU4xOgo+ICsJCWxhYmVsID0gIkFEQ0lOMSI7Cj4g
KwkJYnJlYWs7Cj4gKwljYXNlIERBOTA2M19DSEFOX0FEQ0lOMjoKPiArCQlsYWJlbCA9ICJBRENJ
TjIiOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEQTkwNjNfQ0hBTl9BRENJTjM6Cj4gKwkJbGFiZWwg
PSAiQURDSU4zIjsKPiArCQlicmVhazsKPiArCWNhc2UgREE5MDYzX0NIQU5fVEpVTkM6Cj4gKwkJ
bGFiZWwgPSAiVEpVTkMiOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEQTkwNjNfQ0hBTl9WQkJBVDoK
PiArCQlsYWJlbCA9ICJWQkJBVCI7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCWxhYmVs
ID0gIlVOS05PV04iOwo+ICsJfQo+ICsKPiArCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBs
YWJlbCk7Cj4gK30KPiArCj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2lucHV0LCBT
X0lSVUdPLAo+ICsJCQkgIGRhOTA2M19hZGNfcmVhZCwgTlVMTCwgREE5MDYzX0NIQU5fVlNZUyk7
Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2xhYmVsLCBTX0lSVUdPLAo+ICsJCQkg
IGRhOTA2M19zaG93X2xhYmVsLCBOVUxMLCBEQTkwNjNfQ0hBTl9WU1lTKTsKPiArCj4gK3N0YXRp
YyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLAo+ICsJCQkgIGRhOTA2M19h
ZGNfcmVhZCwgTlVMTCwgREE5MDYzX0NIQU5fQURDSU4xKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJ
Q0VfQVRUUihpbjFfbGFiZWwsIFNfSVJVR08sCj4gKwkJCSAgZGE5MDYzX3Nob3dfbGFiZWwsIE5V
TEwsIERBOTA2M19DSEFOX0FEQ0lOMSk7Cj4gKwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS
KGluMl9pbnB1dCwgU19JUlVHTywKPiArCQkJICBkYTkwNjNfYWRjX3JlYWQsIE5VTEwsIERBOTA2
M19DSEFOX0FEQ0lOMik7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2xhYmVsLCBT
X0lSVUdPLAo+ICsJCQkgIGRhOTA2M19zaG93X2xhYmVsLCBOVUxMLCBEQTkwNjNfQ0hBTl9BRENJ
TjIpOwo+ICsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08s
Cj4gKwkJCSAgZGE5MDYzX2FkY19yZWFkLCBOVUxMLCBEQTkwNjNfQ0hBTl9BRENJTjMpOwo+ICtz
dGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19sYWJlbCwgU19JUlVHTywKPiArCQkJICBkYTkw
NjNfc2hvd19sYWJlbCwgTlVMTCwgREE5MDYzX0NIQU5fQURDSU4zKTsKPiArCj4gK3N0YXRpYyBT
RU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLAo+ICsJCQkgIGRhOTA2M19hZGNf
cmVhZCwgTlVMTCwgREE5MDYzX0NIQU5fVkJCQVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9B
VFRSKGluNF9sYWJlbCwgU19JUlVHTywKPiArCQkJICBkYTkwNjNfc2hvd19sYWJlbCwgTlVMTCwg
REE5MDYzX0NIQU5fVkJCQVQpOwo+ICsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1w
MV9pbnB1dCwgU19JUlVHTywKPiArCQkJICBkYTkwNjNfYWRjX3JlYWQsIE5VTEwsIERBOTA2M19D
SEFOX1RKVU5DKTsKPiArCj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWws
IFNfSVJVR08sCj4gKwkJCSAgZGE5MDYzX3Nob3dfbGFiZWwsIE5VTEwsIERBOTA2M19DSEFOX1RK
VU5DKTsKPiArCj4gK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBkYTkwNjNfc2hv
d19uYW1lLCBOVUxMKTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkYTkwNjNfYXR0
cmlidXRlc1tdID0gewo+ICsJJmRldl9hdHRyX25hbWUuYXR0ciwKPiArCSZzZW5zb3JfZGV2X2F0
dHJfaW4wX2lucHV0LmRldl9hdHRyLmF0dHIsCj4gKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9sYWJl
bC5kZXZfYXR0ci5hdHRyLAo+ICsJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIu
YXR0ciwKPiArCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2xhYmVsLmRldl9hdHRyLmF0dHIsCj4gKwkm
c2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAo+ICsJJnNlbnNvcl9kZXZf
YXR0cl9pbjJfbGFiZWwuZGV2X2F0dHIuYXR0ciwKPiArCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2lu
cHV0LmRldl9hdHRyLmF0dHIsCj4gKwkmc2Vuc29yX2Rldl9hdHRyX2luM19sYWJlbC5kZXZfYXR0
ci5hdHRyLAo+ICsJJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKPiAr
CSZzZW5zb3JfZGV2X2F0dHJfaW40X2xhYmVsLmRldl9hdHRyLmF0dHIsCj4gKwkmc2Vuc29yX2Rl
dl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCj4gKwkmc2Vuc29yX2Rldl9hdHRyX3Rl
bXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCj4gKwlOVUxMCj4gK307Cj4gKwo+ICtzdGF0aWMgY29u
c3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkYTkwNjNfYXR0cl9ncm91cCA9IHsKPiArCS5hdHRy
cyA9IGRhOTA2M19hdHRyaWJ1dGVzLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBkYTkwNjNfaHdt
b25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGRh
OTA2MyAqZGE5MDYzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwo+ICsJc3Ry
dWN0IGRhOTA2M19wZGF0YSAqcGRhdGEgPSBkYTkwNjMtPmRldi0+cGxhdGZvcm1fZGF0YTsKPiAr
CXN0cnVjdCBkYTkwNjNfaHdtb24gKmh3bW9uOwo+ICsJaW50IHJldDsKPiArCXVuc2lnbmVkIGlu
dCB2YWw7Cj4gKwo+ICsJaHdtb24gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0
cnVjdCBkYTkwNjNfaHdtb24pLAo+ICsJCQkgICAgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFod21v
bikKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwltdXRleF9pbml0KCZod21vbi0+aHdtb25f
bXV0ZXgpOwo+ICsJaW5pdF9jb21wbGV0aW9uKCZod21vbi0+YWRjX3JlYWR5KTsKPiArCWh3bW9u
LT5kYTkwNjMgPSBkYTkwNjM7Cj4gKwo+ICsJLyogZW5hYmxlIHRoZSBBREMgZnVuY3Rpb25zIGZv
ciBHUElPIDAsMSwyICovCj4gKwl2YWwgPSAoREE5MDYzX0dQSU8wX1BJTl9BRENJTjEgPDwgREE5
MDYzX0dQSU8wX1BJTl9NQVNLX1NISUZUIHwKPiArCSAgICAgICBEQTkwNjNfR1BJTzFfUElOX0FE
Q0lOMl9DT01QIDw8IERBOTA2M19HUElPMV9QSU5fTUFTS19TSElGVCk7Cj4gKwlyZXQgPSByZWdt
YXBfdXBkYXRlX2JpdHMoaHdtb24tPmRhOTA2My0+cmVnbWFwLCBEQTkwNjNfUkVHX0dQSU9fMF8x
LAo+ICsJCQkJIChEQTkwNjNfR1BJTzBfUElOX01BU0sgfAo+ICsJCQkJICBEQTkwNjNfR1BJTzFf
UElOX01BU0spLCB2YWwpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKCZwZGV2LT5k
ZXYsCj4gKwkJCSJGYWlsZWQgdG8gYWx0ZXIgdGhlIEFEQ0lOIDEsMiBiaXRzIGZvciB0aGUgR1BJ
TyAwLDEgcmVnaXN0ZXJcbiIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQo+ICsKPiArCXZhbCA9
IERBOTA2M19HUElPMl9QSU5fQURDSU4zIDw8IERBOTA2M19HUElPMl9QSU5fTUFTS19TSElGVDsK
PiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhod21vbi0+ZGE5MDYzLT5yZWdtYXAsIERBOTA2
M19SRUdfR1BJT18yXzMsCj4gKwkJCQkgREE5MDYzX0dQSU8yX1BJTl9NQVNLLCB2YWwpOwo+ICsJ
aWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsCj4gKwkJCSJGYWlsZWQgdG8g
YWx0ZXIgdGhlIEFEQ0lOIDMgYml0cyBmb3IgdGhlIEdQSU8gMiwzIHJlZ2lzdGVyXG4iKTsKPiAr
CQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwkvKiBkZWJvdW5jZSBBREMgSSBzZXR0aW5ncyAq
Lwo+ICsJdmFsID0gKERBOTA2M19BRENJTjFfREVCX09OIDw8IERBOTA2M19SRUdfQURDSU4xX0RF
Ql9TSElGVCB8Cj4gKwkgICAgICAgREE5MDYzX0FEQ0lOMl9ERUJfT04gPDwgREE5MDYzX1JFR19B
RENJTjJfREVCX1NISUZUIHwKPiArCSAgICAgICBEQTkwNjNfQURDSU4zX0RFQl9PTiA8PCBEQTkw
NjNfUkVHX0FEQ0lOM19ERUJfU0hJRlQpOwo+ICsJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGh3
bW9uLT5kYTkwNjMtPnJlZ21hcCwgREE5MDYzX1JFR19BRENfQ0ZHLAo+ICsJCQkJIChEQTkwNjNf
UkVHX0FEQ0lOMV9ERUJfTUFTSyB8Cj4gKwkJCQkgIERBOTA2M19SRUdfQURDSU4yX0RFQl9NQVNL
IHwKPiArCQkJCSAgREE5MDYzX1JFR19BRENJTjNfREVCX01BU0spLCB2YWwpOwo+ICsJaWYgKHJl
dCA8IDApIHsKPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsCj4gKwkJCSJGYWlsZWQgdG8gYWx0ZXIg
dGhlIEFEQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyXG4iKTsKPiArCQlyZXR1cm4gLUVJTzsKPiAr
CX0KPiArCj4gKwkvKiBzZXQgdXAgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbnMgKi8KPiArCXZh
bCA9IChwZGF0YS0+aHdtb25fcGRhdGEtPmFkY2luMV9jdXIgPDwgREE5MDYzX1JFR19BRENJTjFf
Q1VSX1NISUZUIHwKPiArCSAgICAgICBwZGF0YS0+aHdtb25fcGRhdGEtPmFkY2luMl9jdXIgPDwg
REE5MDYzX1JFR19BRENJTjJfQ1VSX1NISUZUIHwKPiArCSAgICAgICBwZGF0YS0+aHdtb25fcGRh
dGEtPmFkY2luM19jdXIgPDwgREE5MDYzX1JFR19BRENJTjNfQ1VSX1NISUZUKTsKPiArCXJldCA9
IHJlZ21hcF91cGRhdGVfYml0cyhod21vbi0+ZGE5MDYzLT5yZWdtYXAsIERBOTA2M19SRUdfQURD
X0NGRywKPiArCQkJCSAoREE5MDYzX1JFR19BRENJTjFfQ1VSX01BU0sgfAo+ICsJCQkJICBEQTkw
NjNfUkVHX0FEQ0lOMl9DVVJfTUFTSyB8Cj4gKwkJCQkgIERBOTA2M19SRUdfQURDSU4zX0NVUl9N
QVNLKSwgdmFsKTsKPiArCj4gKwlyZXQgPSByZWdtYXBfcmVhZChkYTkwNjMtPnJlZ21hcCwgREE5
MDYzX1JFR19BRENfQ0ZHLCAmdmFsKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJZGV2X2Vycigm
cGRldi0+ZGV2LAo+ICsJCQkiRmFpbGVkIHRvIHJlYWQgcmVhZCB0aGUgQURDIGNvbmZpZ3VyYXRp
b24gcmVnaXN0ZXJcbiIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQo+ICsKPiArCWh3bW9uLT5p
cnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBEQTkwNjNfRFJWTkFNRV9IV01PTik7
Cj4gKwlpZiAoaHdtb24tPmlycSA8IDApCj4gKwkJcmV0dXJuIGh3bW9uLT5pcnE7Cj4gKwo+ICsJ
cmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBod21vbi0+aXJxLCBO
VUxMLAo+ICsJCQkJCWRhOTA2M19od21vbl9pcnFfaGFuZGxlciwKPiArCQkJCQlJUlFGX1RSSUdH
RVJfTE9XIHwgSVJRRl9PTkVTSE9ULAo+ICsJCQkJCSJIV01PTiIsIGh3bW9uKTsKPiArCWlmIChy
ZXQpIHsKPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEuXG4i
KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBk
ZXYsIGh3bW9uKTsKPiArCj4gKwkvKiBzZXQgdHJpbSB0ZW1wZXJhdHVyZSBvZmZzZXQgdG8gdmFs
dWUgcmVhZCBhdCBzdGFydHVwICovCj4gKwlod21vbi0+dGp1bmNfb2Zmc2V0ID0gKHNpZ25lZCBj
aGFyKWh3bW9uLT5kYTkwNjMtPnRfb2Zmc2V0Owo+ICsKPiArCXJldCA9IHN5c2ZzX2NyZWF0ZV9n
cm91cCgmcGRldi0+ZGV2LmtvYmosICZkYTkwNjNfYXR0cl9ncm91cCk7Cj4gKwlpZiAocmV0KQo+
ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaHdtb24tPmNsYXNzZGV2ID0gaHdtb25fZGV2aWNlX3Jl
Z2lzdGVyKCZwZGV2LT5kZXYpOwo+ICsJaWYgKElTX0VSUihod21vbi0+Y2xhc3NkZXYpKSB7Cj4g
KwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmRhOTA2M19hdHRyX2dyb3Vw
KTsKPiArCQlyZXR1cm4gUFRSX0VSUihod21vbi0+Y2xhc3NkZXYpOwo+ICsJfQo+ICsKPiArCXJl
dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRhOTA2M19od21vbl9yZW1vdmUoc3RydWN0
IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGRhOTA2M19od21vbiAqaHdt
b24gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiArCj4gKwlod21vbl9kZXZpY2VfdW5y
ZWdpc3Rlcihod21vbi0+Y2xhc3NkZXYpOwo+ICsJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5k
ZXYua29iaiwgJmRhOTA2M19hdHRyX2dyb3VwKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK
PiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGE5MDYzX2h3bW9uX2RyaXZlciA9IHsK
PiArCS5wcm9iZSA9IGRhOTA2M19od21vbl9wcm9iZSwKPiArCS5yZW1vdmUgPSBkYTkwNjNfaHdt
b25fcmVtb3ZlLAo+ICsJLmRyaXZlciA9IHsKPiArCQkgICAubmFtZSA9IERBOTA2M19EUlZOQU1F
X0hXTU9OLAo+ICsJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAo+ICsJCSAgIH0sCj4gK307Cj4g
Kwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRhOTA2M19od21vbl9kcml2ZXIpOwo+ICsKPiAr
TU9EVUxFX0RFU0NSSVBUSU9OKCJIYXJkd2FyZSBtb25pdG9yIHN1cHBvcnQgZGV2aWNlIGRyaXZl
ciBmb3IgRGlhbG9nIERBOTA2MyIpOwo+ICtNT0RVTEVfQVVUSE9SKCJTIFR3aXNzIDxzdHdpc3Mu
b3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4iKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+
ICtNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgREE5MDYzX0RSVk5BTUVfSFdNT04pOwo+IGRpZmYg
LS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcmVnaXN0ZXJzLmggYi9pbmNsdWRlL2xp
bnV4L21mZC9kYTkwNjMvcmVnaXN0ZXJzLmgKPiBpbmRleCAwOWE4NWM2Li45MjIzNzFiIDEwMDY0
NAo+IC0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9yZWdpc3RlcnMuaAo+ICsrKyBiL2lu
Y2x1ZGUvbGludXgvbWZkL2RhOTA2My9yZWdpc3RlcnMuaAo+IEBAIC00NzQsNiArNDc0LDcgQEAK
PiAgCj4gIC8qIERBOTA2M19SRUdfR1BJT18wXzEgKGFkZHI9MHgxNSkgKi8KPiAgI2RlZmluZQlE
QTkwNjNfR1BJTzBfUElOX01BU0sJCQkweDAzCj4gKyNkZWZpbmUJREE5MDYzX0dQSU8wX1BJTl9N
QVNLX1NISUZUCQkwCj4gICNkZWZpbmUJCURBOTA2M19HUElPMF9QSU5fQURDSU4xCQkweDAwCj4g
ICNkZWZpbmUJCURBOTA2M19HUElPMF9QSU5fR1BJCQkweDAxCj4gICNkZWZpbmUJCURBOTA2M19H
UElPMF9QSU5fR1BPX09ECQkweDAyCj4gQEAgLTQ4NSw2ICs0ODYsNyBAQAo+ICAjZGVmaW5lCQlE
QTkwNjNfR1BJTzBfVFlQRV9HUE9fVkREX0lPMgkweDA0Cj4gICNkZWZpbmUJREE5MDYzX0dQSU8w
X05PX1dBS0VVUAkJCTB4MDgKPiAgI2RlZmluZQlEQTkwNjNfR1BJTzFfUElOX01BU0sJCQkweDMw
Cj4gKyNkZWZpbmUJREE5MDYzX0dQSU8xX1BJTl9NQVNLX1NISUZUCQk0Cj4gICNkZWZpbmUJCURB
OTA2M19HUElPMV9QSU5fQURDSU4yX0NPTVAJMHgwMAo+ICAjZGVmaW5lCQlEQTkwNjNfR1BJTzFf
UElOX0dQSQkJMHgxMAo+ICAjZGVmaW5lCQlEQTkwNjNfR1BJTzFfUElOX0dQT19PRAkJMHgyMAo+
IEBAIC00OTgsNiArNTAwLDcgQEAKPiAgCj4gIC8qIERBOTA2M19SRUdfR1BJT18yXzMgKGFkZHI9
MHgxNikgKi8KPiAgI2RlZmluZQlEQTkwNjNfR1BJTzJfUElOX01BU0sJCQkweDAzCj4gKyNkZWZp
bmUJREE5MDYzX0dQSU8yX1BJTl9NQVNLX1NISUZUCQkwCj4gICNkZWZpbmUJCURBOTA2M19HUElP
Ml9QSU5fQURDSU4zCQkweDAwCj4gICNkZWZpbmUJCURBOTA2M19HUElPMl9QSU5fR1BJCQkweDAx
Cj4gICNkZWZpbmUJCURBOTA2M19HUElPMl9QSU5fR1BPX1BTUwkweDAyCj4gQEAgLTgxMyw2ICs4
MTYsNyBAQAo+ICAjZGVmaW5lCURBOTA2M19WU1lTX1ZBTF9CQVNFCQkJMHgwMAo+ICAKPiAgLyog
REE5MDYzX1JFR19BRENfUkVTX0wgKGFkZHI9MHgzNykgKi8KPiArI2RlZmluZQlEQTkwNjNfQURD
X1JFU19MX1NISUZUCQkJNgo+ICAjZGVmaW5lCURBOTA2M19BRENfUkVTX0xfQklUUwkJCTIKPiAg
I2RlZmluZQlEQTkwNjNfQURDX1JFU19MX01BU0sJCQkweEMwCj4gIAo+IEBAIC05NzksNiArOTgz
LDM2IEBACj4gICNkZWZpbmUgREE5MDYzX0dQSU9fRElNCQkJCTB4ODAKPiAgI2RlZmluZSBEQTkw
NjNfR1BJT19QV01fTUFTSwkJCTB4N0YKPiAgCj4gKy8qIERBOTA2M19SRUdfQURDX0NGRyAoYWRk
cj0weEM5KSAqLwo+ICsjZGVmaW5lIERBOTA2M19SRUdfQURDSU4xX0NVUl9NQVNLCQkweDAzCj4g
KyNkZWZpbmUgREE5MDYzX1JFR19BRENJTjFfQ1VSX1NISUZUCQkwCj4gKyNkZWZpbmUJCURBOTA2
M19BRENJTjFfQ1VSXzFVQQkJMHgwMAo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4xX0NVUl8yVUEJ
CTB4MDEKPiArI2RlZmluZQkJREE5MDYzX0FEQ0lOMV9DVVJfMTBVQQkJMHgwMgo+ICsjZGVmaW5l
CQlEQTkwNjNfQURDSU4xX0NVUl80MFVBCQkweDAzCj4gKyNkZWZpbmUgREE5MDYzX1JFR19BRENJ
TjJfQ1VSX01BU0sJCTB4MEMKPiArI2RlZmluZSBEQTkwNjNfUkVHX0FEQ0lOMl9DVVJfU0hJRlQJ
CTIKPiArI2RlZmluZQkJREE5MDYzX0FEQ0lOMl9DVVJfMVVBCQkweDAwCj4gKyNkZWZpbmUJCURB
OTA2M19BRENJTjJfQ1VSXzJVQQkJMHgwMQo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4yX0NVUl8x
MFVBCQkweDAyCj4gKyNkZWZpbmUJCURBOTA2M19BRENJTjJfQ1VSXzQwVUEJCTB4MDMKPiArI2Rl
ZmluZSBEQTkwNjNfUkVHX0FEQ0lOM19DVVJfTUFTSwkJMHgxMAo+ICsjZGVmaW5lIERBOTA2M19S
RUdfQURDSU4zX0NVUl9TSElGVAkJNAo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4zX0NVUl8xMFVB
CQkweDAwCj4gKyNkZWZpbmUJCURBOTA2M19BRENJTjNfQ1VSXzQwVUEJCTB4MDEKPiArI2RlZmlu
ZSBEQTkwNjNfUkVHX0FEQ0lOMV9ERUJfTUFTSwkJMHgyMAo+ICsjZGVmaW5lIERBOTA2M19SRUdf
QURDSU4xX0RFQl9TSElGVAkJNQo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4xX0RFQl9PRkYJCTB4
MDAKPiArI2RlZmluZQkJREE5MDYzX0FEQ0lOMV9ERUJfT04JCTB4MDEKPiArI2RlZmluZSBEQTkw
NjNfUkVHX0FEQ0lOMl9ERUJfTUFTSwkJMHg0MAo+ICsjZGVmaW5lIERBOTA2M19SRUdfQURDSU4y
X0RFQl9TSElGVAkJNgo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4yX0RFQl9PRkYJCTB4MDAKPiAr
I2RlZmluZQkJREE5MDYzX0FEQ0lOMl9ERUJfT04JCTB4MDEKPiArI2RlZmluZSBEQTkwNjNfUkVH
X0FEQ0lOM19ERUJfTUFTSwkJMHg4MAo+ICsjZGVmaW5lIERBOTA2M19SRUdfQURDSU4zX0RFQl9T
SElGVAkJNwo+ICsjZGVmaW5lCQlEQTkwNjNfQURDSU4zX0RFQl9PRkYJCTB4MDAKPiArI2RlZmlu
ZQkJREE5MDYzX0FEQ0lOM19ERUJfT04JCTB4MDEKPiArCj4gIC8qIERBOTA2M19SRUdfQ09ORklH
X0ggKGFkZHI9MHgxMEQpICovCj4gICNkZWZpbmUgREE5MDYzX1BXTV9DTEtfTUFTSwkJCTB4MDEK
PiAgI2RlZmluZQkJREE5MDYzX1BXTV9DTEtfUFdNMk1IWgkJMHgwMAoKLS0gCkxlZSBKb25lcwpM
aW5hcm8gU1RNaWNyb2VsZWN0cm9uaWNzIExhbmRpbmcgVGVhbSBMZWFkCkxpbmFyby5vcmcg4pSC
IE9wZW4gc291cmNlIHNvZnR3YXJlIGZvciBBUk0gU29DcwpGb2xsb3cgTGluYXJvOiBGYWNlYm9v
ayB8IFR3aXR0ZXIgfCBCbG9nCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMu
b3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNv
cnM

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

* Re: [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
  2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-24  8:02     ` Lee Jones
  -1 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  8:02 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Samuel Ortiz, David Dajun Chen, Guenter Roeck, Jean Delvare,
	LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel,
	Rob Landley

On Sun, 23 Mar 2014, Opensource [Steve Twiss] wrote:

> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> 
> Dependencies required for DA9063 HWMON support.
> 
> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
> ---
> 
>  drivers/mfd/da9063-core.c        |   13 ++++++++++++-
>  include/linux/mfd/da9063/core.h  |    3 +++
>  include/linux/mfd/da9063/pdata.h |   18 ++++++++++++++++++
>  3 files changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
> index e70ae31..24c1838 100644
> --- a/drivers/mfd/da9063-core.c
> +++ b/drivers/mfd/da9063-core.c
> @@ -111,6 +111,7 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
>  {
>  	struct da9063_pdata *pdata = da9063->dev->platform_data;
>  	int model, variant_id, variant_code;
> +	int t_offset = 0;
>  	int ret;
>  
>  	if (pdata) {
> @@ -171,8 +172,18 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
>  	ret = mfd_add_devices(da9063->dev, -1, da9063_devs,
>  			      ARRAY_SIZE(da9063_devs), NULL, da9063->irq_base,
>  			      NULL);
> -	if (ret)
> +	if (ret) {
>  		dev_err(da9063->dev, "Cannot add MFD cells\n");
> +		return ret;
> +	}
> +
> +	ret = regmap_read(da9063->regmap, DA9063_REG_T_OFFSET, &t_offset);
> +	if (ret < 0)
> +		dev_warn(da9063->dev,
> +			 "Temperature trimming value cannot be read (defaulting to 0)\n");
> +
> +	/* pass this on to the hwmon driver */
> +	da9063->t_offset = t_offset;

What's the logic for using a local variable for this prior to setting
the attribute in the shared container?

>  	return ret;
>  }
> diff --git a/include/linux/mfd/da9063/core.h b/include/linux/mfd/da9063/core.h
> index 00a9aac..7327d37 100644
> --- a/include/linux/mfd/da9063/core.h
> +++ b/include/linux/mfd/da9063/core.h
> @@ -86,6 +86,9 @@ struct da9063 {
>  	int		chip_irq;
>  	unsigned int	irq_base;
>  	struct regmap_irq_chip_data *regmap_irq;
> +
> +	/* Trimming */
> +	int		t_offset;
>  };
>  
>  int da9063_device_init(struct da9063 *da9063, unsigned int irq);
> diff --git a/include/linux/mfd/da9063/pdata.h b/include/linux/mfd/da9063/pdata.h
> index 95c8742..576033e 100644
> --- a/include/linux/mfd/da9063/pdata.h
> +++ b/include/linux/mfd/da9063/pdata.h
> @@ -62,6 +62,23 @@ struct da9063_regulators_pdata {
>  	struct da9063_regulator_data	*regulator_data;
>  };
>  
> +/* HWMON platform data */
> +#define DA9063_SET_ADCIN1_CUR_1UA	0x00
> +#define DA9063_SET_ADCIN1_CUR_2UA	0x01
> +#define DA9063_SET_ADCIN1_CUR_10UA	0x02
> +#define DA9063_SET_ADCIN1_CUR_40UA	0x03
> +#define DA9063_SET_ADCIN2_CUR_1UA	0x00
> +#define DA9063_SET_ADCIN2_CUR_2UA	0x01
> +#define DA9063_SET_ADCIN2_CUR_10UA	0x02
> +#define DA9063_SET_ADCIN2_CUR_40UA	0x03
> +#define DA9063_SET_ADCIN3_CUR_10UA	0x00

Why differentiate? More succinctly:

/* HWMON platform data */
#define DA9063_SET_CUR_1UA	0x00
#define DA9063_SET_CUR_2UA	0x01
#define DA9063_SET_CUR_10UA	0x02
#define DA9063_SET_CUR_40UA	0x03


> +struct da9063_hwmon_pdata {
> +	unsigned char adcin1_cur;
> +	unsigned char adcin2_cur;
> +	unsigned char adcin3_cur;
> +};
> +
>  

Now there are two new lines here.

>  /*
>   * RGB LED configuration
> @@ -106,6 +123,7 @@ struct da9063_pdata {
>  	unsigned			flags;
>  	struct da9063_regulators_pdata	*regulators_pdata;
>  	struct led_platform_data	*leds_pdata;
> +	struct da9063_hwmon_pdata	*hwmon_pdata;
>  };

Does this device support Device Tree?

>  #endif	/* __MFD_DA9063_PDATA_H__ */

-- 
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] 24+ messages in thread

* Re: [lm-sensors] [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
@ 2014-03-24  8:02     ` Lee Jones
  0 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  8:02 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Samuel Ortiz, David Dajun Chen, Guenter Roeck, Jean Delvare,
	LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel,
	Rob Landley

T24gU3VuLCAyMyBNYXIgMjAxNCwgT3BlbnNvdXJjZSBbU3RldmUgVHdpc3NdIHdyb3RlOgoKPiBG
cm9tOiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNlbWku
Y29tPgo+IAo+IERlcGVuZGVuY2llcyByZXF1aXJlZCBmb3IgREE5MDYzIEhXTU9OIHN1cHBvcnQu
Cj4gCj4gU2lnbmVkLW9mZi1ieTogT3BlbnNvdXJjZSBbU3RldmUgVHdpc3NdIDxzdHdpc3Mub3Bl
bnNvdXJjZUBkaWFzZW1pLmNvbT4KPiAtLS0KPiAKPiAgZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUu
YyAgICAgICAgfCAgIDEzICsrKysrKysrKysrKy0KPiAgaW5jbHVkZS9saW51eC9tZmQvZGE5MDYz
L2NvcmUuaCAgfCAgICAzICsrKwo+ICBpbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcGRhdGEuaCB8
ICAgMTggKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMzMgaW5zZXJ0aW9u
cygrKSwgMSBkZWxldGlvbigtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYTkwNjMt
Y29yZS5jIGIvZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUuYwo+IGluZGV4IGU3MGFlMzEuLjI0YzE4
MzggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUuYwo+ICsrKyBiL2RyaXZl
cnMvbWZkL2RhOTA2My1jb3JlLmMKPiBAQCAtMTExLDYgKzExMSw3IEBAIGludCBkYTkwNjNfZGV2
aWNlX2luaXQoc3RydWN0IGRhOTA2MyAqZGE5MDYzLCB1bnNpZ25lZCBpbnQgaXJxKQo+ICB7Cj4g
IAlzdHJ1Y3QgZGE5MDYzX3BkYXRhICpwZGF0YSA9IGRhOTA2My0+ZGV2LT5wbGF0Zm9ybV9kYXRh
Owo+ICAJaW50IG1vZGVsLCB2YXJpYW50X2lkLCB2YXJpYW50X2NvZGU7Cj4gKwlpbnQgdF9vZmZz
ZXQgPSAwOwo+ICAJaW50IHJldDsKPiAgCj4gIAlpZiAocGRhdGEpIHsKPiBAQCAtMTcxLDggKzE3
MiwxOCBAQCBpbnQgZGE5MDYzX2RldmljZV9pbml0KHN0cnVjdCBkYTkwNjMgKmRhOTA2MywgdW5z
aWduZWQgaW50IGlycSkKPiAgCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhkYTkwNjMtPmRldiwgLTEs
IGRhOTA2M19kZXZzLAo+ICAJCQkgICAgICBBUlJBWV9TSVpFKGRhOTA2M19kZXZzKSwgTlVMTCwg
ZGE5MDYzLT5pcnFfYmFzZSwKPiAgCQkJICAgICAgTlVMTCk7Cj4gLQlpZiAocmV0KQo+ICsJaWYg
KHJldCkgewo+ICAJCWRldl9lcnIoZGE5MDYzLT5kZXYsICJDYW5ub3QgYWRkIE1GRCBjZWxsc1xu
Iik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXQgPSByZWdtYXBfcmVhZChkYTkw
NjMtPnJlZ21hcCwgREE5MDYzX1JFR19UX09GRlNFVCwgJnRfb2Zmc2V0KTsKPiArCWlmIChyZXQg
PCAwKQo+ICsJCWRldl93YXJuKGRhOTA2My0+ZGV2LAo+ICsJCQkgIlRlbXBlcmF0dXJlIHRyaW1t
aW5nIHZhbHVlIGNhbm5vdCBiZSByZWFkIChkZWZhdWx0aW5nIHRvIDApXG4iKTsKPiArCj4gKwkv
KiBwYXNzIHRoaXMgb24gdG8gdGhlIGh3bW9uIGRyaXZlciAqLwo+ICsJZGE5MDYzLT50X29mZnNl
dCA9IHRfb2Zmc2V0OwoKV2hhdCdzIHRoZSBsb2dpYyBmb3IgdXNpbmcgYSBsb2NhbCB2YXJpYWJs
ZSBmb3IgdGhpcyBwcmlvciB0byBzZXR0aW5nCnRoZSBhdHRyaWJ1dGUgaW4gdGhlIHNoYXJlZCBj
b250YWluZXI/Cgo+ICAJcmV0dXJuIHJldDsKPiAgfQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xp
bnV4L21mZC9kYTkwNjMvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL2NvcmUuaAo+
IGluZGV4IDAwYTlhYWMuLjczMjdkMzcgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9tZmQv
ZGE5MDYzL2NvcmUuaAo+ICsrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9jb3JlLmgKPiBA
QCAtODYsNiArODYsOSBAQCBzdHJ1Y3QgZGE5MDYzIHsKPiAgCWludAkJY2hpcF9pcnE7Cj4gIAl1
bnNpZ25lZCBpbnQJaXJxX2Jhc2U7Cj4gIAlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKnJl
Z21hcF9pcnE7Cj4gKwo+ICsJLyogVHJpbW1pbmcgKi8KPiArCWludAkJdF9vZmZzZXQ7Cj4gIH07
Cj4gIAo+ICBpbnQgZGE5MDYzX2RldmljZV9pbml0KHN0cnVjdCBkYTkwNjMgKmRhOTA2MywgdW5z
aWduZWQgaW50IGlycSk7Cj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9w
ZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3BkYXRhLmgKPiBpbmRleCA5NWM4NzQy
Li41NzYwMzNlIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9wZGF0YS5o
Cj4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3BkYXRhLmgKPiBAQCAtNjIsNiArNjIs
MjMgQEAgc3RydWN0IGRhOTA2M19yZWd1bGF0b3JzX3BkYXRhIHsKPiAgCXN0cnVjdCBkYTkwNjNf
cmVndWxhdG9yX2RhdGEJKnJlZ3VsYXRvcl9kYXRhOwo+ICB9Owo+ICAKPiArLyogSFdNT04gcGxh
dGZvcm0gZGF0YSAqLwo+ICsjZGVmaW5lIERBOTA2M19TRVRfQURDSU4xX0NVUl8xVUEJMHgwMAo+
ICsjZGVmaW5lIERBOTA2M19TRVRfQURDSU4xX0NVUl8yVUEJMHgwMQo+ICsjZGVmaW5lIERBOTA2
M19TRVRfQURDSU4xX0NVUl8xMFVBCTB4MDIKPiArI2RlZmluZSBEQTkwNjNfU0VUX0FEQ0lOMV9D
VVJfNDBVQQkweDAzCj4gKyNkZWZpbmUgREE5MDYzX1NFVF9BRENJTjJfQ1VSXzFVQQkweDAwCj4g
KyNkZWZpbmUgREE5MDYzX1NFVF9BRENJTjJfQ1VSXzJVQQkweDAxCj4gKyNkZWZpbmUgREE5MDYz
X1NFVF9BRENJTjJfQ1VSXzEwVUEJMHgwMgo+ICsjZGVmaW5lIERBOTA2M19TRVRfQURDSU4yX0NV
Ul80MFVBCTB4MDMKPiArI2RlZmluZSBEQTkwNjNfU0VUX0FEQ0lOM19DVVJfMTBVQQkweDAwCgpX
aHkgZGlmZmVyZW50aWF0ZT8gTW9yZSBzdWNjaW5jdGx5OgoKLyogSFdNT04gcGxhdGZvcm0gZGF0
YSAqLwojZGVmaW5lIERBOTA2M19TRVRfQ1VSXzFVQQkweDAwCiNkZWZpbmUgREE5MDYzX1NFVF9D
VVJfMlVBCTB4MDEKI2RlZmluZSBEQTkwNjNfU0VUX0NVUl8xMFVBCTB4MDIKI2RlZmluZSBEQTkw
NjNfU0VUX0NVUl80MFVBCTB4MDMKCgo+ICtzdHJ1Y3QgZGE5MDYzX2h3bW9uX3BkYXRhIHsKPiAr
CXVuc2lnbmVkIGNoYXIgYWRjaW4xX2N1cjsKPiArCXVuc2lnbmVkIGNoYXIgYWRjaW4yX2N1cjsK
PiArCXVuc2lnbmVkIGNoYXIgYWRjaW4zX2N1cjsKPiArfTsKPiArCj4gIAoKTm93IHRoZXJlIGFy
ZSB0d28gbmV3IGxpbmVzIGhlcmUuCgo+ICAvKgo+ICAgKiBSR0IgTEVEIGNvbmZpZ3VyYXRpb24K
PiBAQCAtMTA2LDYgKzEyMyw3IEBAIHN0cnVjdCBkYTkwNjNfcGRhdGEgewo+ICAJdW5zaWduZWQJ
CQlmbGFnczsKPiAgCXN0cnVjdCBkYTkwNjNfcmVndWxhdG9yc19wZGF0YQkqcmVndWxhdG9yc19w
ZGF0YTsKPiAgCXN0cnVjdCBsZWRfcGxhdGZvcm1fZGF0YQkqbGVkc19wZGF0YTsKPiArCXN0cnVj
dCBkYTkwNjNfaHdtb25fcGRhdGEJKmh3bW9uX3BkYXRhOwo+ICB9OwoKRG9lcyB0aGlzIGRldmlj
ZSBzdXBwb3J0IERldmljZSBUcmVlPwoKPiAgI2VuZGlmCS8qIF9fTUZEX0RBOTA2M19QREFUQV9I
X18gKi8KCi0tIApMZWUgSm9uZXMKTGluYXJvIFNUTWljcm9lbGVjdHJvbmljcyBMYW5kaW5nIFRl
YW0gTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBzb2Z0d2FyZSBmb3IgQVJNIFNvQ3MK
Rm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVyIHwgQmxvZwoKX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QK
bG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFp
bG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz

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

* RE: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-24  7:52     ` [lm-sensors] " Lee Jones
@ 2014-03-24  8:12       ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  8:12 UTC (permalink / raw)
  To: Lee Jones
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2230 bytes --]

Hi Lee,
Thank you for the fast reply.

On 24 March 2014 07:52 Lee Jones wrote,
>> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>>
>> Add the HWMON driver for DA9063
>>
>> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>> ---
>>
>>  drivers/hwmon/Kconfig                |   10 +
>>  drivers/hwmon/Makefile               |    1 +
>>  drivers/hwmon/da9063-hwmon.c         |  456
>++++++++++++++++++++++++++++++++++
>>  include/linux/mfd/da9063/registers.h |   34 +++
>
>I'd prefer to see all values in hex, but this probably a preference
>thing rather than something which would prevent acceptance.
>
>For the MFD header changes:
>  Acked-by: Lee Jones <lee.jones@linaro.org>
>
Thanks for the Ack.

<snip>
> +#define DA9063_ADC_RES	(1 << (DA9063_ADC_RES_L_BITS + DA9063_ADC_RES_M_BITS))
> +#define DA9063_ADC_MAX	(DA9063_ADC_RES - 1)
>> +#define DA9063_2V5	2500
>> +#define DA9063_5V0	5000
>> +#define DA9063_5V5	5500
>> +#define DA9063_TJUNC_M	-420
>> +#define DA9063_TJUNC_C	-812
>> +#define DA9063_VBBAT_M	2048

I am using these defines as part of the base-10 calculations in the conversion
routines for voltage and temperature.
I guess they do look weird .. and looking at it, I have mixed  division by 1024
as a right shift 10 in the TJUNC calculation.

I will re-format that part and put a comment in the defines to explain.
Thanks.

<snip>
>> +	case DA9063_CHAN_ADCIN1:
>> +	case DA9063_CHAN_ADCIN2:
>> +	case DA9063_CHAN_ADCIN3:
>> +		val = (DA9063_2V5 * val) / DA9063_ADC_MAX;
>> +		break;
>> +	case DA9063_CHAN_VSYS:
>> +		val = ((DA9063_5V5 - DA9063_2V5) * val) / DA9063_ADC_MAX +
>> +			DA9063_2V5;
>> +		break;
>> +	case DA9063_CHAN_TJUNC:
>> +		val -= hwmon->tjunc_offset;
>> +		val = (DA9063_TJUNC_M * (val + DA9063_TJUNC_C)) >> 10;
>> +		break;
>> +	case DA9063_CHAN_VBBAT:
>> +		val = (DA9063_5V0 * val) / DA9063_ADC_MAX;
>> +		break;

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

Regards,
Steve
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

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

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  8:12       ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  8:12 UTC (permalink / raw)
  To: Lee Jones
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

SGkgTGVlLA0KVGhhbmsgeW91IGZvciB0aGUgZmFzdCByZXBseS4NCg0KT24gMjQgTWFyY2ggMjAx
NCAwNzo1MiBMZWUgSm9uZXMgd3JvdGUsDQo+PiBGcm9tOiBPcGVuc291cmNlIFtTdGV2ZSBUd2lz
c10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNlbWkuY29tPg0KPj4NCj4+IEFkZCB0aGUgSFdNT04g
ZHJpdmVyIGZvciBEQTkwNjMNCj4+DQo+PiBTaWduZWQtb2ZmLWJ5OiBPcGVuc291cmNlIFtTdGV2
ZSBUd2lzc10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNlbWkuY29tPg0KPj4gLS0tDQo+Pg0KPj4g
IGRyaXZlcnMvaHdtb24vS2NvbmZpZyAgICAgICAgICAgICAgICB8ICAgMTAgKw0KPj4gIGRyaXZl
cnMvaHdtb24vTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgIDEgKw0KPj4gIGRyaXZlcnMvaHdt
b24vZGE5MDYzLWh3bW9uLmMgICAgICAgICB8ICA0NTYNCj4rKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrDQo+PiAgaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3JlZ2lzdGVycy5oIHwg
ICAzNCArKysNCj4NCj5JJ2QgcHJlZmVyIHRvIHNlZSBhbGwgdmFsdWVzIGluIGhleCwgYnV0IHRo
aXMgcHJvYmFibHkgYSBwcmVmZXJlbmNlDQo+dGhpbmcgcmF0aGVyIHRoYW4gc29tZXRoaW5nIHdo
aWNoIHdvdWxkIHByZXZlbnQgYWNjZXB0YW5jZS4NCj4NCj5Gb3IgdGhlIE1GRCBoZWFkZXIgY2hh
bmdlczoNCj4gIEFja2VkLWJ5OiBMZWUgSm9uZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPg0KPg0K
VGhhbmtzIGZvciB0aGUgQWNrLg0KDQo8c25pcD4NCj4gKyNkZWZpbmUgREE5MDYzX0FEQ19SRVMJ
KDEgPDwgKERBOTA2M19BRENfUkVTX0xfQklUUyArIERBOTA2M19BRENfUkVTX01fQklUUykpDQo+
ICsjZGVmaW5lIERBOTA2M19BRENfTUFYCShEQTkwNjNfQURDX1JFUyAtIDEpDQo+PiArI2RlZmlu
ZSBEQTkwNjNfMlY1CTI1MDANCj4+ICsjZGVmaW5lIERBOTA2M181VjAJNTAwMA0KPj4gKyNkZWZp
bmUgREE5MDYzXzVWNQk1NTAwDQo+PiArI2RlZmluZSBEQTkwNjNfVEpVTkNfTQktNDIwDQo+PiAr
I2RlZmluZSBEQTkwNjNfVEpVTkNfQwktODEyDQo+PiArI2RlZmluZSBEQTkwNjNfVkJCQVRfTQky
MDQ4DQoNCkkgYW0gdXNpbmcgdGhlc2UgZGVmaW5lcyBhcyBwYXJ0IG9mIHRoZSBiYXNlLTEwIGNh
bGN1bGF0aW9ucyBpbiB0aGUgY29udmVyc2lvbg0Kcm91dGluZXMgZm9yIHZvbHRhZ2UgYW5kIHRl
bXBlcmF0dXJlLg0KSSBndWVzcyB0aGV5IGRvIGxvb2sgd2VpcmQgLi4gYW5kIGxvb2tpbmcgYXQg
aXQsIEkgaGF2ZSBtaXhlZCAgZGl2aXNpb24gYnkgMTAyNA0KYXMgYSByaWdodCBzaGlmdCAxMCBp
biB0aGUgVEpVTkMgY2FsY3VsYXRpb24uDQoNCkkgd2lsbCByZS1mb3JtYXQgdGhhdCBwYXJ0IGFu
ZCBwdXQgYSBjb21tZW50IGluIHRoZSBkZWZpbmVzIHRvIGV4cGxhaW4uDQpUaGFua3MuDQoNCjxz
bmlwPg0KPj4gKwljYXNlIERBOTA2M19DSEFOX0FEQ0lOMToNCj4+ICsJY2FzZSBEQTkwNjNfQ0hB
Tl9BRENJTjI6DQo+PiArCWNhc2UgREE5MDYzX0NIQU5fQURDSU4zOg0KPj4gKwkJdmFsID0gKERB
OTA2M18yVjUgKiB2YWwpIC8gREE5MDYzX0FEQ19NQVg7DQo+PiArCQlicmVhazsNCj4+ICsJY2Fz
ZSBEQTkwNjNfQ0hBTl9WU1lTOg0KPj4gKwkJdmFsID0gKChEQTkwNjNfNVY1IC0gREE5MDYzXzJW
NSkgKiB2YWwpIC8gREE5MDYzX0FEQ19NQVggKw0KPj4gKwkJCURBOTA2M18yVjU7DQo+PiArCQli
cmVhazsNCj4+ICsJY2FzZSBEQTkwNjNfQ0hBTl9USlVOQzoNCj4+ICsJCXZhbCAtPSBod21vbi0+
dGp1bmNfb2Zmc2V0Ow0KPj4gKwkJdmFsID0gKERBOTA2M19USlVOQ19NICogKHZhbCArIERBOTA2
M19USlVOQ19DKSkgPj4gMTA7DQo+PiArCQlicmVhazsNCj4+ICsJY2FzZSBEQTkwNjNfQ0hBTl9W
QkJBVDoNCj4+ICsJCXZhbCA9IChEQTkwNjNfNVYwICogdmFsKSAvIERBOTA2M19BRENfTUFYOw0K
Pj4gKwkJYnJlYWs7DQoNCjxzbmlwPg0KPg0KPi0tDQo+TGVlIEpvbmVzDQo+TGluYXJvIFNUTWlj
cm9lbGVjdHJvbmljcyBMYW5kaW5nIFRlYW0gTGVhZA0KPkxpbmFyby5vcmcg4pSCIE9wZW4gc291
cmNlIHNvZnR3YXJlIGZvciBBUk0gU29Dcw0KPkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdp
dHRlciB8IEJsb2cNCg0KUmVnYXJkcywNClN0ZXZlDQpfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3Jz
QGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3Rp
bmZvL2xtLXNlbnNvcnM

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

* RE: [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
  2014-03-24  8:02     ` [lm-sensors] " Lee Jones
@ 2014-03-24  8:28       ` Opensource [Steve Twiss]
  -1 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  8:28 UTC (permalink / raw)
  To: Lee Jones
  Cc: Samuel Ortiz, David Dajun Chen, Guenter Roeck, Jean Delvare,
	LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel,
	Rob Landley

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 4209 bytes --]

Hi Lee,

On 24 March 2014 08:03 Lee Jones wrote:
>On Sun, 23 Mar 2014, Opensource [Steve Twiss] wrote:
>> From: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>>
>> Dependencies required for DA9063 HWMON support.
>>
>> Signed-off-by: Opensource [Steve Twiss] <stwiss.opensource@diasemi.com>
>> ---
>>
>>  drivers/mfd/da9063-core.c        |   13 ++++++++++++-
>>  include/linux/mfd/da9063/core.h  |    3 +++
>>  include/linux/mfd/da9063/pdata.h |   18 ++++++++++++++++++
>>  3 files changed, 33 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/mfd/da9063-core.c b/drivers/mfd/da9063-core.c
>> index e70ae31..24c1838 100644
>> --- a/drivers/mfd/da9063-core.c
>> +++ b/drivers/mfd/da9063-core.c
>> @@ -111,6 +111,7 @@ int da9063_device_init(struct da9063 *da9063, unsigned
>int irq)
>>  {
>>  	struct da9063_pdata *pdata = da9063->dev->platform_data;
>>  	int model, variant_id, variant_code;
>> +	int t_offset = 0;
>>  	int ret;
>>
>>  	if (pdata) {
>> @@ -171,8 +172,18 @@ int da9063_device_init(struct da9063 *da9063, unsigned
>int irq)
>>  	ret = mfd_add_devices(da9063->dev, -1, da9063_devs,
>>  			      ARRAY_SIZE(da9063_devs), NULL, da9063->irq_base,
>>  			      NULL);
>> -	if (ret)
>> +	if (ret) {
>>  		dev_err(da9063->dev, "Cannot add MFD cells\n");
>> +		return ret;
>> +	}
>> +
>> +	ret = regmap_read(da9063->regmap, DA9063_REG_T_OFFSET, &t_offset);
>> +	if (ret < 0)
>> +		dev_warn(da9063->dev,
>> +			 "Temperature trimming value cannot be read (defaulting
>to 0)\n");
>> +
>> +	/* pass this on to the hwmon driver */
>> +	da9063->t_offset = t_offset;
>
>What's the logic for using a local variable for this prior to setting
>the attribute in the shared container?
>

Yep -- that's bad. I'll remove it.

>>  	return ret;
>>  }
>> diff --git a/include/linux/mfd/da9063/core.h
>b/include/linux/mfd/da9063/core.h
>> index 00a9aac..7327d37 100644
>> --- a/include/linux/mfd/da9063/core.h
>> +++ b/include/linux/mfd/da9063/core.h
>> @@ -86,6 +86,9 @@ struct da9063 {
>>  	int		chip_irq;
>>  	unsigned int	irq_base;
>>  	struct regmap_irq_chip_data *regmap_irq;
>> +
>> +	/* Trimming */
>> +	int		t_offset;
>>  };
>>
>>  int da9063_device_init(struct da9063 *da9063, unsigned int irq);
>> diff --git a/include/linux/mfd/da9063/pdata.h
>b/include/linux/mfd/da9063/pdata.h
>> index 95c8742..576033e 100644
>> --- a/include/linux/mfd/da9063/pdata.h
>> +++ b/include/linux/mfd/da9063/pdata.h
>> @@ -62,6 +62,23 @@ struct da9063_regulators_pdata {
>>  	struct da9063_regulator_data	*regulator_data;
>>  };
>>
>> +/* HWMON platform data */
>> +#define DA9063_SET_ADCIN1_CUR_1UA	0x00
>> +#define DA9063_SET_ADCIN1_CUR_2UA	0x01
>> +#define DA9063_SET_ADCIN1_CUR_10UA	0x02
>> +#define DA9063_SET_ADCIN1_CUR_40UA	0x03
>> +#define DA9063_SET_ADCIN2_CUR_1UA	0x00
>> +#define DA9063_SET_ADCIN2_CUR_2UA	0x01
>> +#define DA9063_SET_ADCIN2_CUR_10UA	0x02
>> +#define DA9063_SET_ADCIN2_CUR_40UA	0x03
>> +#define DA9063_SET_ADCIN3_CUR_10UA	0x00
>
>Why differentiate? More succinctly:
>
>/* HWMON platform data */
>#define DA9063_SET_CUR_1UA	0x00
>#define DA9063_SET_CUR_2UA	0x01
>#define DA9063_SET_CUR_10UA	0x02
>#define DA9063_SET_CUR_40UA	0x03
>
>
Oh yeh... that makes much more sense.
I should have thought of that  :(
Sorry you had to review that part.

>> +struct da9063_hwmon_pdata {
>> +	unsigned char adcin1_cur;
>> +	unsigned char adcin2_cur;
>> +	unsigned char adcin3_cur;
>> +};
>> +
>>
>
>Now there are two new lines here.
>
Will erase them.

>>  /*
>>   * RGB LED configuration
>> @@ -106,6 +123,7 @@ struct da9063_pdata {
>>  	unsigned			flags;
>>  	struct da9063_regulators_pdata	*regulators_pdata;
>>  	struct led_platform_data	*leds_pdata;
>> +	struct da9063_hwmon_pdata	*hwmon_pdata;
>>  };
>
>Does this device support Device Tree?
>
Ah, well no. I've not added any DT stuff.
Is that an essential requirement now?

>>  #endif	/* __MFD_DA9063_PDATA_H__ */
>
>--
>Lee Jones
>Linaro STMicroelectronics Landing Team Lead
>Linaro.org │ Open source software for ARM SoCs
>Follow Linaro: Facebook | Twitter | Blog

Thanks,
Steve
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

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

* Re: [lm-sensors] [RFC V1 2/3] mfd: da9063: Add HWMON dependencies
@ 2014-03-24  8:28       ` Opensource [Steve Twiss]
  0 siblings, 0 replies; 24+ messages in thread
From: Opensource [Steve Twiss] @ 2014-03-24  8:28 UTC (permalink / raw)
  To: Lee Jones
  Cc: Samuel Ortiz, David Dajun Chen, Guenter Roeck, Jean Delvare,
	LINUX-DOC, LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel,
	Rob Landley

SGkgTGVlLA0KDQpPbiAyNCBNYXJjaCAyMDE0IDA4OjAzIExlZSBKb25lcyB3cm90ZToNCj5PbiBT
dW4sIDIzIE1hciAyMDE0LCBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10gd3JvdGU6DQo+PiBGcm9t
OiBPcGVuc291cmNlIFtTdGV2ZSBUd2lzc10gPHN0d2lzcy5vcGVuc291cmNlQGRpYXNlbWkuY29t
Pg0KPj4NCj4+IERlcGVuZGVuY2llcyByZXF1aXJlZCBmb3IgREE5MDYzIEhXTU9OIHN1cHBvcnQu
DQo+Pg0KPj4gU2lnbmVkLW9mZi1ieTogT3BlbnNvdXJjZSBbU3RldmUgVHdpc3NdIDxzdHdpc3Mu
b3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4NCj4+IC0tLQ0KPj4NCj4+ICBkcml2ZXJzL21mZC9kYTkw
NjMtY29yZS5jICAgICAgICB8ICAgMTMgKysrKysrKysrKysrLQ0KPj4gIGluY2x1ZGUvbGludXgv
bWZkL2RhOTA2My9jb3JlLmggIHwgICAgMyArKysNCj4+ICBpbmNsdWRlL2xpbnV4L21mZC9kYTkw
NjMvcGRhdGEuaCB8ICAgMTggKysrKysrKysrKysrKysrKysrDQo+PiAgMyBmaWxlcyBjaGFuZ2Vk
LCAzMyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pDQo+Pg0KPj4gZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvbWZkL2RhOTA2My1jb3JlLmMgYi9kcml2ZXJzL21mZC9kYTkwNjMtY29yZS5jDQo+PiBp
bmRleCBlNzBhZTMxLi4yNGMxODM4IDEwMDY0NA0KPj4gLS0tIGEvZHJpdmVycy9tZmQvZGE5MDYz
LWNvcmUuYw0KPj4gKysrIGIvZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUuYw0KPj4gQEAgLTExMSw2
ICsxMTEsNyBAQCBpbnQgZGE5MDYzX2RldmljZV9pbml0KHN0cnVjdCBkYTkwNjMgKmRhOTA2Mywg
dW5zaWduZWQNCj5pbnQgaXJxKQ0KPj4gIHsNCj4+ICAJc3RydWN0IGRhOTA2M19wZGF0YSAqcGRh
dGEgPSBkYTkwNjMtPmRldi0+cGxhdGZvcm1fZGF0YTsNCj4+ICAJaW50IG1vZGVsLCB2YXJpYW50
X2lkLCB2YXJpYW50X2NvZGU7DQo+PiArCWludCB0X29mZnNldCA9IDA7DQo+PiAgCWludCByZXQ7
DQo+Pg0KPj4gIAlpZiAocGRhdGEpIHsNCj4+IEBAIC0xNzEsOCArMTcyLDE4IEBAIGludCBkYTkw
NjNfZGV2aWNlX2luaXQoc3RydWN0IGRhOTA2MyAqZGE5MDYzLCB1bnNpZ25lZA0KPmludCBpcnEp
DQo+PiAgCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhkYTkwNjMtPmRldiwgLTEsIGRhOTA2M19kZXZz
LA0KPj4gIAkJCSAgICAgIEFSUkFZX1NJWkUoZGE5MDYzX2RldnMpLCBOVUxMLCBkYTkwNjMtPmly
cV9iYXNlLA0KPj4gIAkJCSAgICAgIE5VTEwpOw0KPj4gLQlpZiAocmV0KQ0KPj4gKwlpZiAocmV0
KSB7DQo+PiAgCQlkZXZfZXJyKGRhOTA2My0+ZGV2LCAiQ2Fubm90IGFkZCBNRkQgY2VsbHNcbiIp
Ow0KPj4gKwkJcmV0dXJuIHJldDsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlyZXQgPSByZWdtYXBfcmVh
ZChkYTkwNjMtPnJlZ21hcCwgREE5MDYzX1JFR19UX09GRlNFVCwgJnRfb2Zmc2V0KTsNCj4+ICsJ
aWYgKHJldCA8IDApDQo+PiArCQlkZXZfd2FybihkYTkwNjMtPmRldiwNCj4+ICsJCQkgIlRlbXBl
cmF0dXJlIHRyaW1taW5nIHZhbHVlIGNhbm5vdCBiZSByZWFkIChkZWZhdWx0aW5nDQo+dG8gMClc
biIpOw0KPj4gKw0KPj4gKwkvKiBwYXNzIHRoaXMgb24gdG8gdGhlIGh3bW9uIGRyaXZlciAqLw0K
Pj4gKwlkYTkwNjMtPnRfb2Zmc2V0ID0gdF9vZmZzZXQ7DQo+DQo+V2hhdCdzIHRoZSBsb2dpYyBm
b3IgdXNpbmcgYSBsb2NhbCB2YXJpYWJsZSBmb3IgdGhpcyBwcmlvciB0byBzZXR0aW5nDQo+dGhl
IGF0dHJpYnV0ZSBpbiB0aGUgc2hhcmVkIGNvbnRhaW5lcj8NCj4NCg0KWWVwIC0tIHRoYXQncyBi
YWQuIEknbGwgcmVtb3ZlIGl0Lg0KDQo+PiAgCXJldHVybiByZXQ7DQo+PiAgfQ0KPj4gZGlmZiAt
LWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9jb3JlLmgNCj5iL2luY2x1ZGUvbGludXgv
bWZkL2RhOTA2My9jb3JlLmgNCj4+IGluZGV4IDAwYTlhYWMuLjczMjdkMzcgMTAwNjQ0DQo+PiAt
LS0gYS9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvY29yZS5oDQo+PiArKysgYi9pbmNsdWRlL2xp
bnV4L21mZC9kYTkwNjMvY29yZS5oDQo+PiBAQCAtODYsNiArODYsOSBAQCBzdHJ1Y3QgZGE5MDYz
IHsNCj4+ICAJaW50CQljaGlwX2lycTsNCj4+ICAJdW5zaWduZWQgaW50CWlycV9iYXNlOw0KPj4g
IAlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKnJlZ21hcF9pcnE7DQo+PiArDQo+PiArCS8q
IFRyaW1taW5nICovDQo+PiArCWludAkJdF9vZmZzZXQ7DQo+PiAgfTsNCj4+DQo+PiAgaW50IGRh
OTA2M19kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDYzICpkYTkwNjMsIHVuc2lnbmVkIGludCBpcnEp
Ow0KPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9wZGF0YS5oDQo+Yi9p
bmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcGRhdGEuaA0KPj4gaW5kZXggOTVjODc0Mi4uNTc2MDMz
ZSAxMDA2NDQNCj4+IC0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9wZGF0YS5oDQo+PiAr
KysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcGRhdGEuaA0KPj4gQEAgLTYyLDYgKzYyLDIz
IEBAIHN0cnVjdCBkYTkwNjNfcmVndWxhdG9yc19wZGF0YSB7DQo+PiAgCXN0cnVjdCBkYTkwNjNf
cmVndWxhdG9yX2RhdGEJKnJlZ3VsYXRvcl9kYXRhOw0KPj4gIH07DQo+Pg0KPj4gKy8qIEhXTU9O
IHBsYXRmb3JtIGRhdGEgKi8NCj4+ICsjZGVmaW5lIERBOTA2M19TRVRfQURDSU4xX0NVUl8xVUEJ
MHgwMA0KPj4gKyNkZWZpbmUgREE5MDYzX1NFVF9BRENJTjFfQ1VSXzJVQQkweDAxDQo+PiArI2Rl
ZmluZSBEQTkwNjNfU0VUX0FEQ0lOMV9DVVJfMTBVQQkweDAyDQo+PiArI2RlZmluZSBEQTkwNjNf
U0VUX0FEQ0lOMV9DVVJfNDBVQQkweDAzDQo+PiArI2RlZmluZSBEQTkwNjNfU0VUX0FEQ0lOMl9D
VVJfMVVBCTB4MDANCj4+ICsjZGVmaW5lIERBOTA2M19TRVRfQURDSU4yX0NVUl8yVUEJMHgwMQ0K
Pj4gKyNkZWZpbmUgREE5MDYzX1NFVF9BRENJTjJfQ1VSXzEwVUEJMHgwMg0KPj4gKyNkZWZpbmUg
REE5MDYzX1NFVF9BRENJTjJfQ1VSXzQwVUEJMHgwMw0KPj4gKyNkZWZpbmUgREE5MDYzX1NFVF9B
RENJTjNfQ1VSXzEwVUEJMHgwMA0KPg0KPldoeSBkaWZmZXJlbnRpYXRlPyBNb3JlIHN1Y2NpbmN0
bHk6DQo+DQo+LyogSFdNT04gcGxhdGZvcm0gZGF0YSAqLw0KPiNkZWZpbmUgREE5MDYzX1NFVF9D
VVJfMVVBCTB4MDANCj4jZGVmaW5lIERBOTA2M19TRVRfQ1VSXzJVQQkweDAxDQo+I2RlZmluZSBE
QTkwNjNfU0VUX0NVUl8xMFVBCTB4MDINCj4jZGVmaW5lIERBOTA2M19TRVRfQ1VSXzQwVUEJMHgw
Mw0KPg0KPg0KT2ggeWVoLi4uIHRoYXQgbWFrZXMgbXVjaCBtb3JlIHNlbnNlLg0KSSBzaG91bGQg
aGF2ZSB0aG91Z2h0IG9mIHRoYXQgIDooDQpTb3JyeSB5b3UgaGFkIHRvIHJldmlldyB0aGF0IHBh
cnQuDQoNCj4+ICtzdHJ1Y3QgZGE5MDYzX2h3bW9uX3BkYXRhIHsNCj4+ICsJdW5zaWduZWQgY2hh
ciBhZGNpbjFfY3VyOw0KPj4gKwl1bnNpZ25lZCBjaGFyIGFkY2luMl9jdXI7DQo+PiArCXVuc2ln
bmVkIGNoYXIgYWRjaW4zX2N1cjsNCj4+ICt9Ow0KPj4gKw0KPj4NCj4NCj5Ob3cgdGhlcmUgYXJl
IHR3byBuZXcgbGluZXMgaGVyZS4NCj4NCldpbGwgZXJhc2UgdGhlbS4NCg0KPj4gIC8qDQo+PiAg
ICogUkdCIExFRCBjb25maWd1cmF0aW9uDQo+PiBAQCAtMTA2LDYgKzEyMyw3IEBAIHN0cnVjdCBk
YTkwNjNfcGRhdGEgew0KPj4gIAl1bnNpZ25lZAkJCWZsYWdzOw0KPj4gIAlzdHJ1Y3QgZGE5MDYz
X3JlZ3VsYXRvcnNfcGRhdGEJKnJlZ3VsYXRvcnNfcGRhdGE7DQo+PiAgCXN0cnVjdCBsZWRfcGxh
dGZvcm1fZGF0YQkqbGVkc19wZGF0YTsNCj4+ICsJc3RydWN0IGRhOTA2M19od21vbl9wZGF0YQkq
aHdtb25fcGRhdGE7DQo+PiAgfTsNCj4NCj5Eb2VzIHRoaXMgZGV2aWNlIHN1cHBvcnQgRGV2aWNl
IFRyZWU/DQo+DQpBaCwgd2VsbCBuby4gSSd2ZSBub3QgYWRkZWQgYW55IERUIHN0dWZmLg0KSXMg
dGhhdCBhbiBlc3NlbnRpYWwgcmVxdWlyZW1lbnQgbm93Pw0KDQo+PiAgI2VuZGlmCS8qIF9fTUZE
X0RBOTA2M19QREFUQV9IX18gKi8NCj4NCj4tLQ0KPkxlZSBKb25lcw0KPkxpbmFybyBTVE1pY3Jv
ZWxlY3Ryb25pY3MgTGFuZGluZyBUZWFtIExlYWQNCj5MaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJj
ZSBzb2Z0d2FyZSBmb3IgQVJNIFNvQ3MNCj5Gb2xsb3cgTGluYXJvOiBGYWNlYm9vayB8IFR3aXR0
ZXIgfCBCbG9nDQoNClRoYW5rcywNClN0ZXZlDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxt
LXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZv
L2xtLXNlbnNvcnM

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

* Re: [RFC V1 1/3] hwmon: da9063: HWMON driver
  2014-03-24  7:48       ` [lm-sensors] " Opensource [Steve Twiss]
@ 2014-03-24  9:24         ` Lee Jones
  -1 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  9:24 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

[...]

> >Please make sure that each patch, if applied one after another, compiles.
> >Patch 1/3 must not depend on patch 2/3.
> 
> Hi Guenter,
> 
> Thank you for this fast response.
> 
> Ah, the dependencies were not in order. I will check for that in future.
> 
> I will also look into using the API with devm_hwmon_device_register_with_groups
> and will resubmit with a RFC V2 later.

If there are inter-{patch,subsystem} dependencies within a patch-set
you need to let us know so we can ensure the patches are kept
together. If not they are likely to be sucked into their respective
subsystem trees and will break bisectability when they hit Mainline.

-- 
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] 24+ messages in thread

* Re: [lm-sensors] [RFC V1 1/3] hwmon: da9063: HWMON driver
@ 2014-03-24  9:24         ` Lee Jones
  0 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-03-24  9:24 UTC (permalink / raw)
  To: Opensource [Steve Twiss]
  Cc: Guenter Roeck, Jean Delvare, David Dajun Chen, LINUX-DOC,
	LINUX-KERNEL, LM-SENSORS, Mark Brown, Philipp Zabel, Rob Landley,
	Samuel Ortiz

Wy4uLl0KCj4gPlBsZWFzZSBtYWtlIHN1cmUgdGhhdCBlYWNoIHBhdGNoLCBpZiBhcHBsaWVkIG9u
ZSBhZnRlciBhbm90aGVyLCBjb21waWxlcy4KPiA+UGF0Y2ggMS8zIG11c3Qgbm90IGRlcGVuZCBv
biBwYXRjaCAyLzMuCj4gCj4gSGkgR3VlbnRlciwKPiAKPiBUaGFuayB5b3UgZm9yIHRoaXMgZmFz
dCByZXNwb25zZS4KPiAKPiBBaCwgdGhlIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCBpbiBvcmRlci4g
SSB3aWxsIGNoZWNrIGZvciB0aGF0IGluIGZ1dHVyZS4KPiAKPiBJIHdpbGwgYWxzbyBsb29rIGlu
dG8gdXNpbmcgdGhlIEFQSSB3aXRoIGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3Jv
dXBzCj4gYW5kIHdpbGwgcmVzdWJtaXQgd2l0aCBhIFJGQyBWMiBsYXRlci4KCklmIHRoZXJlIGFy
ZSBpbnRlci17cGF0Y2gsc3Vic3lzdGVtfSBkZXBlbmRlbmNpZXMgd2l0aGluIGEgcGF0Y2gtc2V0
CnlvdSBuZWVkIHRvIGxldCB1cyBrbm93IHNvIHdlIGNhbiBlbnN1cmUgdGhlIHBhdGNoZXMgYXJl
IGtlcHQKdG9nZXRoZXIuIElmIG5vdCB0aGV5IGFyZSBsaWtlbHkgdG8gYmUgc3Vja2VkIGludG8g
dGhlaXIgcmVzcGVjdGl2ZQpzdWJzeXN0ZW0gdHJlZXMgYW5kIHdpbGwgYnJlYWsgYmlzZWN0YWJp
bGl0eSB3aGVuIHRoZXkgaGl0IE1haW5saW5lLgoKLS0gCkxlZSBKb25lcwpMaW5hcm8gU1RNaWNy
b2VsZWN0cm9uaWNzIExhbmRpbmcgVGVhbSBMZWFkCkxpbmFyby5vcmcg4pSCIE9wZW4gc291cmNl
IHNvZnR3YXJlIGZvciBBUk0gU29DcwpGb2xsb3cgTGluYXJvOiBGYWNlYm9vayB8IFR3aXR0ZXIg
fCBCbG9nCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps
bS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9s
aXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM

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

end of thread, other threads:[~2014-03-24  9:24 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-23 20:37 [RFC V1 0/3] da9063: Addition of HWMON support for DA9063 Opensource [Steve Twiss]
2014-03-23 20:37 ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-23 20:37 ` [RFC V1 1/3] hwmon: da9063: HWMON driver Opensource [Steve Twiss]
2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-24  3:27   ` Guenter Roeck
2014-03-24  3:27     ` [lm-sensors] " Guenter Roeck
2014-03-24  3:39   ` Guenter Roeck
2014-03-24  3:39     ` [lm-sensors] " Guenter Roeck
2014-03-24  7:48     ` Opensource [Steve Twiss]
2014-03-24  7:48       ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-24  9:24       ` Lee Jones
2014-03-24  9:24         ` [lm-sensors] " Lee Jones
2014-03-24  7:52   ` Lee Jones
2014-03-24  7:52     ` [lm-sensors] " Lee Jones
2014-03-24  8:12     ` Opensource [Steve Twiss]
2014-03-24  8:12       ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-23 20:37 ` [RFC V1 2/3] mfd: da9063: Add HWMON dependencies Opensource [Steve Twiss]
2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-24  8:02   ` Lee Jones
2014-03-24  8:02     ` [lm-sensors] " Lee Jones
2014-03-24  8:28     ` Opensource [Steve Twiss]
2014-03-24  8:28       ` [lm-sensors] " Opensource [Steve Twiss]
2014-03-23 20:37 ` [RFC V1 3/3] Documentation: hwmon: New information for DA9063 Opensource [Steve Twiss]
2014-03-23 20:37   ` [lm-sensors] " Opensource [Steve Twiss]

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.