Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753562Ab2HBIuo (ORCPT ); Thu, 2 Aug 2012 04:50:44 -0400 Received: from mailrelay1.diasemi.com ([82.210.246.133]:44701 "EHLO mailrelay1.diasemi.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753385Ab2HBIt4 (ORCPT ); Thu, 2 Aug 2012 04:49:56 -0400 Message-Id: <201208020849.q728nhpW007804@latitude.olech.com> From: Anthony Olech Date: Thu, 2 Aug 2012 09:48:55 +0100 Subject: [NEW DRIVER V1 1/7] DA9058 MFD core and ADC driver To: Mark Brown Cc: LKML Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 44740 Lines: 1452 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) --- 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +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 "); +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 +#include +#include +#include +#include + +#include +#include +#include + +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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/