linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [NEW DRIVER V1 1/7] DA9058 MFD core and ADC driver
@ 2012-08-02  8:48 Anthony Olech
  2012-08-02 10:16 ` Mark Brown
  0 siblings, 1 reply; 2+ messages in thread
From: Anthony Olech @ 2012-08-02  8:48 UTC (permalink / raw)
  To: Mark Brown; +Cc: LKML

This is the MFD core driver for the Dialog DA9058 PMIC.
This driver, via MFD CELLs, causes all the component drivers to be
loaded, if it is a module, and initialized via their probe methods.
It also provides access to the ADC functions on the PMIC.
All the other component drivers depend on this one.

Signed-off-by: Tony Olech (at Home) <tony@olech.com>
---
 drivers/mfd/Kconfig                  |   18 ++
 drivers/mfd/Makefile                 |    3 +
 drivers/mfd/da9058-core.c            |  320 ++++++++++++++++++++++
 drivers/mfd/da9058-i2c.c             |  102 +++++++
 drivers/mfd/da9058-irq.c             |   66 +++++
 include/linux/mfd/da9058/bat.h       |   33 +++
 include/linux/mfd/da9058/codec.h     |   21 ++
 include/linux/mfd/da9058/core.h      |   69 +++++
 include/linux/mfd/da9058/gpio.h      |   19 ++
 include/linux/mfd/da9058/hwmon.h     |   20 ++
 include/linux/mfd/da9058/irq.h       |   45 ++++
 include/linux/mfd/da9058/onkey.h     |   17 ++
 include/linux/mfd/da9058/pdata.h     |   28 ++
 include/linux/mfd/da9058/registers.h |  480 ++++++++++++++++++++++++++++++++++
 include/linux/mfd/da9058/regulator.h |   33 +++
 include/linux/mfd/da9058/rtc.h       |   17 ++
 16 files changed, 1291 insertions(+), 0 deletions(-)
 create mode 100644 drivers/mfd/da9058-core.c
 create mode 100644 drivers/mfd/da9058-i2c.c
 create mode 100644 drivers/mfd/da9058-irq.c
 create mode 100644 include/linux/mfd/da9058/bat.h
 create mode 100644 include/linux/mfd/da9058/codec.h
 create mode 100644 include/linux/mfd/da9058/core.h
 create mode 100644 include/linux/mfd/da9058/gpio.h
 create mode 100644 include/linux/mfd/da9058/hwmon.h
 create mode 100644 include/linux/mfd/da9058/irq.h
 create mode 100644 include/linux/mfd/da9058/onkey.h
 create mode 100644 include/linux/mfd/da9058/pdata.h
 create mode 100644 include/linux/mfd/da9058/registers.h
 create mode 100644 include/linux/mfd/da9058/regulator.h
 create mode 100644 include/linux/mfd/da9058/rtc.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 92144ed..3fa1a75 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -3,6 +3,7 @@
 #
 
 if HAS_IOMEM
+
 menu "Multifunction device drivers"
 
 config MFD_CORE
@@ -20,6 +21,23 @@ config MFD_88PM860X
 	  select individual components like voltage regulators, RTC and
 	  battery-charger under the corresponding menus.
 
+config MFD_DA9058
+	tristate "Dialog Semiconductor DA9058 PMIC Support"
+	depends on I2C
+	select REGMAP_I2C
+	select REGMAP_IRQ
+	select MFD_CORE
+	help
+	  Say yes here for support of Dialog Semiconductor DA9058. This is
+	  a Power Management IC. This driver provides common support for
+	  accessing the device as well as the I2C interface to the chip itself.
+	  Additional drivers must be enabled in order to use the functionality
+	  of the device.
+
+	  This driver can be built as a module, but since the functionality
+	  of the device includes regulators it probably should be built into
+	  the kernel. If built as a module it will be called "da9058"
+
 config MFD_SM501
 	tristate "Support for Silicon Motion SM501"
 	 ---help---
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 75f6ed6..1853278 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -86,6 +86,9 @@ obj-$(CONFIG_MFD_MAX8998)	+= max8998.o max8998-irq.o
 
 pcf50633-objs			:= pcf50633-core.o pcf50633-irq.o
 obj-$(CONFIG_MFD_PCF50633)	+= pcf50633.o
+da9058-objs			= da9058-irq.o da9058-i2c.o da9058-core.o da9058-info.o
+obj-$(CONFIG_MFD_DA9058)		+= da9058.o
+
 obj-$(CONFIG_PCF50633_ADC)	+= pcf50633-adc.o
 obj-$(CONFIG_PCF50633_GPIO)	+= pcf50633-gpio.o
 obj-$(CONFIG_ABX500_CORE)	+= abx500-core.o
diff --git a/drivers/mfd/da9058-core.c b/drivers/mfd/da9058-core.c
new file mode 100644
index 0000000..370dcec
--- /dev/null
+++ b/drivers/mfd/da9058-core.c
@@ -0,0 +1,320 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/bug.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/ioport.h>
+#include <linux/gpio.h>
+#include <linux/proc_fs.h>
+#include <linux/kthread.h>
+#include <linux/mfd/core.h>
+#include <linux/regmap.h>
+
+#include <linux/mfd/da9058/core.h>
+#include <linux/mfd/da9058/registers.h>
+#include <linux/mfd/da9058/irq.h>
+#include <linux/mfd/da9058/pdata.h>
+#include <linux/mfd/da9058/conf.h>
+
+static int da9058_register_read(struct da9058 *da9058, u8 const reg, u8 *val)
+{
+	unsigned int ival;
+	int ret = regmap_read(da9058->regmap, reg, &ival);
+
+	*val = ival;
+	return ret;
+}
+
+static int da9058_register_write(struct da9058 *da9058, u8 const reg, u8 val)
+{
+	return regmap_write(da9058->regmap, reg, val);
+}
+
+static int da9058_register_raw_read(struct da9058 *da9058, u8 const reg,
+					u8 *val, size_t val_count)
+{
+	return regmap_raw_read(da9058->regmap, reg, val, val_count);
+}
+
+static int da9058_register_raw_write(struct da9058 *da9058, u8 const reg,
+					u8 *val, size_t val_count)
+{
+	return regmap_raw_write(da9058->regmap, reg, val, val_count);
+}
+
+static int da9058_register_bulk_read(struct da9058 *da9058, u8 const reg,
+					u8 *val, size_t val_count)
+{
+#if 0
+	return regmap_bulk_read(da9058->regmap, reg, val, val_count);
+#else
+	int ret = regmap_bulk_read(da9058->regmap, reg, val, val_count);
+	return ret;
+#endif
+}
+
+static int da9058_register_bulk_write(struct da9058 *da9058, u8 const reg,
+					u8 *val, size_t val_count)
+{
+	return regmap_bulk_write(da9058->regmap, reg, val, val_count);
+}
+
+static int da9058_register_update_bits(struct da9058 *da9058, u8 const reg,
+					u8 const mask, u8 const value)
+{
+	return regmap_update_bits(da9058->regmap, reg, mask, value);
+}
+
+/*
+ *  if the PMIC is in automatic ADC consersion mode we have the choice
+ *  of just getting the last (automatic) conversion or doing a manual
+ *  conversion anyway.
+ *
+ *  if the PMIC is not in automatic ADC consersion mode we have no choice
+ *  we just have to ignore the requested mode and just do a manual
+ *  ADC conversion.
+ */
+static int da9058_automatic_adc_conversion(struct da9058 *da9058,
+				const int channel, int *value)
+{
+	u8 adc_msh, adc_lsh;
+	int ret;
+
+	switch (channel) {
+	case DA9058_ADCMAN_MUXSEL_VBAT:
+		ret = da9058_register_read(da9058, DA9058_VBATRES_REG_MSB,
+						&adc_msh);
+		if (ret)
+			return ret;
+
+		ret = da9058_register_read(da9058, DA9058_AUTORES_REG_1,
+					&adc_lsh);
+		if (ret)
+			return ret;
+
+		*value = (adc_lsh & 0x0F) | (adc_msh << 4);
+
+		return 0;
+	case DA9058_ADCMAN_MUXSEL_TEMP:
+		ret = da9058_register_read(da9058, DA9058_TEMPRES_REG_MSB,
+						&adc_msh);
+		if (ret)
+			return ret;
+
+		ret = da9058_register_read(da9058, DA9058_AUTORES_REG_1,
+					&adc_lsh);
+		if (ret)
+			return ret;
+
+		*value = (adc_lsh >> 4) | (adc_msh << 4);
+
+		return 0;
+	case DA9058_ADCMAN_MUXSEL_VF:
+		ret = da9058_register_read(da9058, DA9058_VREF_REG,
+					&adc_msh);
+		if (ret)
+			return ret;
+
+		ret = da9058_register_read(da9058, DA9058_AUTORES_REG_2,
+					&adc_lsh);
+		if (ret)
+			return ret;
+
+		*value = (adc_lsh & 0x0F) | (adc_msh << 4);
+
+		return 0;
+	case DA9058_ADCMAN_MUXSEL_ADCIN:
+		ret = da9058_register_read(da9058, DA9058_ADCINRES_REG_MSB,
+					&adc_msh);
+		if (ret)
+			return ret;
+
+		ret = da9058_register_read(da9058, DA9058_AUTORES_REG_2,
+					&adc_lsh);
+		if (ret)
+			return ret;
+
+		*value = (adc_lsh >> 4) | (adc_msh << 4);
+
+		return 0;
+	case DA9058_ADCMAN_MUXSEL_TJUNC:
+		ret = da9058_register_read(da9058, DA9058_TJUNCRES_REG,
+					&adc_msh);
+		if (ret)
+			return ret;
+
+		ret = da9058_register_read(da9058, DA9058_AUTORES_REG_3,
+					&adc_lsh);
+		if (ret)
+			return ret;
+
+		*value = (adc_lsh >> 4) | (adc_msh << 4);
+
+		return 0;
+	default:
+		dev_err(da9058->dev, "ADC Channel %d is reserved\n", channel);
+		return -EIO;
+	}
+}
+
+static int da9058_manual_adc_conversion(struct da9058 *da9058,
+				const int channel, int *value)
+{
+	u8 adc_msh, adc_lsh;
+	int ret;
+
+	mutex_lock(&da9058->adc_mutex);
+
+	ret = da9058_register_write(da9058, DA9058_ADCMAN_REG,
+					DA9058_ADCMAN_MANCONV | channel);
+	if (ret < 0)
+		goto err;
+
+	if (!wait_for_completion_timeout(&da9058->adc_read_done,
+						msecs_to_jiffies(500))) {
+		dev_err(da9058->dev,
+			"timeout waiting for ADC conversion interrupt\n");
+		ret = -ETIMEDOUT;
+		goto err;
+	}
+
+	ret = da9058_register_read(da9058, DA9058_ADCRESH_REG, &adc_msh);
+	if (ret < 0)
+		goto err;
+
+	ret = da9058_register_read(da9058, DA9058_ADCRESL_REG, &adc_lsh);
+	if (ret < 0)
+		goto err;
+
+	*value = (adc_msh << 4) | (adc_lsh & 0x0F);
+
+err:
+	mutex_unlock(&da9058->adc_mutex);
+	return ret;
+}
+
+static int da9058_adc_conversion_read(struct da9058 *da9058, const int channel,
+					int automatic_mode, int *value)
+{
+	if (!value)
+		return -EINVAL;
+
+	if (automatic_mode) {
+		u8 adc_ctrl;
+		int ret;
+
+		ret = da9058_reg_read(da9058, DA9058_ADCCONT_REG, &adc_ctrl);
+		if (ret)
+			return ret;
+
+		if (adc_ctrl & DA9058_ADCCONT_AUTOADCEN)
+			return da9058_automatic_adc_conversion(da9058,
+						channel, value);
+		else
+			return da9058_manual_adc_conversion(da9058,
+						channel, value);
+	} else {
+		return da9058_manual_adc_conversion(da9058, channel, value);
+	}
+}
+
+static irqreturn_t da9058_adc_interrupt(int irq, void *data)
+{
+	struct da9058 *da9058 = data;
+
+	complete(&da9058->adc_read_done);
+
+	return IRQ_HANDLED;
+}
+
+struct da9058 *__devinit da9058_device_init(struct device *dev,
+					struct regmap *regmap, int irq,
+					struct da9058_chip_pdata *pdata)
+{
+	struct da9058 *da9058;
+	int ret;
+
+	da9058 = devm_kzalloc(dev, sizeof(struct da9058), GFP_KERNEL);
+	if (!da9058) {
+		ret = -ENOMEM;
+		goto err5;
+	}
+
+	dev_set_drvdata(dev, da9058);
+	da9058->dev = dev;
+	da9058->regmap = regmap;
+
+	if (pdata->init_board_irq) {
+		ret = pdata->init_board_irq();
+		if (ret)
+			goto err4;
+	}
+
+	mutex_init(&da9058->adc_mutex);
+	init_completion(&da9058->adc_read_done);
+
+	da9058->reg_read = da9058_register_read;
+	da9058->reg_write = da9058_register_write;
+	da9058->reg_raw_read = da9058_register_raw_read;
+	da9058->reg_raw_write = da9058_register_raw_write;
+	da9058->reg_bulk_read = da9058_register_bulk_read;
+	da9058->reg_bulk_write = da9058_register_bulk_write;
+	da9058->reg_update_bits = da9058_register_update_bits;
+	da9058->adc_read = da9058_adc_conversion_read;
+
+	da9058_set_bits(da9058, DA9058_POWERCONT_REG, DA9058_POWERCONT_nSLEEP);
+	da9058_clear_bits(da9058, DA9058_CONTROLB_REG,
+				DA9058_CONTROLB_WRITEMODE);
+
+	ret = da9058_irq_init(da9058, irq, &da9058_irq_chip);
+	if (ret)
+		goto err3;
+
+	ret = request_threaded_irq(da9058_to_virt_irq_num(da9058,
+						DA9058_IRQ_EADCEOM),
+				NULL, da9058_adc_interrupt,
+				IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+				"DA9058 ADC EOM", da9058);
+	if (ret)
+		goto err2;
+
+	ret = da9058_add_mfd_devices(da9058, pdata);
+	if (ret)
+		goto err1;
+
+	return da9058;
+
+err1:
+	da9058_irq_exit(da9058);
+err2:
+err3:
+err4:
+err5:
+	dev_err(da9058->dev, "failed to initialize devices: %d\n", ret);
+	return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(da9058_device_init);
+
+int da9058_device_exit(struct da9058 *da9058)
+{
+	free_irq(da9058_to_virt_irq_num(da9058, DA9058_IRQ_EADCEOM), da9058);
+
+	mfd_remove_devices(da9058->dev);
+
+	return da9058_irq_exit(da9058);
+}
+EXPORT_SYMBOL_GPL(da9058_device_exit);
diff --git a/drivers/mfd/da9058-i2c.c b/drivers/mfd/da9058-i2c.c
new file mode 100644
index 0000000..dd78dd0
--- /dev/null
+++ b/drivers/mfd/da9058-i2c.c
@@ -0,0 +1,102 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/regmap.h>
+
+#include <linux/mfd/da9058/version.h>
+#include <linux/mfd/da9058/core.h>
+#include <linux/mfd/da9058/i2c.h>
+
+static int __devinit da9058_i2c_probe(struct i2c_client *i2c,
+					const struct i2c_device_id *id)
+{
+	struct device *dev = &i2c->dev;
+	struct regmap *regmap;
+	void *da9058;
+	int ret;
+
+	regmap = devm_regmap_init_i2c(i2c, &da9058_regmap_config);
+
+	if (IS_ERR(regmap)) {
+		ret = PTR_ERR(regmap);
+		dev_err(dev, "Failed to allocate register map: %d\n", ret);
+		goto exit;
+	}
+
+	da9058 = da9058_device_init(dev, regmap, i2c->irq,
+				i2c->dev.platform_data);
+	if (IS_ERR(da9058)) {
+		ret = PTR_ERR(da9058);
+		dev_err(dev, "Failed to initialize da9058: %d\n", ret);
+		goto exit;
+	}
+
+	i2c_set_clientdata(i2c, da9058);
+	ret = 0;
+exit:
+	return ret;
+}
+
+static int da9058_i2c_remove(struct i2c_client *i2c)
+{
+	void *da9058 = i2c_get_clientdata(i2c);
+
+	if (!da9058)
+		return -ENODEV;
+
+	return da9058_device_exit(da9058);
+}
+
+static const struct i2c_device_id da9058_i2c_id[] = {
+	{"da9058", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(i2c, da9058_i2c_id);
+
+static struct i2c_driver da9058_i2c_driver = {
+	.driver = {
+		.name = "da9058",
+		.owner = THIS_MODULE,
+	},
+	.probe = da9058_i2c_probe,
+	.remove = da9058_i2c_remove,
+	.id_table = da9058_i2c_id,
+};
+
+/*
+ *  This driver is potentially initialised very early during bootup
+ */
+static int __init da9058_i2c_init(void)
+{
+	return i2c_add_driver(&da9058_i2c_driver);
+}
+
+subsys_initcall(da9058_i2c_init);
+
+static void __exit da9058_i2c_exit(void)
+{
+	i2c_del_driver(&da9058_i2c_driver);
+}
+
+module_exit(da9058_i2c_exit);
+
+MODULE_DESCRIPTION("Core/I2C support for the Dialog DA9058 PMIC");
+MODULE_AUTHOR("Anthony Olech <Anthony.Olech@diasemi.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:da9058");
diff --git a/drivers/mfd/da9058-irq.c b/drivers/mfd/da9058-irq.c
new file mode 100644
index 0000000..5792b35
--- /dev/null
+++ b/drivers/mfd/da9058-irq.c
@@ -0,0 +1,66 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/regmap.h>
+#include <linux/device.h>
+
+#include <linux/mfd/da9058/core.h>
+#include <linux/mfd/da9058/pdata.h>
+#include <linux/mfd/da9058/conf.h>
+
+int da9058_to_virt_irq_num(struct da9058 *da9058, int irq)
+{
+	return da9058->irq_base + irq;
+}
+EXPORT_SYMBOL_GPL(da9058_to_virt_irq_num);
+
+int __devinit da9058_irq_init(struct da9058 *da9058, int irq,
+				struct regmap_irq_chip *irq_chip)
+{
+	int ret;
+
+	da9058->chip_irq = irq;
+
+	if (!da9058->chip_irq) {
+		dev_err(da9058->dev, "No IRQ configured\n");
+		return -EINVAL;
+	}
+	if (!irq_chip) {
+		dev_err(da9058->dev, "No chip interrupt data specified\n");
+		return 0;
+	}
+
+	ret = regmap_add_irq_chip(da9058->regmap, da9058->chip_irq,
+					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+					-1, irq_chip, &da9058->irq_data);
+	if (ret != 0) {
+		dev_err(da9058->dev, "Failed to register IRQ chip: %d\n", ret);
+		return ret;
+	}
+
+	da9058->irq_base = regmap_irq_chip_get_base(da9058->irq_data);
+
+	dev_info(da9058->dev, "IRQ %d mapped to virtual array based at %d\n",
+			da9058->chip_irq, da9058->irq_base);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(da9058_irq_init);
+
+int da9058_irq_exit(struct da9058 *da9058)
+{
+	regmap_del_irq_chip(da9058->chip_irq, da9058->irq_data);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(da9058_irq_exit);
diff --git a/include/linux/mfd/da9058/bat.h b/include/linux/mfd/da9058/bat.h
new file mode 100644
index 0000000..71ebb56
--- /dev/null
+++ b/include/linux/mfd/da9058/bat.h
@@ -0,0 +1,33 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __D1982_BAT_H
+#define __D1982_BAT_H
+
+#define DA9058_LOOK_UP_TABLE_SIZE		68
+
+struct da9058_temp_capacity {
+	int temperature;
+	u32 capacity[DA9058_LOOK_UP_TABLE_SIZE][2];
+};
+
+struct da9058_power_table {
+	int temperature_points;
+	struct da9058_temp_capacity (*temp_tables)[];
+};
+
+struct da9058_power_pdata {
+	int battery_type;
+	int bat_low_limit;
+	int use_automatic_adc;
+	struct da9058_power_table *lookup_tables;
+};
+
+#endif /* __D1982_BAT_H */
diff --git a/include/linux/mfd/da9058/codec.h b/include/linux/mfd/da9058/codec.h
new file mode 100644
index 0000000..4f79788
--- /dev/null
+++ b/include/linux/mfd/da9058/codec.h
@@ -0,0 +1,21 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_CODEC_H
+#define __DA9058_CODEC_H
+
+struct da9058_codec_pdata {
+	int codec_irq;
+	int amplifier_initially_on;
+	int amp_control_reg;
+	int amp_enable_mask;
+};
+
+#endif /* __DA9058_CODEC_H */
diff --git a/include/linux/mfd/da9058/core.h b/include/linux/mfd/da9058/core.h
new file mode 100644
index 0000000..3383ca9
--- /dev/null
+++ b/include/linux/mfd/da9058/core.h
@@ -0,0 +1,69 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_CORE_H
+#define __DA9058_CORE_H
+
+#define DA9058_ADC_VBAT		0
+#define DA9058_ADC_TEMP		2
+#define DA9058_ADC_VF		4
+#define DA9058_ADC_ADCIN	5
+#define DA9058_ADC_TJUNC	8
+
+struct da9058 {
+	struct device *dev;
+	struct regmap *regmap;
+
+	int (*reg_read) (struct da9058 *da9058, u8 const reg, u8 *val);
+	int (*reg_write) (struct da9058 *da9058, u8 const reg, u8 val);
+	int (*reg_raw_read) (struct da9058 *da9058, u8 const reg,
+				u8 *val, size_t val_len);
+	int (*reg_raw_write) (struct da9058 *da9058, u8 const reg,
+				u8 *val, size_t val_len);
+	int (*reg_bulk_read) (struct da9058 *da9058, u8 const reg, u8 *val,
+				size_t val_count);
+	int (*reg_bulk_write) (struct da9058 *da9058, u8 const reg, u8 *val,
+				size_t val_count);
+	int (*reg_update_bits) (struct da9058 *da9058, u8 const reg,
+				u8 mask, u8 val);
+	int (*adc_read) (struct da9058 *da9058, int chnl, int mode, int *pval);
+
+	int chip_irq;
+	int irq_base;
+
+	struct regmap_irq_chip_data *irq_data;
+
+	struct mutex adc_mutex;
+	struct completion adc_read_done;
+};
+
+/*
+ * da9058 device IO
+ */
+#define da9058_set_bits(da9058, reg, mask) \
+	(da9058->reg_update_bits(da9058, reg, mask, 0xFF))
+#define da9058_clear_bits(da9058, reg, mask) \
+	(da9058->reg_update_bits(da9058, reg, mask, 0x00))
+#define da9058_update_bits(da9058, reg, mask, pval) \
+	(da9058->reg_update_bits(da9058, reg, mask, pval))
+
+#define da9058_bulk_read(da9058, reg, pval, count) \
+	(da9058->reg_bulk_read(da9058, reg, pval, count))
+#define da9058_bulk_write(da9058, reg, pval, count) \
+	(da9058->reg_bulk_write(da9058, reg, pval, count))
+
+#define da9058_reg_read(da9058, reg, pval) \
+	(da9058->reg_read(da9058, reg, pval))
+#define da9058_reg_write(da9058, reg, val) \
+	(da9058->reg_write(da9058, reg, val))
+#define da9058_adc_read(da9058, chnl, mode, pval) \
+	(da9058->adc_read(da9058, chnl, mode, pval))
+
+#endif /* __DA9058_CORE_H */
diff --git a/include/linux/mfd/da9058/gpio.h b/include/linux/mfd/da9058/gpio.h
new file mode 100644
index 0000000..b61eee7
--- /dev/null
+++ b/include/linux/mfd/da9058/gpio.h
@@ -0,0 +1,19 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __D1982_GPIO_H
+#define __D1982_GPIO_H
+
+struct da9058_gpio_pdata {
+	int ngpio;
+	int gpio_base;
+};
+
+#endif /* __D1982_GPIO_H */
diff --git a/include/linux/mfd/da9058/hwmon.h b/include/linux/mfd/da9058/hwmon.h
new file mode 100644
index 0000000..a18f4b3
--- /dev/null
+++ b/include/linux/mfd/da9058/hwmon.h
@@ -0,0 +1,20 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_HWMON_H
+#define __DA9058_HWMON_H
+
+struct da9058_hwmon_pdata {
+	int use_automatic_adc;
+	int temp_adc_resistance;
+	int vf_adc_resistance;
+};
+
+#endif /* __DA9058_HWMON_H */
diff --git a/include/linux/mfd/da9058/irq.h b/include/linux/mfd/da9058/irq.h
new file mode 100644
index 0000000..6e40b87
--- /dev/null
+++ b/include/linux/mfd/da9058/irq.h
@@ -0,0 +1,45 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_IRQ_H
+#define __DA9058_IRQ_H
+
+enum {
+
+DA9058_IRQ_EALRAM,
+DA9058_IRQ_ESEQRDY,
+DA9058_IRQ_ETICK,
+
+DA9058_IRQ_ENONKEY,
+DA9058_IRQ_EADCEOM,
+
+DA9058_IRQ_EGPI0,
+DA9058_IRQ_EGPI1,
+DA9058_IRQ_EAUDIO,
+
+DA9058_IRQ_EGPI2,
+DA9058_IRQ_EGPI3,
+DA9058_IRQ_EGPI4,
+DA9058_IRQ_EGPI5,
+
+DA9058_NUM_IRQ
+};
+
+/*
+ *  da9058 virtual threaded interrupts
+ *  the MFD component drivers or users of those drivers
+ *  (in the case of GPIOs) will call:
+ *  request_threaded_irq() and free_irq() directly using
+ *  the actual virtual threaded IRQ number which can be
+ *  obtained from the DA9058 PMIC relative (soft) IRQ number
+ */
+int da9058_to_virt_irq_num(struct da9058 *da9058, int irq);
+
+#endif /* __DA9058_IRQ_H */
diff --git a/include/linux/mfd/da9058/onkey.h b/include/linux/mfd/da9058/onkey.h
new file mode 100644
index 0000000..8b95117
--- /dev/null
+++ b/include/linux/mfd/da9058/onkey.h
@@ -0,0 +1,17 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_ONKEY_H
+#define __DA9058_ONKEY_H
+
+struct da9058_onkey_pdata {
+};
+
+#endif /* __DA9058_ONKEY_H */
diff --git a/include/linux/mfd/da9058/pdata.h b/include/linux/mfd/da9058/pdata.h
new file mode 100644
index 0000000..fa54167
--- /dev/null
+++ b/include/linux/mfd/da9058/pdata.h
@@ -0,0 +1,28 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_PDATA_H
+#define __DA9058_PDATA_H
+
+/*
+ *  This is the Platform Data for the DA9058 PMIC chip as a whole.
+ */
+struct da9058_chip_pdata {
+	int (*init_board_irq)(void);
+	char *platform_description;
+	int battery_type;
+	int bat_low_limit;
+	int use_automatic_adc;
+	int temp_adc_resistance;
+	int vf_adc_resistance;
+	struct da9058_power_table *lookup_tables;
+};
+
+#endif /* __DA9058_PDATA_H */
diff --git a/include/linux/mfd/da9058/registers.h b/include/linux/mfd/da9058/registers.h
new file mode 100644
index 0000000..0fd6aef
--- /dev/null
+++ b/include/linux/mfd/da9058/registers.h
@@ -0,0 +1,480 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_REGISTERS_H
+#define __DA9058_REGISTERS_H
+
+#define DA9058_PAGECON0_REG			0
+#define DA9058_STATUSA_REG			1
+#define DA9058_STATUSB_REG			2
+#define DA9058_STATUSC_REG			3
+#define DA9058_STATUSD_REG			4
+#define DA9058_EVENTA_REG			5
+#define DA9058_EVENTB_REG			6
+#define DA9058_EVENTC_REG			7
+#define DA9058_EVENTD_REG			8
+#define DA9058_FAULTLOG_REG			9
+#define DA9058_IRQMASKA_REG			10
+#define DA9058_IRQMASKB_REG			11
+#define DA9058_IRQMASKC_REG			12
+#define DA9058_IRQMASKD_REG			13
+#define DA9058_CONTROLA_REG			14
+#define DA9058_CONTROLB_REG			15
+#define DA9058_CONTROLC_REG			16
+#define DA9058_CONTROLD_REG			17
+#define DA9058_PDDIS_REG			18
+#define DA9058_INTERFACE_REG			19
+#define DA9058_RESET_REG			20
+#define DA9058_GPIO0001_REG			21
+
+#define DA9058_GPIO0203_REG			25
+#define DA9058_GPIO0405_REG			27
+
+#define DA9058_ID01_REG				29
+#define DA9058_ID23_REG				30
+#define DA9058_ID45_REG				31
+#define DA9058_ID67_REG				32
+#define DA9058_ID89_REG				33
+#define DA9058_ID1011_REG			34
+#define DA9058_ID1213_REG			35
+#define DA9058_ID1415_REG			36
+#define DA9058_ID1617_REG			37
+
+#define DA9058_SEQSTATUS_REG			40
+#define DA9058_SEQA_REG				41
+#define DA9058_SEQB_REG				42
+#define DA9058_SEQTIMER_REG			43
+#define DA9058_BUCKA_REG			44
+#define DA9058_BUCKB_REG			45
+#define DA9058_BUCK1_REG			46
+#define DA9058_BUCK2_REG			47
+#define DA9058_BUCK3_REG			48
+#define DA9058_BUCK4_REG			49
+#define DA9058_LDO1_REG				50
+#define DA9058_LDO2_REG				51
+#define DA9058_LDO3_REG				52
+#define DA9058_LDO4_REG				53
+#define DA9058_LDO5_REG				54
+#define DA9058_LDO6_REG				55
+#define DA9058_LDO7_REG				56
+#define DA9058_LDO8_REG				57
+#define DA9058_LDO9_REG				58
+#define DA9058_LDO10_REG			59
+#define DA9058_LDO12_REG			60
+#define DA9058_LDO13_REG			61
+#define DA9058_PULLDOWN_REG_A			62
+#define DA9058_PULLDOWN_REG_B			63
+#define DA9058_PULLDOWN_REG_C			64
+#define DA9058_LDO14_REG			65
+#define DA9058_LDO16_REG			66
+#define DA9058_LDO17_REG			67
+#define DA9058_LDO18_REG			68
+#define DA9058_LDO19_REG			69
+#define DA9058_SUPPLY_REG			70
+#define DA9058_WAITCONT_REG			71
+#define DA9058_ONKEYCONT_REG			72
+#define DA9058_POWERCONT_REG			73
+#define DA9058_AUDIO_CONF1_REG			74
+#define DA9058_AUDIO_CONF2_REG_A		75
+#define DA9058_AUDIO_CONF2_REG_B		76
+#define DA9058_BBATCONT_REG			77
+
+#define DA9058_ADCMAN_REG			81
+#define DA9058_ADCCONT_REG			82
+#define DA9058_ADCRESL_REG			83
+#define DA9058_ADCRESH_REG			84
+#define DA9058_VBATRES_REG_MSB			85
+
+#define DA9058_TEMPRES_REG_MSB			90
+
+#define DA9058_TOFFSET_REG			94
+#define DA9058_VREF_REG				95
+
+#define DA9058_ADCINRES_REG_MSB			98
+
+#define DA9058_TJUNCRES_REG			104
+#define DA9058_AUTORES_REG_1			105
+#define DA9058_AUTORES_REG_2			106
+#define DA9058_AUTORES_REG_3			107
+
+#define DA9058_COUNTS_REG			111
+#define DA9058_COUNTMI_REG			112
+#define DA9058_COUNTH_REG			113
+#define DA9058_COUNTD_REG			114
+#define DA9058_COUNTMO_REG			115
+#define DA9058_COUNTY_REG			116
+#define DA9058_ALARMS_REG			117
+#define DA9058_ALARMMI_REG			118
+#define DA9058_ALARMH_REG			119
+#define DA9058_ALARMD_REG			120
+#define DA9058_ALARMMO_REG			121
+#define DA9058_ALARMY_REG			122
+
+#define DA9058_PAGECON1_REG			128
+#define DA9058_CHIPID_REG			129
+#define DA9058_CONFIGID_REG			130
+#define DA9058_OTPCONT_REG			131
+#define DA9058_OSCTRIM_REG			132
+#define DA9058_GPID0_REG			133
+#define DA9058_GPID1_REG			134
+#define DA9058_GPID2_REG			135
+#define DA9058_GPID3_REG			136
+#define DA9058_GPID4_REG			137
+#define DA9058_GPID5_REG			138
+#define DA9058_GPID6_REG			139
+#define DA9058_GPID7_REG			140
+#define DA9058_GPID8_REG			141
+#define DA9058_GPID9_REG			142
+
+#define DA9058_PAGE0_REG_START			DA9058_STATUSA_REG
+#define DA9058_PAGE0_REG_END			DA9058_ALARMY_REG
+#define DA9058_PAGE1_REG_START			DA9058_CHIPID_REG
+#define DA9058_PAGE1_REG_END			DA9058_GPID9_REG
+#define DA9058_MAX_REGISTER_CNT			DA9058_PAGE1_REG_END
+
+/* STATUS REGISTER A */
+#define DA9058_STATUSA_NONKEY			(1<<0)
+/* STATUS REGISTER B */
+#define DA9058_STATUSB_SEQUENCING		(1<<6)
+/* STATUS REGISTER C */
+#define DA9058_STATUSC_INT_IN			(1<<2)
+#define DA9058_STATUSC_GPI1			(1<<1)
+#define DA9058_STATUSC_GPI0			(1<<0)
+/* STATUS REGISTER D */
+#define DA9058_STATUSD_GPI5			(1<<5)
+#define DA9058_STATUSD_GPI4			(1<<4)
+#define DA9058_STATUSD_GPI3			(1<<3)
+#define DA9058_STATUSD_GPI2			(1<<0)
+/* EVENT REGISTER A */
+#define DA9058_EVENTA_ETICK			(1<<7)
+#define DA9058_EVENTA_ESEQRDY			(1<<6)
+#define DA9058_EVENTA_EALRAM			(1<<5)
+/* EVENT REGISTER B */
+#define DA9058_EVENTB_EADCEOM			(1<<5)
+#define DA9058_EVENTB_ENONKEY			(1<<0)
+/* EVENT REGISTER C */
+#define DA9058_EVENTC_EAUDIO			(1<<2)
+#define DA9058_EVENTC_EGPI1			(1<<1)
+#define DA9058_EVENTC_EGPI0			(1<<0)
+/* EVENT REGISTER D */
+#define DA9058_EVENTC_EGPI5			(1<<5)
+#define DA9058_EVENTC_EGPI4			(1<<4)
+#define DA9058_EVENTC_EGPI3			(1<<3)
+#define DA9058_EVENTC_EGPI2			(1<<0)
+/* FAULT LOG REGISTER */
+#define DA9058_FAULTLOG_WAITSET			(1<<7)
+#define DA9058_FAULTLOG_KEYSHUT			(1<<5)
+#define DA9058_FAULTLOG_TEMPOVER		(1<<3)
+#define DA9058_FAULTLOG_VDDSTART		(1<<2)
+#define DA9058_FAULTLOG_VDDFAULT		(1<<1)
+#define DA9058_FAULTLOG_TWDERROR		(1<<0)
+/* IRQ_MASK REGISTER A */
+#define DA9058_IRQMASKA_MTICK			(1<<7)
+#define DA9058_IRQMASKA_MSEQRDY			(1<<6)
+#define DA9058_IRQMASKA_MALRAM			(1<<5)
+#define DA9058_IRQMASKA_BIT4			(1<<4)
+/* IRQ_MASK REGISTER B */
+#define DA9058_IRQMASKB_MADCEOM			(1<<5)
+#define DA9058_IRQMASKB_BIT4			(1<<4)
+#define DA9058_IRQMASKB_MNONKEY			(1<<0)
+/* IRQ_MASK REGISTER C */
+#define DA9058_IRQMASKC_MAUDIO			(1<<2)
+#define DA9058_IRQMASKC_MGPI1			(1<<1)
+#define DA9058_IRQMASKC_MGPI0			(1<<0)
+/* IRQ_MASK REGISTER D */
+#define DA9058_IRQMASKD_MGPI5			(1<<5)
+#define DA9058_IRQMASKD_MGPI4			(1<<4)
+#define DA9058_IRQMASKD_MGPI3			(1<<3)
+#define DA9058_IRQMASKD_MGPI2			(1<<0)
+/* CONTROL REGISTER A */
+#define DA9058_CONTROLA_GPIV			(1<<7)
+#define DA9058_CONTROLA_PMOTYPE			(1<<5)
+#define DA9058_CONTROLA_PMOPU			(1<<4)
+#define DA9058_CONTROLA_PMIV			(1<<3)
+#define DA9058_CONTROLA_PMIFV			(1<<3)
+#define DA9058_CONTROLA_PWR1EN			(1<<2)
+#define DA9058_CONTROLA_PWREN			(1<<1)
+#define DA9058_CONTROLA_SYSEN			(1<<0)
+/* CONTROL REGISTER B */
+#define DA9058_CONTROLB_SHUTDOWN		(1<<7)
+#define DA9058_CONTROLB_DEEPSLEEP		(1<<6)
+#define DA9058_CONTROLB_WRITEMODE		(1<<5)
+#define DA9058_CONTROLB_I2C1_SPEED		(1<<4)
+#define DA9058_CONTROLB_OTPREADEN		(1<<3)
+#define DA9058_CONTROLB_AUTOBOOT		(1<<2)
+/* CONTROL REGISTER C */
+#define DA9058_CONTROLC_DEBOUNCING		(7<<2)
+#define DA9058_CONTROLC_PMFBPIN			(1<<0)
+/* CONTROL REGISTER D */
+#define DA9058_CONTROLD_WATCHDOG		(1<<7)
+#define DA9058_CONTROLD_KEEPACTEN		(1<<3)
+#define DA9058_CONTROLD_TWDSCALE		(7<<0)
+/* POWER DOWN DISABLE REGISTER */
+#define DA9058_PDDIS_PMCONTPD			(1<<7)
+#define DA9058_PDDIS_OUT32KPD			(1<<6)
+#define DA9058_PDDIS_CHGBBATPD			(1<<5)
+#define DA9058_PDDIS_HSIFPD			(1<<3)
+#define DA9058_PDDIS_PMIFPD			(1<<2)
+#define DA9058_PDDIS_GPADCPD			(1<<1)
+#define DA9058_PDDIS_GPIOPD			(1<<0)
+/* INTERFACE REGISTER */
+#define DA9058_INTERFACE_IFBASEADDR		(7<<5)
+/* RESET REGISTER */
+#define DA9058_RESET_RESETEVENT			(3<<6)
+#define DA9058_RESET_RESETTIMER			(63<<0)
+/* GPIO control register for PIN 0 and 1 */
+#define DA9058_GPIO01_GPIO1MODE			(1<<7)
+#define DA9058_GPIO01_GPIO1TYPE			(1<<6)
+#define DA9058_GPIO01_GPIO1PIN			(3<<4)
+#define DA9058_GPIO01_GPIO0MODE			(1<<3)
+#define DA9058_GPIO01_GPIO0TYPE			(1<<2)
+#define DA9058_GPIO01_GPIO0PIN			(3<<0)
+/* GPIO control register for PIN 2 and 3 */
+#define DA9058_GPIO23_GPIO3MODE			(1<<7)
+#define DA9058_GPIO23_GPIO3TYPE			(1<<6)
+#define DA9058_GPIO23_GPIO3PIN			(3<<4)
+#define DA9058_GPIO23_GPIO2MODE			(1<<3)
+#define DA9058_GPIO23_GPIO2TYPE			(1<<2)
+#define DA9058_GPIO23_GPIO2PIN			(3<<0)
+/* GPIO control register for PIN 4 and 5 */
+#define DA9058_GPIO45_GPIO5MODE			(1<<7)
+#define DA9058_GPIO45_GPIO5TYPE			(1<<6)
+#define DA9058_GPIO45_GPIO5PIN			(3<<4)
+#define DA9058_GPIO45_GPIO4MODE			(1<<3)
+#define DA9058_GPIO45_GPIO4TYPE			(1<<2)
+#define DA9058_GPIO45_GPIO4PIN			(3<<0)
+/* BUCK and LDO fields */
+#define DA9058_BUCK_LDO_EN			(1<<6)
+#define DA9058_MAX_VSEL				0x3F
+/* SEQ control register for ID 0 and 1 */
+#define DA9058_ID01_LDO1STEP			(15<<4)
+#define DA9058_ID01_WAITIDALWAYS		(1<<2)
+#define DA9058_ID01_SYSPRE			(1<<2)
+#define DA9058_ID01_DEFSUPPLY			(1<<1)
+#define DA9058_ID01_nRESMODE			(1<<0)
+/* SEQ control register for ID 2 and 3 */
+#define DA9058_ID23_LDO3STEP			(15<<4)
+#define DA9058_ID23_LDO2STEP			(15<<0)
+/* SEQ control register for ID 4 and 5 */
+#define DA9058_ID45_LDO5STEP			(15<<4)
+#define DA9058_ID45_LDO4STEP			(15<<0)
+/* SEQ control register for ID 6 and 7 */
+#define DA9058_ID67_LDO7STEP			(15<<4)
+#define DA9058_ID67_LDO6STEP			(15<<0)
+/* SEQ control register for ID 8 and 9 */
+#define DA9058_ID89_LDO9STEP			(15<<4)
+#define DA9058_ID89_LDO8STEP			(15<<0)
+/* SEQ control register for ID 10 and 11 */
+#define DA9058_ID1011_PDDISSTEP			(15<<4)
+#define DA9058_ID1011_LDO10STEP			(15<<0)
+/* SEQ control register for ID 12 and 13 */
+#define DA9058_ID1213_LDO13STEP			(15<<4)
+#define DA9058_ID1213_LDO12STEP			(15<<0)
+/* SEQ control register for ID 14 and 15 */
+#define DA9058_ID1415_BUCK2			(15<<4)
+#define DA9058_ID1415_BUCK1			(15<<0)
+/* SEQ control register for ID 16 and 17 */
+#define DA9058_ID1617_BUCK4			(15<<4)
+#define DA9058_ID1617_BUCK3			(15<<0)
+/* Power SEQ Status register */
+#define DA9058_SEQSTATUS_SEQPOINTER		(15<<4)
+#define DA9058_SEQSTATUS_WAITSTEP		(15<<0)
+/* Power SEQ A register */
+#define DA9058_SEQA_POWEREND			(15<<4)
+#define DA9058_SEQA_SYSTEMEND			(15<<0)
+/* Power SEQ B register */
+#define DA9058_SEQB_PARTDOWN			(15<<4)
+#define DA9058_SEQB_MAXCOUNT			(15<<0)
+/* Power SEQ TIMER register */
+#define DA9058_SEQTIMER_SEQDUMMY		(15<<4)
+#define DA9058_SEQTIMER_SEQTIME			(15<<0)
+/* BUCK REGISTER A */
+#define DA9058_BUCKA_BUCK2ILIM			(3<<6)
+#define DA9058_BUCKA_BUCK2MODE			(3<<4)
+#define DA9058_BUCKA_BUCK1ILIM			(3<<2)
+#define DA9058_BUCKA_BUCK1MODE			(3<<0)
+/* BUCK REGISTER B */
+#define DA9058_BUCKB_BUCK4ILIM			(3<<6)
+#define DA9058_BUCKB_BUCK4IMODE			(3<<4)
+#define DA9058_BUCKB_BUCK3ILIM			(3<<2)
+#define DA9058_BUCKB_BUCK3MODE			(3<<0)
+/* SUPPLY REGISTER */
+#define DA9058_SUPPLY_VLOCK			(1<<7)
+#define DA9058_SUPPLY_LDO15BEN			(1<<6)
+#define DA9058_SUPPLY_LDO15AEN			(1<<5)
+#define DA9058_SUPPLY_BBCHGEN			(1<<4)
+#define DA9058_SUPPLY_VBUCK4GO			(1<<3)
+#define DA9058_SUPPLY_VBUCK3GO			(1<<2)
+#define DA9058_SUPPLY_VBUCK2GO			(1<<1)
+#define DA9058_SUPPLY_VBUCK1GO			(1<<0)
+/* PULLDOWN REGISTER A */
+#define DA9058_PULLDOWN_A_LDO4PDDIS		(1<<7)
+#define DA9058_PULLDOWN_A_LDO3PDDIS		(1<<6)
+#define DA9058_PULLDOWN_A_LDO2PDDIS		(1<<5)
+#define DA9058_PULLDOWN_A_LDO1PDDIS		(1<<4)
+#define DA9058_PULLDOWN_A_BUCK4PDDIS		(1<<3)
+#define DA9058_PULLDOWN_A_BUCK3PDDIS		(1<<2)
+#define DA9058_PULLDOWN_A_BUCK2PDDIS		(1<<1)
+#define DA9058_PULLDOWN_A_BUCK1PDDIS		(1<<0)
+/* PULLDOWN REGISTER B */
+#define DA9058_PULLDOWN_B_LDO13PDDIS		(1<<7)
+#define DA9058_PULLDOWN_B_LDO12PDDIS		(1<<6)
+#define DA9058_PULLDOWN_B_LDO10PDDIS		(1<<5)
+#define DA9058_PULLDOWN_B_LDO9PDDIS		(1<<4)
+#define DA9058_PULLDOWN_B_LDO8PDDIS		(1<<3)
+#define DA9058_PULLDOWN_B_LDO7PDDIS		(1<<2)
+#define DA9058_PULLDOWN_B_LDO6PDDIS		(1<<1)
+#define DA9058_PULLDOWN_B_LDO5PDDIS		(1<<0)
+/* PULLDOWN REGISTER C */
+#define DA9058_PULLDOWN_C_LDO19PDDIS		(1<<6)
+#define DA9058_PULLDOWN_C_LDO18PDDIS		(1<<5)
+#define DA9058_PULLDOWN_C_LDO17PDDIS		(1<<4)
+#define DA9058_PULLDOWN_C_LDO16PDDIS		(1<<3)
+#define DA9058_PULLDOWN_C_LDO15BPDDIS		(1<<2)
+#define DA9058_PULLDOWN_C_LDO15APDDIS		(1<<1)
+#define DA9058_PULLDOWN_C_LDO14PDDIS		(1<<0)
+/* WAIT CONTROL REGISTER */
+#define DA9058_WAITCONT_WAITDIR			(1<<7)
+#define DA9058_WAITCONT_RTCCLOCK		(1<<6)
+#define DA9058_WAITCONT_WAITMODE		(1<<5)
+#define DA9058_WAITCONT_EN32KOUT		(1<<4)
+#define DA9058_WAITCONT_DELAYTIME		(15<<0)
+/* ONKEY CONTROL REGISTER */
+#define DA9058_ONKEYCONT_PRESSTIME		(15<<0)
+/* POWER CONTROL REGISTER */
+#define DA9058_POWERCONT_nSLEEP			(1<<0)
+/* BACKUP BATTERY CONTROL REGISTER */
+#define DA9058_BBATCONT_BCHARGERISET		(15<<4)
+#define DA9058_BBATCONT_BCHARGERVSET		(15<<0)
+/* AUDIO CONF2 REGISTER */
+#define DA9058_AUDIOCONF_CLASSDEN		(1<<0)
+/* ADC MANUAL registers */
+#define DA9058_ADCMAN_MANCONV			(1<<4)
+#define DA9058_ADCMAN_MUXSEL_MASK		(0x0F)
+#define DA9058_ADCMAN_MUXSEL_VBAT		(0x0<<0)
+#define DA9058_ADCMAN_MUXSEL_TEMP		(0x2<<0)
+#define DA9058_ADCMAN_MUXSEL_VF			(0x4<<0)
+#define DA9058_ADCMAN_MUXSEL_ADCIN		(0x5<<0)
+#define DA9058_ADCMAN_MUXSEL_TJUNC		(0x8<<0)
+/* ADC CONTROL regsisters */
+#define DA9058_ADCCONT_AUTOADCEN		(1<<7)
+#define DA9058_ADCCONT_ADCMODE			(1<<6)
+#define DA9058_ADCCONT_TEMPISRCEN		(1<<5)
+#define DA9058_ADCCONT_VFISRCEN			(1<<4)
+#define DA9058_ADCCONT_AUTOAINEN		(1<<2)
+#define DA9058_ADCCONT_AUTOVFEN			(1<<1)
+#define DA9058_ADCCONT_AUTOVBATEN		(1<<0)
+/* ADC 12 BIT MANUAL CONVERSION RESULT LSB register */
+#define DA9058_ADCRESL_ADCRESLSB		(15<<0)
+#define DA9058_ADCRESL_ADCRESLSB_MASK		DA9058_ADCRESL_ADCRESLSB
+/* ADC 12 BIT MANUAL CONVERSION RESULT MSB register */
+#define DA9058_ADCRESH_ADCRESMSB			(255<<0)
+#define DA9058_ADCRESH_ADCRESMSB_MASK		DA9058_ADCRESH_ADCRESMSB
+/* VBAT 10 BIT RES MSB regsister*/
+#define DA9058_VBATRES_VBATRESMSB		(255<<0)
+#define DA9058_VBATRES_VBATRESMSB_MASK		DA9058_VBATRES_VBATRESMSB
+/* VBAT 10 BIT RES LSB regsister*/
+#define DA9058_VBATRES_VBATRESLSB		(3<<2)
+#define DA9058_VBATRES_VBATRESLSB_MASK		DA9058_VBATRES_VBATRESLSB
+/* TEMP 10 BIT RES MSB regsister*/
+#define DA9058_TEMPRES_TEMPRESMSB		(255<<0)
+#define DA9058_TEMPRES_TEMPRESMSB_MASK		DA9058_TEMPRES_TEMPRESMSB
+/* TEMP 10 BIT RES LSB regsister*/
+#define DA9058_TEMPRES_TEMPRESLSB		(3<<6)
+#define DA9058_TEMPRES_TEMPRESLSB_MASK		DA9058_TEMPRES_TEMPRESLSB
+/* T_OFFSET regsister*/
+#define DA9058_TOFFSET_TOFFSET			(255<<0)
+/* VF 10 BIT RES MSB regsister*/
+#define DA9058_VFRES_VFRESMSB			(255<<0)
+#define DA9058_VFRES_VFRESMSB_MASK		DA9058_VFRES_VFRESMSB
+/* VF 10 BIT RES LSB regsister*/
+#define DA9058_VFRES_VFRESLSB			(3<<2)
+#define DA9058_VFRES_VFRESLSB_MASK		DA9058_VFRES_VFRESLSB
+/* ADCIN 10 BIT RES MSB regsister*/
+#define DA9058_ADCINRES_ADCINRESMSB		(255<<0)
+#define DA9058_ADCINRES_ADCINRESMSB_MASK	DA9058_ADCINRES_ADCINRESMSB
+/* ADCIN 10 BIT RES LSB regsister*/
+#define DA9058_ADCINRES_ADCINRESLSB		(3<<6)
+#define DA9058_ADCINRES_ADCINRESLSB_MASK	DA9058_ADCINRES_ADCINRESLSB
+/* TJUNC 10 BIT RES MSB regsister*/
+#define DA9058_TJUNCRES_TJUNCRESMSB		(255<<0)
+#define DA9058_TJUNCRES_TJUNCRESMSB_MASK	DA9058_TJUNCRES_TJUNCRESMSB
+/* ADCIN 10 BIT RES LSB regsister*/
+#define DA9058_TJUNCRES_TJUNCRESLSB		(3<<6)
+#define DA9058_TJUNCRES_TJUNCRESLSB_MASK	DA9058_TJUNCRES_TJUNCRESLSB
+/* RTC fields */
+#define DA9058_RTC_SECS_MASK			0x3F
+#define DA9058_RTC_MINS_MASK			0x3F
+#define DA9058_RTC_HRS_MASK			0x1F
+#define DA9058_RTC_DAY_MASK			0x1F
+#define DA9058_RTC_MTH_MASK			0x0F
+#define DA9058_RTC_YRS_MASK			0x3F
+#define DA9058_RTC_ALMSECS_MASK			0x3F
+#define DA9058_RTC_ALMMINS_MASK			0x3F
+#define DA9058_RTC_ALMHRS_MASK			0x1F
+#define DA9058_RTC_ALMDAY_MASK			0x1F
+#define DA9058_RTC_ALMMTH_MASK			0x0F
+#define DA9058_RTC_ALMYRS_MASK			0x3F
+/* RTC TIMER SECONDS REGISTER */
+#define DA9058_COUNTS_COUNTSEC			(63<<0)
+/* RTC TIMER MINUTES REGISTER */
+#define DA9058_COUNTMI_COUNTMIN			(63<<0)
+/* RTC TIMER HOUR REGISTER */
+#define DA9058_COUNTH_COUNTHOUR			(31<<0)
+/* RTC TIMER DAYS REGISTER */
+#define DA9058_COUNTD_COUNTDAY			(31<<0)
+/* RTC TIMER MONTHS REGISTER */
+#define DA9058_COUNTMO_COUNTMONTH		(15<<0)
+/* RTC TIMER YEARS REGISTER */
+#define DA9058_COUNTY_MONITOR			(1<<6)
+#define DA9058_COUNTY_COUNTYEAR			(63<<0)
+/* RTC ALARM SECONDS REGISTER */
+#define DA9058_ALARMMI_COUNTSEC			(63<<0)
+/* RTC ALARM MINUTES REGISTER */
+#define DA9058_ALARMMI_TICKTYPE			(1<<7)
+#define DA9058_ALARMMI_ALARMMIN			(63<<0)
+/* RTC ALARM HOURS REGISTER */
+#define DA9058_ALARMH_ALARMHOUR			(31<<0)
+/* RTC ALARM DAYS REGISTER */
+#define DA9058_ALARMD_ALARMDAY			(31<<0)
+/* RTC ALARM MONTHS REGISTER */
+#define DA9058_ALARMMO_ALARMMONTH		(15<<0)
+/* RTC ALARM YEARS REGISTER */
+#define DA9058_ALARMY_TICKON			(1<<7)
+#define DA9058_ALARMY_ALARMON			(1<<6)
+#define DA9058_ALARMY_ALARMYEAR			(63<<0)
+/* CHIP IDENTIFICATION REGISTER */
+#define DA9058_CHIPID_MRC			(15<<4)
+#define DA9058_CHIPID_TRC			(15<<0)
+/* CONFIGURATION IDENTIFICATION REGISTER */
+#define DA9058_CONFIGID_CONFID			(7<<0)
+/* OTP CONTROL REGISTER */
+#define DA9058_OTPCONT_GPWRITEDIS		(1<<7)
+#define DA9058_OTPCONT_OTPCONFLOCK		(1<<6)
+#define DA9058_OTPCONT_OTPGPLOCK		(1<<5)
+#define DA9058_OTPCONT_OTPCONFG			(1<<3)
+#define DA9058_OTPCONT_OTPGP			(1<<2)
+#define DA9058_OTPCONT_OTPRP			(1<<1)
+#define DA9058_OTPCONT_OTPTRANSFER		(1<<0)
+/* RTC OSCILLATOR TRIM REGISTER */
+#define DA9058_OSCTRIM_TRIM32K			(255<<0)
+/* GP ID REGISTERs 0 - 9 */
+#define DA9058_GPID0_GP0			(255<<0)
+#define DA9058_GPID1_GP1			(255<<0)
+#define DA9058_GPID2_GP2			(255<<0)
+#define DA9058_GPID3_GP3			(255<<0)
+#define DA9058_GPID4_GP4			(255<<0)
+#define DA9058_GPID5_GP5			(255<<0)
+#define DA9058_GPID6_GP6			(255<<0)
+#define DA9058_GPID7_GP7			(255<<0)
+#define DA9058_GPID8_GP8			(255<<0)
+#define DA9058_GPID9_GP9			(255<<0)
+
+#endif /* __DA9058_REGISTERS_H */
diff --git a/include/linux/mfd/da9058/regulator.h b/include/linux/mfd/da9058/regulator.h
new file mode 100644
index 0000000..686c607
--- /dev/null
+++ b/include/linux/mfd/da9058/regulator.h
@@ -0,0 +1,33 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_REGULATOR_H
+#define __DA9058_REGULATOR_H
+
+struct da9058_regulator_pdata {
+	char *regulator_name;
+	int regulator_id;
+	int min_uV;
+	int max_uV;
+	int control_voltage_step;
+	int control_register;
+	int control_enable_mask;
+	int ramp_register;
+	int ramp_enable_mask;
+	int fixed_voltage;
+	unsigned int valid_ops_mask;
+	unsigned int valid_modes_mask;
+	unsigned int always_on:1;
+	unsigned int boot_on:1;
+	int num_consumer_supplies;
+	struct regulator_consumer_supply *consumer_supplies;
+};
+
+#endif /* __DA9058_REGULATOR_H */
diff --git a/include/linux/mfd/da9058/rtc.h b/include/linux/mfd/da9058/rtc.h
new file mode 100644
index 0000000..aa597df
--- /dev/null
+++ b/include/linux/mfd/da9058/rtc.h
@@ -0,0 +1,17 @@
+/*
+ *  Copyright (C) 2012 Dialog Semiconductor Ltd.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ */
+
+#ifndef __DA9058_RTC_H
+#define __DA9058_RTC_H
+
+struct da9058_rtc_pdata {
+};
+
+#endif /* __DA9058_RTC_H */
-- 
end-of-patch for NEW DRIVER V1


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

end of thread, other threads:[~2012-08-02 10:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-02  8:48 [NEW DRIVER V1 1/7] DA9058 MFD core and ADC driver Anthony Olech
2012-08-02 10:16 ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).