summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/drivers/hwmon/pmbus
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/drivers/hwmon/pmbus')
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/Kconfig124
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/Makefile15
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/adm1275.c397
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/lm25066.c321
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/ltc2978.c378
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/max16064.c127
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/max34440.c364
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/max8688.c204
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.c217
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.h376
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus_core.c1811
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9000.c246
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9200.c180
-rw-r--r--ANDROID_3.4.5/drivers/hwmon/pmbus/zl6100.c259
14 files changed, 0 insertions, 5019 deletions
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/Kconfig b/ANDROID_3.4.5/drivers/hwmon/pmbus/Kconfig
deleted file mode 100644
index 2ca6a5a4..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/Kconfig
+++ /dev/null
@@ -1,124 +0,0 @@
-#
-# PMBus chip drivers configuration
-#
-
-menuconfig PMBUS
- tristate "PMBus support"
- depends on I2C && EXPERIMENTAL
- default n
- help
- Say yes here if you want to enable PMBus support.
-
- This driver can also be built as a module. If so, the module will
- be called pmbus_core.
-
-if PMBUS
-
-config SENSORS_PMBUS
- tristate "Generic PMBus devices"
- default y
- help
- If you say yes here you get hardware monitoring support for generic
- PMBus devices, including but not limited to ADP4000, BMR453, BMR454,
- MDT040, NCP4200, NCP4208, PDT003, PDT006, PDT012, UDT020, TPS40400,
- and TPS40422.
-
- This driver can also be built as a module. If so, the module will
- be called pmbus.
-
-config SENSORS_ADM1275
- tristate "Analog Devices ADM1275 and compatibles"
- default n
- help
- If you say yes here you get hardware monitoring support for Analog
- Devices ADM1075, ADM1275, and ADM1276 Hot-Swap Controller and Digital
- Power Monitors.
-
- This driver can also be built as a module. If so, the module will
- be called adm1275.
-
-config SENSORS_LM25066
- tristate "National Semiconductor LM25066 and compatibles"
- default n
- help
- If you say yes here you get hardware monitoring support for National
- Semiconductor LM25066, LM5064, and LM5066.
-
- This driver can also be built as a module. If so, the module will
- be called lm25066.
-
-config SENSORS_LTC2978
- tristate "Linear Technologies LTC2978 and LTC3880"
- default n
- help
- If you say yes here you get hardware monitoring support for Linear
- Technology LTC2978 and LTC3880.
-
- This driver can also be built as a module. If so, the module will
- be called ltc2978.
-
-config SENSORS_MAX16064
- tristate "Maxim MAX16064"
- default n
- help
- If you say yes here you get hardware monitoring support for Maxim
- MAX16064.
-
- This driver can also be built as a module. If so, the module will
- be called max16064.
-
-config SENSORS_MAX34440
- tristate "Maxim MAX34440 and compatibles"
- default n
- help
- If you say yes here you get hardware monitoring support for Maxim
- MAX34440, MAX34441, and MAX34446.
-
- This driver can also be built as a module. If so, the module will
- be called max34440.
-
-config SENSORS_MAX8688
- tristate "Maxim MAX8688"
- default n
- help
- If you say yes here you get hardware monitoring support for Maxim
- MAX8688.
-
- This driver can also be built as a module. If so, the module will
- be called max8688.
-
-config SENSORS_UCD9000
- tristate "TI UCD90120, UCD90124, UCD9090, UCD90910"
- default n
- help
- If you say yes here you get hardware monitoring support for TI
- UCD90120, UCD90124, UCD9090, UCD90910 Sequencer and System Health
- Controllers.
-
- This driver can also be built as a module. If so, the module will
- be called ucd9000.
-
-config SENSORS_UCD9200
- tristate "TI UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, UCD9248"
- default n
- help
- If you say yes here you get hardware monitoring support for TI
- UCD9220, UCD9222, UCD9224, UCD9240, UCD9244, UCD9246, and UCD9248
- Digital PWM System Controllers.
-
- This driver can also be built as a module. If so, the module will
- be called ucd9200.
-
-config SENSORS_ZL6100
- tristate "Intersil ZL6100 and compatibles"
- default n
- help
- If you say yes here you get hardware monitoring support for Intersil
- ZL2004, ZL2005, ZL2006, ZL2008, ZL2105, ZL2106, ZL6100, ZL6105,
- ZL9101M, and ZL9117M Digital DC/DC Controllers, as well as for
- Ericsson BMR450, BMR451, BMR462, BMR463, and BMR464.
-
- This driver can also be built as a module. If so, the module will
- be called zl6100.
-
-endif # PMBUS
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/Makefile b/ANDROID_3.4.5/drivers/hwmon/pmbus/Makefile
deleted file mode 100644
index 789376c8..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Makefile for PMBus chip drivers.
-#
-
-obj-$(CONFIG_PMBUS) += pmbus_core.o
-obj-$(CONFIG_SENSORS_PMBUS) += pmbus.o
-obj-$(CONFIG_SENSORS_ADM1275) += adm1275.o
-obj-$(CONFIG_SENSORS_LM25066) += lm25066.o
-obj-$(CONFIG_SENSORS_LTC2978) += ltc2978.o
-obj-$(CONFIG_SENSORS_MAX16064) += max16064.o
-obj-$(CONFIG_SENSORS_MAX34440) += max34440.o
-obj-$(CONFIG_SENSORS_MAX8688) += max8688.o
-obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o
-obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o
-obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/adm1275.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/adm1275.c
deleted file mode 100644
index 60aad957..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/adm1275.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * Hardware monitoring driver for Analog Devices ADM1275 Hot-Swap Controller
- * and Digital Power Monitor
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-enum chips { adm1075, adm1275, adm1276 };
-
-#define ADM1275_PEAK_IOUT 0xd0
-#define ADM1275_PEAK_VIN 0xd1
-#define ADM1275_PEAK_VOUT 0xd2
-#define ADM1275_PMON_CONFIG 0xd4
-
-#define ADM1275_VIN_VOUT_SELECT (1 << 6)
-#define ADM1275_VRANGE (1 << 5)
-#define ADM1075_IRANGE_50 (1 << 4)
-#define ADM1075_IRANGE_25 (1 << 3)
-#define ADM1075_IRANGE_MASK ((1 << 3) | (1 << 4))
-
-#define ADM1275_IOUT_WARN2_LIMIT 0xd7
-#define ADM1275_DEVICE_CONFIG 0xd8
-
-#define ADM1275_IOUT_WARN2_SELECT (1 << 4)
-
-#define ADM1276_PEAK_PIN 0xda
-
-#define ADM1275_MFR_STATUS_IOUT_WARN2 (1 << 0)
-
-#define ADM1075_READ_VAUX 0xdd
-#define ADM1075_VAUX_OV_WARN_LIMIT 0xde
-#define ADM1075_VAUX_UV_WARN_LIMIT 0xdf
-#define ADM1075_VAUX_STATUS 0xf6
-
-#define ADM1075_VAUX_OV_WARN (1<<7)
-#define ADM1075_VAUX_UV_WARN (1<<6)
-
-struct adm1275_data {
- int id;
- bool have_oc_fault;
- struct pmbus_driver_info info;
-};
-
-#define to_adm1275_data(x) container_of(x, struct adm1275_data, info)
-
-static int adm1275_read_word_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- const struct adm1275_data *data = to_adm1275_data(info);
- int ret = 0;
-
- if (page)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_IOUT_UC_FAULT_LIMIT:
- if (data->have_oc_fault) {
- ret = -ENXIO;
- break;
- }
- ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
- break;
- case PMBUS_IOUT_OC_FAULT_LIMIT:
- if (!data->have_oc_fault) {
- ret = -ENXIO;
- break;
- }
- ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT);
- break;
- case PMBUS_VOUT_OV_WARN_LIMIT:
- if (data->id != adm1075) {
- ret = -ENODATA;
- break;
- }
- ret = pmbus_read_word_data(client, 0,
- ADM1075_VAUX_OV_WARN_LIMIT);
- break;
- case PMBUS_VOUT_UV_WARN_LIMIT:
- if (data->id != adm1075) {
- ret = -ENODATA;
- break;
- }
- ret = pmbus_read_word_data(client, 0,
- ADM1075_VAUX_UV_WARN_LIMIT);
- break;
- case PMBUS_READ_VOUT:
- if (data->id != adm1075) {
- ret = -ENODATA;
- break;
- }
- ret = pmbus_read_word_data(client, 0, ADM1075_READ_VAUX);
- break;
- case PMBUS_VIRT_READ_IOUT_MAX:
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT);
- break;
- case PMBUS_VIRT_READ_VOUT_MAX:
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT);
- break;
- case PMBUS_VIRT_READ_VIN_MAX:
- ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN);
- break;
- case PMBUS_VIRT_READ_PIN_MAX:
- if (data->id == adm1275) {
- ret = -ENXIO;
- break;
- }
- ret = pmbus_read_word_data(client, 0, ADM1276_PEAK_PIN);
- break;
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- case PMBUS_VIRT_RESET_VIN_HISTORY:
- break;
- case PMBUS_VIRT_RESET_PIN_HISTORY:
- if (data->id == adm1275)
- ret = -ENXIO;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int adm1275_write_word_data(struct i2c_client *client, int page, int reg,
- u16 word)
-{
- int ret;
-
- if (page)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_IOUT_UC_FAULT_LIMIT:
- case PMBUS_IOUT_OC_FAULT_LIMIT:
- ret = pmbus_write_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT,
- word);
- break;
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_IOUT, 0);
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VOUT, 0);
- break;
- case PMBUS_VIRT_RESET_VIN_HISTORY:
- ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0);
- break;
- case PMBUS_VIRT_RESET_PIN_HISTORY:
- ret = pmbus_write_word_data(client, 0, ADM1276_PEAK_PIN, 0);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int adm1275_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- const struct adm1275_data *data = to_adm1275_data(info);
- int mfr_status, ret;
-
- if (page > 0)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_STATUS_IOUT:
- ret = pmbus_read_byte_data(client, page, PMBUS_STATUS_IOUT);
- if (ret < 0)
- break;
- mfr_status = pmbus_read_byte_data(client, page,
- PMBUS_STATUS_MFR_SPECIFIC);
- if (mfr_status < 0) {
- ret = mfr_status;
- break;
- }
- if (mfr_status & ADM1275_MFR_STATUS_IOUT_WARN2) {
- ret |= data->have_oc_fault ?
- PB_IOUT_OC_FAULT : PB_IOUT_UC_FAULT;
- }
- break;
- case PMBUS_STATUS_VOUT:
- if (data->id != adm1075) {
- ret = -ENODATA;
- break;
- }
- ret = 0;
- mfr_status = pmbus_read_byte_data(client, 0,
- ADM1075_VAUX_STATUS);
- if (mfr_status & ADM1075_VAUX_OV_WARN)
- ret |= PB_VOLTAGE_OV_WARNING;
- if (mfr_status & ADM1075_VAUX_UV_WARN)
- ret |= PB_VOLTAGE_UV_WARNING;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static const struct i2c_device_id adm1275_id[] = {
- { "adm1075", adm1075 },
- { "adm1275", adm1275 },
- { "adm1276", adm1276 },
- { }
-};
-MODULE_DEVICE_TABLE(i2c, adm1275_id);
-
-static int adm1275_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
- int config, device_config;
- int ret;
- struct pmbus_driver_info *info;
- struct adm1275_data *data;
- const struct i2c_device_id *mid;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_READ_BYTE_DATA
- | I2C_FUNC_SMBUS_BLOCK_DATA))
- return -ENODEV;
-
- ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, block_buffer);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read Manufacturer ID\n");
- return ret;
- }
- if (ret != 3 || strncmp(block_buffer, "ADI", 3)) {
- dev_err(&client->dev, "Unsupported Manufacturer ID\n");
- return -ENODEV;
- }
-
- ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, block_buffer);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read Manufacturer Model\n");
- return ret;
- }
- for (mid = adm1275_id; mid->name[0]; mid++) {
- if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
- break;
- }
- if (!mid->name[0]) {
- dev_err(&client->dev, "Unsupported device\n");
- return -ENODEV;
- }
-
- if (id->driver_data != mid->driver_data)
- dev_notice(&client->dev,
- "Device mismatch: Configured %s, detected %s\n",
- id->name, mid->name);
-
- config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
- if (config < 0)
- return config;
-
- device_config = i2c_smbus_read_byte_data(client, ADM1275_DEVICE_CONFIG);
- if (device_config < 0)
- return device_config;
-
- data = devm_kzalloc(&client->dev, sizeof(struct adm1275_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
-
- data->id = mid->driver_data;
-
- info = &data->info;
-
- info->pages = 1;
- info->format[PSC_VOLTAGE_IN] = direct;
- info->format[PSC_VOLTAGE_OUT] = direct;
- info->format[PSC_CURRENT_OUT] = direct;
- info->m[PSC_CURRENT_OUT] = 807;
- info->b[PSC_CURRENT_OUT] = 20475;
- info->R[PSC_CURRENT_OUT] = -1;
- info->func[0] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
-
- info->read_word_data = adm1275_read_word_data;
- info->read_byte_data = adm1275_read_byte_data;
- info->write_word_data = adm1275_write_word_data;
-
- if (data->id == adm1075) {
- info->m[PSC_VOLTAGE_IN] = 27169;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -1;
- info->m[PSC_VOLTAGE_OUT] = 27169;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -1;
- } else if (config & ADM1275_VRANGE) {
- info->m[PSC_VOLTAGE_IN] = 19199;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -2;
- info->m[PSC_VOLTAGE_OUT] = 19199;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -2;
- } else {
- info->m[PSC_VOLTAGE_IN] = 6720;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -1;
- info->m[PSC_VOLTAGE_OUT] = 6720;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -1;
- }
-
- if (device_config & ADM1275_IOUT_WARN2_SELECT)
- data->have_oc_fault = true;
-
- switch (data->id) {
- case adm1075:
- info->format[PSC_POWER] = direct;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -1;
- switch (config & ADM1075_IRANGE_MASK) {
- case ADM1075_IRANGE_25:
- info->m[PSC_POWER] = 8549;
- info->m[PSC_CURRENT_OUT] = 806;
- break;
- case ADM1075_IRANGE_50:
- info->m[PSC_POWER] = 4279;
- info->m[PSC_CURRENT_OUT] = 404;
- break;
- default:
- dev_err(&client->dev, "Invalid input current range");
- info->m[PSC_POWER] = 0;
- info->m[PSC_CURRENT_OUT] = 0;
- break;
- }
- info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN
- | PMBUS_HAVE_STATUS_INPUT;
- if (config & ADM1275_VIN_VOUT_SELECT)
- info->func[0] |=
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
- break;
- case adm1275:
- if (config & ADM1275_VIN_VOUT_SELECT)
- info->func[0] |=
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
- else
- info->func[0] |=
- PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT;
- break;
- case adm1276:
- info->format[PSC_POWER] = direct;
- info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN
- | PMBUS_HAVE_STATUS_INPUT;
- if (config & ADM1275_VIN_VOUT_SELECT)
- info->func[0] |=
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
- if (config & ADM1275_VRANGE) {
- info->m[PSC_POWER] = 6043;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -2;
- } else {
- info->m[PSC_POWER] = 2115;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -1;
- }
- break;
- }
-
- return pmbus_do_probe(client, id, info);
-}
-
-static struct i2c_driver adm1275_driver = {
- .driver = {
- .name = "adm1275",
- },
- .probe = adm1275_probe,
- .remove = pmbus_do_remove,
- .id_table = adm1275_id,
-};
-
-module_i2c_driver(adm1275_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1275 and compatibles");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/lm25066.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/lm25066.c
deleted file mode 100644
index c2993927..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/lm25066.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Hardware monitoring driver for LM25066 / LM5064 / LM5066
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-enum chips { lm25066, lm5064, lm5066 };
-
-#define LM25066_READ_VAUX 0xd0
-#define LM25066_MFR_READ_IIN 0xd1
-#define LM25066_MFR_READ_PIN 0xd2
-#define LM25066_MFR_IIN_OC_WARN_LIMIT 0xd3
-#define LM25066_MFR_PIN_OP_WARN_LIMIT 0xd4
-#define LM25066_READ_PIN_PEAK 0xd5
-#define LM25066_CLEAR_PIN_PEAK 0xd6
-#define LM25066_DEVICE_SETUP 0xd9
-#define LM25066_READ_AVG_VIN 0xdc
-#define LM25066_READ_AVG_VOUT 0xdd
-#define LM25066_READ_AVG_IIN 0xde
-#define LM25066_READ_AVG_PIN 0xdf
-
-#define LM25066_DEV_SETUP_CL (1 << 4) /* Current limit */
-
-struct lm25066_data {
- int id;
- struct pmbus_driver_info info;
-};
-
-#define to_lm25066_data(x) container_of(x, struct lm25066_data, info)
-
-static int lm25066_read_word_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- const struct lm25066_data *data = to_lm25066_data(info);
- int ret;
-
- if (page > 1)
- return -ENXIO;
-
- /* Map READ_VAUX into READ_VOUT register on page 1 */
- if (page == 1) {
- switch (reg) {
- case PMBUS_READ_VOUT:
- ret = pmbus_read_word_data(client, 0,
- LM25066_READ_VAUX);
- if (ret < 0)
- break;
- /* Adjust returned value to match VOUT coefficients */
- switch (data->id) {
- case lm25066:
- /* VOUT: 4.54 mV VAUX: 283.2 uV LSB */
- ret = DIV_ROUND_CLOSEST(ret * 2832, 45400);
- break;
- case lm5064:
- /* VOUT: 4.53 mV VAUX: 700 uV LSB */
- ret = DIV_ROUND_CLOSEST(ret * 70, 453);
- break;
- case lm5066:
- /* VOUT: 2.18 mV VAUX: 725 uV LSB */
- ret = DIV_ROUND_CLOSEST(ret * 725, 2180);
- break;
- }
- break;
- default:
- /* No other valid registers on page 1 */
- ret = -ENXIO;
- break;
- }
- goto done;
- }
-
- switch (reg) {
- case PMBUS_READ_IIN:
- ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_IIN);
- break;
- case PMBUS_READ_PIN:
- ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_PIN);
- break;
- case PMBUS_IIN_OC_WARN_LIMIT:
- ret = pmbus_read_word_data(client, 0,
- LM25066_MFR_IIN_OC_WARN_LIMIT);
- break;
- case PMBUS_PIN_OP_WARN_LIMIT:
- ret = pmbus_read_word_data(client, 0,
- LM25066_MFR_PIN_OP_WARN_LIMIT);
- break;
- case PMBUS_VIRT_READ_VIN_AVG:
- ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VIN);
- break;
- case PMBUS_VIRT_READ_VOUT_AVG:
- ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VOUT);
- break;
- case PMBUS_VIRT_READ_IIN_AVG:
- ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_IIN);
- break;
- case PMBUS_VIRT_READ_PIN_AVG:
- ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_PIN);
- break;
- case PMBUS_VIRT_READ_PIN_MAX:
- ret = pmbus_read_word_data(client, 0, LM25066_READ_PIN_PEAK);
- break;
- case PMBUS_VIRT_RESET_PIN_HISTORY:
- ret = 0;
- break;
- default:
- ret = -ENODATA;
- break;
- }
-done:
- return ret;
-}
-
-static int lm25066_write_word_data(struct i2c_client *client, int page, int reg,
- u16 word)
-{
- int ret;
-
- if (page > 1)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_IIN_OC_WARN_LIMIT:
- ret = pmbus_write_word_data(client, 0,
- LM25066_MFR_IIN_OC_WARN_LIMIT,
- word);
- break;
- case PMBUS_PIN_OP_WARN_LIMIT:
- ret = pmbus_write_word_data(client, 0,
- LM25066_MFR_PIN_OP_WARN_LIMIT,
- word);
- break;
- case PMBUS_VIRT_RESET_PIN_HISTORY:
- ret = pmbus_write_byte(client, 0, LM25066_CLEAR_PIN_PEAK);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int lm25066_write_byte(struct i2c_client *client, int page, u8 value)
-{
- if (page > 1)
- return -ENXIO;
-
- if (page <= 0)
- return pmbus_write_byte(client, page, value);
-
- return 0;
-}
-
-static int lm25066_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- int config;
- struct lm25066_data *data;
- struct pmbus_driver_info *info;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_READ_BYTE_DATA))
- return -ENODEV;
-
- data = devm_kzalloc(&client->dev, sizeof(struct lm25066_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
-
- config = i2c_smbus_read_byte_data(client, LM25066_DEVICE_SETUP);
- if (config < 0)
- return config;
-
- data->id = id->driver_data;
- info = &data->info;
-
- info->pages = 2;
- info->format[PSC_VOLTAGE_IN] = direct;
- info->format[PSC_VOLTAGE_OUT] = direct;
- info->format[PSC_CURRENT_IN] = direct;
- info->format[PSC_TEMPERATURE] = direct;
- info->format[PSC_POWER] = direct;
-
- info->m[PSC_TEMPERATURE] = 16;
- info->b[PSC_TEMPERATURE] = 0;
- info->R[PSC_TEMPERATURE] = 0;
-
- info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT
- | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_PIN | PMBUS_HAVE_IIN
- | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
- info->func[1] = PMBUS_HAVE_VOUT;
-
- info->read_word_data = lm25066_read_word_data;
- info->write_word_data = lm25066_write_word_data;
- info->write_byte = lm25066_write_byte;
-
- switch (id->driver_data) {
- case lm25066:
- info->m[PSC_VOLTAGE_IN] = 22070;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -2;
- info->m[PSC_VOLTAGE_OUT] = 22070;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -2;
-
- if (config & LM25066_DEV_SETUP_CL) {
- info->m[PSC_CURRENT_IN] = 6852;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 369;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -2;
- } else {
- info->m[PSC_CURRENT_IN] = 13661;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 736;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -2;
- }
- break;
- case lm5064:
- info->m[PSC_VOLTAGE_IN] = 22075;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -2;
- info->m[PSC_VOLTAGE_OUT] = 22075;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -2;
-
- if (config & LM25066_DEV_SETUP_CL) {
- info->m[PSC_CURRENT_IN] = 6713;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 3619;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -3;
- } else {
- info->m[PSC_CURRENT_IN] = 13426;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 7238;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -3;
- }
- break;
- case lm5066:
- info->m[PSC_VOLTAGE_IN] = 4587;
- info->b[PSC_VOLTAGE_IN] = 0;
- info->R[PSC_VOLTAGE_IN] = -2;
- info->m[PSC_VOLTAGE_OUT] = 4587;
- info->b[PSC_VOLTAGE_OUT] = 0;
- info->R[PSC_VOLTAGE_OUT] = -2;
-
- if (config & LM25066_DEV_SETUP_CL) {
- info->m[PSC_CURRENT_IN] = 10753;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 1204;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -3;
- } else {
- info->m[PSC_CURRENT_IN] = 5405;
- info->b[PSC_CURRENT_IN] = 0;
- info->R[PSC_CURRENT_IN] = -2;
- info->m[PSC_POWER] = 605;
- info->b[PSC_POWER] = 0;
- info->R[PSC_POWER] = -3;
- }
- break;
- default:
- return -ENODEV;
- }
-
- return pmbus_do_probe(client, id, info);
-}
-
-static const struct i2c_device_id lm25066_id[] = {
- {"lm25066", lm25066},
- {"lm5064", lm5064},
- {"lm5066", lm5066},
- { }
-};
-
-MODULE_DEVICE_TABLE(i2c, lm25066_id);
-
-/* This is the driver that will be inserted */
-static struct i2c_driver lm25066_driver = {
- .driver = {
- .name = "lm25066",
- },
- .probe = lm25066_probe,
- .remove = pmbus_do_remove,
- .id_table = lm25066_id,
-};
-
-module_i2c_driver(lm25066_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for LM25066/LM5064/LM5066");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/ltc2978.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/ltc2978.c
deleted file mode 100644
index 9652a2c9..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/ltc2978.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Hardware monitoring driver for LTC2978 and LTC3880
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-enum chips { ltc2978, ltc3880 };
-
-/* LTC2978 and LTC3880 */
-#define LTC2978_MFR_VOUT_PEAK 0xdd
-#define LTC2978_MFR_VIN_PEAK 0xde
-#define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
-#define LTC2978_MFR_SPECIAL_ID 0xe7
-
-/* LTC2978 only */
-#define LTC2978_MFR_VOUT_MIN 0xfb
-#define LTC2978_MFR_VIN_MIN 0xfc
-#define LTC2978_MFR_TEMPERATURE_MIN 0xfd
-
-/* LTC3880 only */
-#define LTC3880_MFR_IOUT_PEAK 0xd7
-#define LTC3880_MFR_CLEAR_PEAKS 0xe3
-#define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
-
-#define LTC2978_ID_REV1 0x0121
-#define LTC2978_ID_REV2 0x0122
-#define LTC3880_ID 0x4000
-#define LTC3880_ID_MASK 0xff00
-
-/*
- * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
- * happens pretty much each time chip data is updated. Raw peak data therefore
- * does not provide much value. To be able to provide useful peak data, keep an
- * internal cache of measured peak data, which is only cleared if an explicit
- * "clear peak" command is executed for the sensor in question.
- */
-struct ltc2978_data {
- enum chips id;
- int vin_min, vin_max;
- int temp_min, temp_max;
- int vout_min[8], vout_max[8];
- int iout_max[2];
- int temp2_max[2];
- struct pmbus_driver_info info;
-};
-
-#define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
-
-static inline int lin11_to_val(int data)
-{
- s16 e = ((s16)data) >> 11;
- s32 m = (((s16)(data << 5)) >> 5);
-
- /*
- * mantissa is 10 bit + sign, exponent adds up to 15 bit.
- * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
- */
- e += 6;
- return (e < 0 ? m >> -e : m << e);
-}
-
-static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
- int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct ltc2978_data *data = to_ltc2978_data(info);
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_READ_VIN_MAX:
- ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_PEAK);
- if (ret >= 0) {
- if (lin11_to_val(ret) > lin11_to_val(data->vin_max))
- data->vin_max = ret;
- ret = data->vin_max;
- }
- break;
- case PMBUS_VIRT_READ_VOUT_MAX:
- ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
- if (ret >= 0) {
- /*
- * VOUT is 16 bit unsigned with fixed exponent,
- * so we can compare it directly
- */
- if (ret > data->vout_max[page])
- data->vout_max[page] = ret;
- ret = data->vout_max[page];
- }
- break;
- case PMBUS_VIRT_READ_TEMP_MAX:
- ret = pmbus_read_word_data(client, page,
- LTC2978_MFR_TEMPERATURE_PEAK);
- if (ret >= 0) {
- if (lin11_to_val(ret) > lin11_to_val(data->temp_max))
- data->temp_max = ret;
- ret = data->temp_max;
- }
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- case PMBUS_VIRT_RESET_VIN_HISTORY:
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = 0;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct ltc2978_data *data = to_ltc2978_data(info);
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_READ_VIN_MIN:
- ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_MIN);
- if (ret >= 0) {
- if (lin11_to_val(ret) < lin11_to_val(data->vin_min))
- data->vin_min = ret;
- ret = data->vin_min;
- }
- break;
- case PMBUS_VIRT_READ_VOUT_MIN:
- ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
- if (ret >= 0) {
- /*
- * VOUT_MIN is known to not be supported on some lots
- * of LTC2978 revision 1, and will return the maximum
- * possible voltage if read. If VOUT_MAX is valid and
- * lower than the reading of VOUT_MIN, use it instead.
- */
- if (data->vout_max[page] && ret > data->vout_max[page])
- ret = data->vout_max[page];
- if (ret < data->vout_min[page])
- data->vout_min[page] = ret;
- ret = data->vout_min[page];
- }
- break;
- case PMBUS_VIRT_READ_TEMP_MIN:
- ret = pmbus_read_word_data(client, page,
- LTC2978_MFR_TEMPERATURE_MIN);
- if (ret >= 0) {
- if (lin11_to_val(ret)
- < lin11_to_val(data->temp_min))
- data->temp_min = ret;
- ret = data->temp_min;
- }
- break;
- case PMBUS_VIRT_READ_IOUT_MAX:
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- case PMBUS_VIRT_READ_TEMP2_MAX:
- case PMBUS_VIRT_RESET_TEMP2_HISTORY:
- ret = -ENXIO;
- break;
- default:
- ret = ltc2978_read_word_data_common(client, page, reg);
- break;
- }
- return ret;
-}
-
-static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct ltc2978_data *data = to_ltc2978_data(info);
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_READ_IOUT_MAX:
- ret = pmbus_read_word_data(client, page, LTC3880_MFR_IOUT_PEAK);
- if (ret >= 0) {
- if (lin11_to_val(ret)
- > lin11_to_val(data->iout_max[page]))
- data->iout_max[page] = ret;
- ret = data->iout_max[page];
- }
- break;
- case PMBUS_VIRT_READ_TEMP2_MAX:
- ret = pmbus_read_word_data(client, page,
- LTC3880_MFR_TEMPERATURE2_PEAK);
- if (ret >= 0) {
- if (lin11_to_val(ret)
- > lin11_to_val(data->temp2_max[page]))
- data->temp2_max[page] = ret;
- ret = data->temp2_max[page];
- }
- break;
- case PMBUS_VIRT_READ_VIN_MIN:
- case PMBUS_VIRT_READ_VOUT_MIN:
- case PMBUS_VIRT_READ_TEMP_MIN:
- ret = -ENXIO;
- break;
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- case PMBUS_VIRT_RESET_TEMP2_HISTORY:
- ret = 0;
- break;
- default:
- ret = ltc2978_read_word_data_common(client, page, reg);
- break;
- }
- return ret;
-}
-
-static int ltc2978_clear_peaks(struct i2c_client *client, int page,
- enum chips id)
-{
- int ret;
-
- if (id == ltc2978)
- ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
- else
- ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
-
- return ret;
-}
-
-static int ltc2978_write_word_data(struct i2c_client *client, int page,
- int reg, u16 word)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct ltc2978_data *data = to_ltc2978_data(info);
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- data->iout_max[page] = 0x7fff;
- ret = ltc2978_clear_peaks(client, page, data->id);
- break;
- case PMBUS_VIRT_RESET_TEMP2_HISTORY:
- data->temp2_max[page] = 0x7fff;
- ret = ltc2978_clear_peaks(client, page, data->id);
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- data->vout_min[page] = 0xffff;
- data->vout_max[page] = 0;
- ret = ltc2978_clear_peaks(client, page, data->id);
- break;
- case PMBUS_VIRT_RESET_VIN_HISTORY:
- data->vin_min = 0x7bff;
- data->vin_max = 0;
- ret = ltc2978_clear_peaks(client, page, data->id);
- break;
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- data->temp_min = 0x7bff;
- data->temp_max = 0x7fff;
- ret = ltc2978_clear_peaks(client, page, data->id);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static const struct i2c_device_id ltc2978_id[] = {
- {"ltc2978", ltc2978},
- {"ltc3880", ltc3880},
- {}
-};
-MODULE_DEVICE_TABLE(i2c, ltc2978_id);
-
-static int ltc2978_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- int chip_id, i;
- struct ltc2978_data *data;
- struct pmbus_driver_info *info;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_READ_WORD_DATA))
- return -ENODEV;
-
- data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
-
- chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
- if (chip_id < 0)
- return chip_id;
-
- if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2) {
- data->id = ltc2978;
- } else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID) {
- data->id = ltc3880;
- } else {
- dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
- return -ENODEV;
- }
- if (data->id != id->driver_data)
- dev_warn(&client->dev,
- "Device mismatch: Configured %s, detected %s\n",
- id->name,
- ltc2978_id[data->id].name);
-
- info = &data->info;
- info->write_word_data = ltc2978_write_word_data;
-
- data->vout_min[0] = 0xffff;
- data->vin_min = 0x7bff;
- data->temp_min = 0x7bff;
- data->temp_max = 0x7fff;
-
- switch (id->driver_data) {
- case ltc2978:
- info->read_word_data = ltc2978_read_word_data;
- info->pages = 8;
- info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
- | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
- for (i = 1; i < 8; i++) {
- info->func[i] = PMBUS_HAVE_VOUT
- | PMBUS_HAVE_STATUS_VOUT;
- data->vout_min[i] = 0xffff;
- }
- break;
- case ltc3880:
- info->read_word_data = ltc3880_read_word_data;
- info->pages = 2;
- info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
- | PMBUS_HAVE_STATUS_INPUT
- | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
- | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
- | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
- info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
- | PMBUS_HAVE_POUT
- | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
- data->vout_min[1] = 0xffff;
- break;
- default:
- return -ENODEV;
- }
-
- return pmbus_do_probe(client, id, info);
-}
-
-/* This is the driver that will be inserted */
-static struct i2c_driver ltc2978_driver = {
- .driver = {
- .name = "ltc2978",
- },
- .probe = ltc2978_probe,
- .remove = pmbus_do_remove,
- .id_table = ltc2978_id,
-};
-
-module_i2c_driver(ltc2978_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for LTC2978 and LTC3880");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/max16064.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/max16064.c
deleted file mode 100644
index fa237a3c..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/max16064.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Hardware monitoring driver for Maxim MAX16064
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-#define MAX16064_MFR_VOUT_PEAK 0xd4
-#define MAX16064_MFR_TEMPERATURE_PEAK 0xd6
-
-static int max16064_read_word_data(struct i2c_client *client, int page, int reg)
-{
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_READ_VOUT_MAX:
- ret = pmbus_read_word_data(client, page,
- MAX16064_MFR_VOUT_PEAK);
- break;
- case PMBUS_VIRT_READ_TEMP_MAX:
- ret = pmbus_read_word_data(client, page,
- MAX16064_MFR_TEMPERATURE_PEAK);
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = 0;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int max16064_write_word_data(struct i2c_client *client, int page,
- int reg, u16 word)
-{
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX16064_MFR_VOUT_PEAK, 0);
- break;
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX16064_MFR_TEMPERATURE_PEAK,
- 0xffff);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static struct pmbus_driver_info max16064_info = {
- .pages = 4,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_TEMPERATURE] = direct,
- .m[PSC_VOLTAGE_IN] = 19995,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = -1,
- .m[PSC_VOLTAGE_OUT] = 19995,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = -1,
- .m[PSC_TEMPERATURE] = -7612,
- .b[PSC_TEMPERATURE] = 335,
- .R[PSC_TEMPERATURE] = -3,
- .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_TEMP
- | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_TEMP,
- .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
- .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
- .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
- .read_word_data = max16064_read_word_data,
- .write_word_data = max16064_write_word_data,
-};
-
-static int max16064_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- return pmbus_do_probe(client, id, &max16064_info);
-}
-
-static const struct i2c_device_id max16064_id[] = {
- {"max16064", 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, max16064_id);
-
-/* This is the driver that will be inserted */
-static struct i2c_driver max16064_driver = {
- .driver = {
- .name = "max16064",
- },
- .probe = max16064_probe,
- .remove = pmbus_do_remove,
- .id_table = max16064_id,
-};
-
-module_i2c_driver(max16064_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for Maxim MAX16064");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/max34440.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/max34440.c
deleted file mode 100644
index 2ada7b02..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/max34440.c
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Hardware monitoring driver for Maxim MAX34440/MAX34441
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-enum chips { max34440, max34441, max34446 };
-
-#define MAX34440_MFR_VOUT_PEAK 0xd4
-#define MAX34440_MFR_IOUT_PEAK 0xd5
-#define MAX34440_MFR_TEMPERATURE_PEAK 0xd6
-#define MAX34440_MFR_VOUT_MIN 0xd7
-
-#define MAX34446_MFR_POUT_PEAK 0xe0
-#define MAX34446_MFR_POUT_AVG 0xe1
-#define MAX34446_MFR_IOUT_AVG 0xe2
-#define MAX34446_MFR_TEMPERATURE_AVG 0xe3
-
-#define MAX34440_STATUS_OC_WARN (1 << 0)
-#define MAX34440_STATUS_OC_FAULT (1 << 1)
-#define MAX34440_STATUS_OT_FAULT (1 << 5)
-#define MAX34440_STATUS_OT_WARN (1 << 6)
-
-struct max34440_data {
- int id;
- struct pmbus_driver_info info;
-};
-
-#define to_max34440_data(x) container_of(x, struct max34440_data, info)
-
-static int max34440_read_word_data(struct i2c_client *client, int page, int reg)
-{
- int ret;
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- const struct max34440_data *data = to_max34440_data(info);
-
- switch (reg) {
- case PMBUS_VIRT_READ_VOUT_MIN:
- ret = pmbus_read_word_data(client, page,
- MAX34440_MFR_VOUT_MIN);
- break;
- case PMBUS_VIRT_READ_VOUT_MAX:
- ret = pmbus_read_word_data(client, page,
- MAX34440_MFR_VOUT_PEAK);
- break;
- case PMBUS_VIRT_READ_IOUT_AVG:
- if (data->id != max34446)
- return -ENXIO;
- ret = pmbus_read_word_data(client, page,
- MAX34446_MFR_IOUT_AVG);
- break;
- case PMBUS_VIRT_READ_IOUT_MAX:
- ret = pmbus_read_word_data(client, page,
- MAX34440_MFR_IOUT_PEAK);
- break;
- case PMBUS_VIRT_READ_POUT_AVG:
- if (data->id != max34446)
- return -ENXIO;
- ret = pmbus_read_word_data(client, page,
- MAX34446_MFR_POUT_AVG);
- break;
- case PMBUS_VIRT_READ_POUT_MAX:
- if (data->id != max34446)
- return -ENXIO;
- ret = pmbus_read_word_data(client, page,
- MAX34446_MFR_POUT_PEAK);
- break;
- case PMBUS_VIRT_READ_TEMP_AVG:
- if (data->id != max34446)
- return -ENXIO;
- ret = pmbus_read_word_data(client, page,
- MAX34446_MFR_TEMPERATURE_AVG);
- break;
- case PMBUS_VIRT_READ_TEMP_MAX:
- ret = pmbus_read_word_data(client, page,
- MAX34440_MFR_TEMPERATURE_PEAK);
- break;
- case PMBUS_VIRT_RESET_POUT_HISTORY:
- if (data->id != max34446)
- return -ENXIO;
- ret = 0;
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = 0;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int max34440_write_word_data(struct i2c_client *client, int page,
- int reg, u16 word)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- const struct max34440_data *data = to_max34440_data(info);
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_RESET_POUT_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX34446_MFR_POUT_PEAK, 0);
- if (ret)
- break;
- ret = pmbus_write_word_data(client, page,
- MAX34446_MFR_POUT_AVG, 0);
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX34440_MFR_VOUT_MIN, 0x7fff);
- if (ret)
- break;
- ret = pmbus_write_word_data(client, page,
- MAX34440_MFR_VOUT_PEAK, 0);
- break;
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX34440_MFR_IOUT_PEAK, 0);
- if (!ret && data->id == max34446)
- ret = pmbus_write_word_data(client, page,
- MAX34446_MFR_IOUT_AVG, 0);
-
- break;
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = pmbus_write_word_data(client, page,
- MAX34440_MFR_TEMPERATURE_PEAK,
- 0x8000);
- if (!ret && data->id == max34446)
- ret = pmbus_write_word_data(client, page,
- MAX34446_MFR_TEMPERATURE_AVG, 0);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- int ret = 0;
- int mfg_status;
-
- if (page >= 0) {
- ret = pmbus_set_page(client, page);
- if (ret < 0)
- return ret;
- }
-
- switch (reg) {
- case PMBUS_STATUS_IOUT:
- mfg_status = pmbus_read_word_data(client, 0,
- PMBUS_STATUS_MFR_SPECIFIC);
- if (mfg_status < 0)
- return mfg_status;
- if (mfg_status & MAX34440_STATUS_OC_WARN)
- ret |= PB_IOUT_OC_WARNING;
- if (mfg_status & MAX34440_STATUS_OC_FAULT)
- ret |= PB_IOUT_OC_FAULT;
- break;
- case PMBUS_STATUS_TEMPERATURE:
- mfg_status = pmbus_read_word_data(client, 0,
- PMBUS_STATUS_MFR_SPECIFIC);
- if (mfg_status < 0)
- return mfg_status;
- if (mfg_status & MAX34440_STATUS_OT_WARN)
- ret |= PB_TEMP_OT_WARNING;
- if (mfg_status & MAX34440_STATUS_OT_FAULT)
- ret |= PB_TEMP_OT_FAULT;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static struct pmbus_driver_info max34440_info[] = {
- [max34440] = {
- .pages = 14,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_TEMPERATURE] = direct,
- .format[PSC_CURRENT_OUT] = direct,
- .m[PSC_VOLTAGE_IN] = 1,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = 3, /* R = 0 in datasheet reflects mV */
- .m[PSC_VOLTAGE_OUT] = 1,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = 3, /* R = 0 in datasheet reflects mV */
- .m[PSC_CURRENT_OUT] = 1,
- .b[PSC_CURRENT_OUT] = 0,
- .R[PSC_CURRENT_OUT] = 3, /* R = 0 in datasheet reflects mA */
- .m[PSC_TEMPERATURE] = 1,
- .b[PSC_TEMPERATURE] = 0,
- .R[PSC_TEMPERATURE] = 2,
- .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .read_byte_data = max34440_read_byte_data,
- .read_word_data = max34440_read_word_data,
- .write_word_data = max34440_write_word_data,
- },
- [max34441] = {
- .pages = 12,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_TEMPERATURE] = direct,
- .format[PSC_CURRENT_OUT] = direct,
- .format[PSC_FAN] = direct,
- .m[PSC_VOLTAGE_IN] = 1,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = 3,
- .m[PSC_VOLTAGE_OUT] = 1,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = 3,
- .m[PSC_CURRENT_OUT] = 1,
- .b[PSC_CURRENT_OUT] = 0,
- .R[PSC_CURRENT_OUT] = 3,
- .m[PSC_TEMPERATURE] = 1,
- .b[PSC_TEMPERATURE] = 0,
- .R[PSC_TEMPERATURE] = 2,
- .m[PSC_FAN] = 1,
- .b[PSC_FAN] = 0,
- .R[PSC_FAN] = 0,
- .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
- .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .read_byte_data = max34440_read_byte_data,
- .read_word_data = max34440_read_word_data,
- .write_word_data = max34440_write_word_data,
- },
- [max34446] = {
- .pages = 7,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_TEMPERATURE] = direct,
- .format[PSC_CURRENT_OUT] = direct,
- .format[PSC_POWER] = direct,
- .m[PSC_VOLTAGE_IN] = 1,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = 3,
- .m[PSC_VOLTAGE_OUT] = 1,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = 3,
- .m[PSC_CURRENT_OUT] = 1,
- .b[PSC_CURRENT_OUT] = 0,
- .R[PSC_CURRENT_OUT] = 3,
- .m[PSC_POWER] = 1,
- .b[PSC_POWER] = 0,
- .R[PSC_POWER] = 3,
- .m[PSC_TEMPERATURE] = 1,
- .b[PSC_TEMPERATURE] = 0,
- .R[PSC_TEMPERATURE] = 2,
- .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
- .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
- .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
- .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
- .read_byte_data = max34440_read_byte_data,
- .read_word_data = max34440_read_word_data,
- .write_word_data = max34440_write_word_data,
- },
-};
-
-static int max34440_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- struct max34440_data *data;
-
- data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
- data->id = id->driver_data;
- data->info = max34440_info[id->driver_data];
-
- return pmbus_do_probe(client, id, &data->info);
-}
-
-static const struct i2c_device_id max34440_id[] = {
- {"max34440", max34440},
- {"max34441", max34441},
- {"max34446", max34446},
- {}
-};
-MODULE_DEVICE_TABLE(i2c, max34440_id);
-
-/* This is the driver that will be inserted */
-static struct i2c_driver max34440_driver = {
- .driver = {
- .name = "max34440",
- },
- .probe = max34440_probe,
- .remove = pmbus_do_remove,
- .id_table = max34440_id,
-};
-
-module_i2c_driver(max34440_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/max8688.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/max8688.c
deleted file mode 100644
index f04454a4..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/max8688.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Hardware monitoring driver for Maxim MAX8688
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-#define MAX8688_MFR_VOUT_PEAK 0xd4
-#define MAX8688_MFR_IOUT_PEAK 0xd5
-#define MAX8688_MFR_TEMPERATURE_PEAK 0xd6
-#define MAX8688_MFG_STATUS 0xd8
-
-#define MAX8688_STATUS_OC_FAULT (1 << 4)
-#define MAX8688_STATUS_OV_FAULT (1 << 5)
-#define MAX8688_STATUS_OV_WARNING (1 << 8)
-#define MAX8688_STATUS_UV_FAULT (1 << 9)
-#define MAX8688_STATUS_UV_WARNING (1 << 10)
-#define MAX8688_STATUS_UC_FAULT (1 << 11)
-#define MAX8688_STATUS_OC_WARNING (1 << 12)
-#define MAX8688_STATUS_OT_FAULT (1 << 13)
-#define MAX8688_STATUS_OT_WARNING (1 << 14)
-
-static int max8688_read_word_data(struct i2c_client *client, int page, int reg)
-{
- int ret;
-
- if (page)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_VIRT_READ_VOUT_MAX:
- ret = pmbus_read_word_data(client, 0, MAX8688_MFR_VOUT_PEAK);
- break;
- case PMBUS_VIRT_READ_IOUT_MAX:
- ret = pmbus_read_word_data(client, 0, MAX8688_MFR_IOUT_PEAK);
- break;
- case PMBUS_VIRT_READ_TEMP_MAX:
- ret = pmbus_read_word_data(client, 0,
- MAX8688_MFR_TEMPERATURE_PEAK);
- break;
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = 0;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int max8688_write_word_data(struct i2c_client *client, int page, int reg,
- u16 word)
-{
- int ret;
-
- switch (reg) {
- case PMBUS_VIRT_RESET_VOUT_HISTORY:
- ret = pmbus_write_word_data(client, 0, MAX8688_MFR_VOUT_PEAK,
- 0);
- break;
- case PMBUS_VIRT_RESET_IOUT_HISTORY:
- ret = pmbus_write_word_data(client, 0, MAX8688_MFR_IOUT_PEAK,
- 0);
- break;
- case PMBUS_VIRT_RESET_TEMP_HISTORY:
- ret = pmbus_write_word_data(client, 0,
- MAX8688_MFR_TEMPERATURE_PEAK,
- 0xffff);
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static int max8688_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- int ret = 0;
- int mfg_status;
-
- if (page > 0)
- return -ENXIO;
-
- switch (reg) {
- case PMBUS_STATUS_VOUT:
- mfg_status = pmbus_read_word_data(client, 0,
- MAX8688_MFG_STATUS);
- if (mfg_status < 0)
- return mfg_status;
- if (mfg_status & MAX8688_STATUS_UV_WARNING)
- ret |= PB_VOLTAGE_UV_WARNING;
- if (mfg_status & MAX8688_STATUS_UV_FAULT)
- ret |= PB_VOLTAGE_UV_FAULT;
- if (mfg_status & MAX8688_STATUS_OV_WARNING)
- ret |= PB_VOLTAGE_OV_WARNING;
- if (mfg_status & MAX8688_STATUS_OV_FAULT)
- ret |= PB_VOLTAGE_OV_FAULT;
- break;
- case PMBUS_STATUS_IOUT:
- mfg_status = pmbus_read_word_data(client, 0,
- MAX8688_MFG_STATUS);
- if (mfg_status < 0)
- return mfg_status;
- if (mfg_status & MAX8688_STATUS_UC_FAULT)
- ret |= PB_IOUT_UC_FAULT;
- if (mfg_status & MAX8688_STATUS_OC_WARNING)
- ret |= PB_IOUT_OC_WARNING;
- if (mfg_status & MAX8688_STATUS_OC_FAULT)
- ret |= PB_IOUT_OC_FAULT;
- break;
- case PMBUS_STATUS_TEMPERATURE:
- mfg_status = pmbus_read_word_data(client, 0,
- MAX8688_MFG_STATUS);
- if (mfg_status < 0)
- return mfg_status;
- if (mfg_status & MAX8688_STATUS_OT_WARNING)
- ret |= PB_TEMP_OT_WARNING;
- if (mfg_status & MAX8688_STATUS_OT_FAULT)
- ret |= PB_TEMP_OT_FAULT;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static struct pmbus_driver_info max8688_info = {
- .pages = 1,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_TEMPERATURE] = direct,
- .format[PSC_CURRENT_OUT] = direct,
- .m[PSC_VOLTAGE_IN] = 19995,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = -1,
- .m[PSC_VOLTAGE_OUT] = 19995,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = -1,
- .m[PSC_CURRENT_OUT] = 23109,
- .b[PSC_CURRENT_OUT] = 0,
- .R[PSC_CURRENT_OUT] = -2,
- .m[PSC_TEMPERATURE] = -7612,
- .b[PSC_TEMPERATURE] = 335,
- .R[PSC_TEMPERATURE] = -3,
- .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP
- | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT
- | PMBUS_HAVE_STATUS_TEMP,
- .read_byte_data = max8688_read_byte_data,
- .read_word_data = max8688_read_word_data,
- .write_word_data = max8688_write_word_data,
-};
-
-static int max8688_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- return pmbus_do_probe(client, id, &max8688_info);
-}
-
-static const struct i2c_device_id max8688_id[] = {
- {"max8688", 0},
- { }
-};
-
-MODULE_DEVICE_TABLE(i2c, max8688_id);
-
-/* This is the driver that will be inserted */
-static struct i2c_driver max8688_driver = {
- .driver = {
- .name = "max8688",
- },
- .probe = max8688_probe,
- .remove = pmbus_do_remove,
- .id_table = max8688_id,
-};
-
-module_i2c_driver(max8688_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for Maxim MAX8688");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.c
deleted file mode 100644
index 7e917001..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Hardware monitoring driver for PMBus devices
- *
- * Copyright (c) 2010, 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/mutex.h>
-#include <linux/i2c.h>
-#include "pmbus.h"
-
-/*
- * Find sensor groups and status registers on each page.
- */
-static void pmbus_find_sensor_groups(struct i2c_client *client,
- struct pmbus_driver_info *info)
-{
- int page;
-
- /* Sensors detected on page 0 only */
- if (pmbus_check_word_register(client, 0, PMBUS_READ_VIN))
- info->func[0] |= PMBUS_HAVE_VIN;
- if (pmbus_check_word_register(client, 0, PMBUS_READ_VCAP))
- info->func[0] |= PMBUS_HAVE_VCAP;
- if (pmbus_check_word_register(client, 0, PMBUS_READ_IIN))
- info->func[0] |= PMBUS_HAVE_IIN;
- if (pmbus_check_word_register(client, 0, PMBUS_READ_PIN))
- info->func[0] |= PMBUS_HAVE_PIN;
- if (info->func[0]
- && pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT))
- info->func[0] |= PMBUS_HAVE_STATUS_INPUT;
- if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) &&
- pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) {
- info->func[0] |= PMBUS_HAVE_FAN12;
- if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12))
- info->func[0] |= PMBUS_HAVE_STATUS_FAN12;
- }
- if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_34) &&
- pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_3)) {
- info->func[0] |= PMBUS_HAVE_FAN34;
- if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34))
- info->func[0] |= PMBUS_HAVE_STATUS_FAN34;
- }
- if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1))
- info->func[0] |= PMBUS_HAVE_TEMP;
- if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2))
- info->func[0] |= PMBUS_HAVE_TEMP2;
- if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3))
- info->func[0] |= PMBUS_HAVE_TEMP3;
- if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2
- | PMBUS_HAVE_TEMP3)
- && pmbus_check_byte_register(client, 0,
- PMBUS_STATUS_TEMPERATURE))
- info->func[0] |= PMBUS_HAVE_STATUS_TEMP;
-
- /* Sensors detected on all pages */
- for (page = 0; page < info->pages; page++) {
- if (pmbus_check_word_register(client, page, PMBUS_READ_VOUT)) {
- info->func[page] |= PMBUS_HAVE_VOUT;
- if (pmbus_check_byte_register(client, page,
- PMBUS_STATUS_VOUT))
- info->func[page] |= PMBUS_HAVE_STATUS_VOUT;
- }
- if (pmbus_check_word_register(client, page, PMBUS_READ_IOUT)) {
- info->func[page] |= PMBUS_HAVE_IOUT;
- if (pmbus_check_byte_register(client, 0,
- PMBUS_STATUS_IOUT))
- info->func[page] |= PMBUS_HAVE_STATUS_IOUT;
- }
- if (pmbus_check_word_register(client, page, PMBUS_READ_POUT))
- info->func[page] |= PMBUS_HAVE_POUT;
- }
-}
-
-/*
- * Identify chip parameters.
- */
-static int pmbus_identify(struct i2c_client *client,
- struct pmbus_driver_info *info)
-{
- int ret = 0;
-
- if (!info->pages) {
- /*
- * Check if the PAGE command is supported. If it is,
- * keep setting the page number until it fails or until the
- * maximum number of pages has been reached. Assume that
- * this is the number of pages supported by the chip.
- */
- if (pmbus_check_byte_register(client, 0, PMBUS_PAGE)) {
- int page;
-
- for (page = 1; page < PMBUS_PAGES; page++) {
- if (pmbus_set_page(client, page) < 0)
- break;
- }
- pmbus_set_page(client, 0);
- info->pages = page;
- } else {
- info->pages = 1;
- }
- }
-
- if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
- int vout_mode;
-
- vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
- if (vout_mode >= 0 && vout_mode != 0xff) {
- switch (vout_mode >> 5) {
- case 0:
- break;
- case 1:
- info->format[PSC_VOLTAGE_OUT] = vid;
- break;
- case 2:
- info->format[PSC_VOLTAGE_OUT] = direct;
- break;
- default:
- ret = -ENODEV;
- goto abort;
- }
- }
- }
-
- /*
- * We should check if the COEFFICIENTS register is supported.
- * If it is, and the chip is configured for direct mode, we can read
- * the coefficients from the chip, one set per group of sensor
- * registers.
- *
- * To do this, we will need access to a chip which actually supports the
- * COEFFICIENTS command, since the command is too complex to implement
- * without testing it. Until then, abort if a chip configured for direct
- * mode was detected.
- */
- if (info->format[PSC_VOLTAGE_OUT] == direct) {
- ret = -ENODEV;
- goto abort;
- }
-
- /* Try to find sensor groups */
- pmbus_find_sensor_groups(client, info);
-abort:
- return ret;
-}
-
-static int pmbus_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- struct pmbus_driver_info *info;
-
- info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info),
- GFP_KERNEL);
- if (!info)
- return -ENOMEM;
-
- info->pages = id->driver_data;
- info->identify = pmbus_identify;
-
- return pmbus_do_probe(client, id, info);
-}
-
-/*
- * Use driver_data to set the number of pages supported by the chip.
- */
-static const struct i2c_device_id pmbus_id[] = {
- {"adp4000", 1},
- {"bmr453", 1},
- {"bmr454", 1},
- {"mdt040", 1},
- {"ncp4200", 1},
- {"ncp4208", 1},
- {"pdt003", 1},
- {"pdt006", 1},
- {"pdt012", 1},
- {"pmbus", 0},
- {"tps40400", 1},
- {"tps40422", 2},
- {"udt020", 1},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, pmbus_id);
-
-/* This is the driver that will be inserted */
-static struct i2c_driver pmbus_driver = {
- .driver = {
- .name = "pmbus",
- },
- .probe = pmbus_probe,
- .remove = pmbus_do_remove,
- .id_table = pmbus_id,
-};
-
-module_i2c_driver(pmbus_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("Generic PMBus driver");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.h b/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.h
deleted file mode 100644
index 3fe03dc4..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.h
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * pmbus.h - Common defines and structures for PMBus devices
- *
- * Copyright (c) 2010, 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef PMBUS_H
-#define PMBUS_H
-
-/*
- * Registers
- */
-#define PMBUS_PAGE 0x00
-#define PMBUS_OPERATION 0x01
-#define PMBUS_ON_OFF_CONFIG 0x02
-#define PMBUS_CLEAR_FAULTS 0x03
-#define PMBUS_PHASE 0x04
-
-#define PMBUS_CAPABILITY 0x19
-#define PMBUS_QUERY 0x1A
-
-#define PMBUS_VOUT_MODE 0x20
-#define PMBUS_VOUT_COMMAND 0x21
-#define PMBUS_VOUT_TRIM 0x22
-#define PMBUS_VOUT_CAL_OFFSET 0x23
-#define PMBUS_VOUT_MAX 0x24
-#define PMBUS_VOUT_MARGIN_HIGH 0x25
-#define PMBUS_VOUT_MARGIN_LOW 0x26
-#define PMBUS_VOUT_TRANSITION_RATE 0x27
-#define PMBUS_VOUT_DROOP 0x28
-#define PMBUS_VOUT_SCALE_LOOP 0x29
-#define PMBUS_VOUT_SCALE_MONITOR 0x2A
-
-#define PMBUS_COEFFICIENTS 0x30
-#define PMBUS_POUT_MAX 0x31
-
-#define PMBUS_FAN_CONFIG_12 0x3A
-#define PMBUS_FAN_COMMAND_1 0x3B
-#define PMBUS_FAN_COMMAND_2 0x3C
-#define PMBUS_FAN_CONFIG_34 0x3D
-#define PMBUS_FAN_COMMAND_3 0x3E
-#define PMBUS_FAN_COMMAND_4 0x3F
-
-#define PMBUS_VOUT_OV_FAULT_LIMIT 0x40
-#define PMBUS_VOUT_OV_FAULT_RESPONSE 0x41
-#define PMBUS_VOUT_OV_WARN_LIMIT 0x42
-#define PMBUS_VOUT_UV_WARN_LIMIT 0x43
-#define PMBUS_VOUT_UV_FAULT_LIMIT 0x44
-#define PMBUS_VOUT_UV_FAULT_RESPONSE 0x45
-#define PMBUS_IOUT_OC_FAULT_LIMIT 0x46
-#define PMBUS_IOUT_OC_FAULT_RESPONSE 0x47
-#define PMBUS_IOUT_OC_LV_FAULT_LIMIT 0x48
-#define PMBUS_IOUT_OC_LV_FAULT_RESPONSE 0x49
-#define PMBUS_IOUT_OC_WARN_LIMIT 0x4A
-#define PMBUS_IOUT_UC_FAULT_LIMIT 0x4B
-#define PMBUS_IOUT_UC_FAULT_RESPONSE 0x4C
-
-#define PMBUS_OT_FAULT_LIMIT 0x4F
-#define PMBUS_OT_FAULT_RESPONSE 0x50
-#define PMBUS_OT_WARN_LIMIT 0x51
-#define PMBUS_UT_WARN_LIMIT 0x52
-#define PMBUS_UT_FAULT_LIMIT 0x53
-#define PMBUS_UT_FAULT_RESPONSE 0x54
-#define PMBUS_VIN_OV_FAULT_LIMIT 0x55
-#define PMBUS_VIN_OV_FAULT_RESPONSE 0x56
-#define PMBUS_VIN_OV_WARN_LIMIT 0x57
-#define PMBUS_VIN_UV_WARN_LIMIT 0x58
-#define PMBUS_VIN_UV_FAULT_LIMIT 0x59
-
-#define PMBUS_IIN_OC_FAULT_LIMIT 0x5B
-#define PMBUS_IIN_OC_WARN_LIMIT 0x5D
-
-#define PMBUS_POUT_OP_FAULT_LIMIT 0x68
-#define PMBUS_POUT_OP_WARN_LIMIT 0x6A
-#define PMBUS_PIN_OP_WARN_LIMIT 0x6B
-
-#define PMBUS_STATUS_BYTE 0x78
-#define PMBUS_STATUS_WORD 0x79
-#define PMBUS_STATUS_VOUT 0x7A
-#define PMBUS_STATUS_IOUT 0x7B
-#define PMBUS_STATUS_INPUT 0x7C
-#define PMBUS_STATUS_TEMPERATURE 0x7D
-#define PMBUS_STATUS_CML 0x7E
-#define PMBUS_STATUS_OTHER 0x7F
-#define PMBUS_STATUS_MFR_SPECIFIC 0x80
-#define PMBUS_STATUS_FAN_12 0x81
-#define PMBUS_STATUS_FAN_34 0x82
-
-#define PMBUS_READ_VIN 0x88
-#define PMBUS_READ_IIN 0x89
-#define PMBUS_READ_VCAP 0x8A
-#define PMBUS_READ_VOUT 0x8B
-#define PMBUS_READ_IOUT 0x8C
-#define PMBUS_READ_TEMPERATURE_1 0x8D
-#define PMBUS_READ_TEMPERATURE_2 0x8E
-#define PMBUS_READ_TEMPERATURE_3 0x8F
-#define PMBUS_READ_FAN_SPEED_1 0x90
-#define PMBUS_READ_FAN_SPEED_2 0x91
-#define PMBUS_READ_FAN_SPEED_3 0x92
-#define PMBUS_READ_FAN_SPEED_4 0x93
-#define PMBUS_READ_DUTY_CYCLE 0x94
-#define PMBUS_READ_FREQUENCY 0x95
-#define PMBUS_READ_POUT 0x96
-#define PMBUS_READ_PIN 0x97
-
-#define PMBUS_REVISION 0x98
-#define PMBUS_MFR_ID 0x99
-#define PMBUS_MFR_MODEL 0x9A
-#define PMBUS_MFR_REVISION 0x9B
-#define PMBUS_MFR_LOCATION 0x9C
-#define PMBUS_MFR_DATE 0x9D
-#define PMBUS_MFR_SERIAL 0x9E
-
-/*
- * Virtual registers.
- * Useful to support attributes which are not supported by standard PMBus
- * registers but exist as manufacturer specific registers on individual chips.
- * Must be mapped to real registers in device specific code.
- *
- * Semantics:
- * Virtual registers are all word size.
- * READ registers are read-only; writes are either ignored or return an error.
- * RESET registers are read/write. Reading reset registers returns zero
- * (used for detection), writing any value causes the associated history to be
- * reset.
- * Virtual registers have to be handled in device specific driver code. Chip
- * driver code returns non-negative register values if a virtual register is
- * supported, or a negative error code if not. The chip driver may return
- * -ENODATA or any other error code in this case, though an error code other
- * than -ENODATA is handled more efficiently and thus preferred. Either case,
- * the calling PMBus core code will abort if the chip driver returns an error
- * code when reading or writing virtual registers.
- */
-#define PMBUS_VIRT_BASE 0x100
-#define PMBUS_VIRT_READ_TEMP_AVG (PMBUS_VIRT_BASE + 0)
-#define PMBUS_VIRT_READ_TEMP_MIN (PMBUS_VIRT_BASE + 1)
-#define PMBUS_VIRT_READ_TEMP_MAX (PMBUS_VIRT_BASE + 2)
-#define PMBUS_VIRT_RESET_TEMP_HISTORY (PMBUS_VIRT_BASE + 3)
-#define PMBUS_VIRT_READ_VIN_AVG (PMBUS_VIRT_BASE + 4)
-#define PMBUS_VIRT_READ_VIN_MIN (PMBUS_VIRT_BASE + 5)
-#define PMBUS_VIRT_READ_VIN_MAX (PMBUS_VIRT_BASE + 6)
-#define PMBUS_VIRT_RESET_VIN_HISTORY (PMBUS_VIRT_BASE + 7)
-#define PMBUS_VIRT_READ_IIN_AVG (PMBUS_VIRT_BASE + 8)
-#define PMBUS_VIRT_READ_IIN_MIN (PMBUS_VIRT_BASE + 9)
-#define PMBUS_VIRT_READ_IIN_MAX (PMBUS_VIRT_BASE + 10)
-#define PMBUS_VIRT_RESET_IIN_HISTORY (PMBUS_VIRT_BASE + 11)
-#define PMBUS_VIRT_READ_PIN_AVG (PMBUS_VIRT_BASE + 12)
-#define PMBUS_VIRT_READ_PIN_MAX (PMBUS_VIRT_BASE + 13)
-#define PMBUS_VIRT_RESET_PIN_HISTORY (PMBUS_VIRT_BASE + 14)
-#define PMBUS_VIRT_READ_POUT_AVG (PMBUS_VIRT_BASE + 15)
-#define PMBUS_VIRT_READ_POUT_MAX (PMBUS_VIRT_BASE + 16)
-#define PMBUS_VIRT_RESET_POUT_HISTORY (PMBUS_VIRT_BASE + 17)
-#define PMBUS_VIRT_READ_VOUT_AVG (PMBUS_VIRT_BASE + 18)
-#define PMBUS_VIRT_READ_VOUT_MIN (PMBUS_VIRT_BASE + 19)
-#define PMBUS_VIRT_READ_VOUT_MAX (PMBUS_VIRT_BASE + 20)
-#define PMBUS_VIRT_RESET_VOUT_HISTORY (PMBUS_VIRT_BASE + 21)
-#define PMBUS_VIRT_READ_IOUT_AVG (PMBUS_VIRT_BASE + 22)
-#define PMBUS_VIRT_READ_IOUT_MIN (PMBUS_VIRT_BASE + 23)
-#define PMBUS_VIRT_READ_IOUT_MAX (PMBUS_VIRT_BASE + 24)
-#define PMBUS_VIRT_RESET_IOUT_HISTORY (PMBUS_VIRT_BASE + 25)
-#define PMBUS_VIRT_READ_TEMP2_AVG (PMBUS_VIRT_BASE + 26)
-#define PMBUS_VIRT_READ_TEMP2_MIN (PMBUS_VIRT_BASE + 27)
-#define PMBUS_VIRT_READ_TEMP2_MAX (PMBUS_VIRT_BASE + 28)
-#define PMBUS_VIRT_RESET_TEMP2_HISTORY (PMBUS_VIRT_BASE + 29)
-
-/*
- * CAPABILITY
- */
-#define PB_CAPABILITY_SMBALERT (1<<4)
-#define PB_CAPABILITY_ERROR_CHECK (1<<7)
-
-/*
- * VOUT_MODE
- */
-#define PB_VOUT_MODE_MODE_MASK 0xe0
-#define PB_VOUT_MODE_PARAM_MASK 0x1f
-
-#define PB_VOUT_MODE_LINEAR 0x00
-#define PB_VOUT_MODE_VID 0x20
-#define PB_VOUT_MODE_DIRECT 0x40
-
-/*
- * Fan configuration
- */
-#define PB_FAN_2_PULSE_MASK ((1 << 0) | (1 << 1))
-#define PB_FAN_2_RPM (1 << 2)
-#define PB_FAN_2_INSTALLED (1 << 3)
-#define PB_FAN_1_PULSE_MASK ((1 << 4) | (1 << 5))
-#define PB_FAN_1_RPM (1 << 6)
-#define PB_FAN_1_INSTALLED (1 << 7)
-
-/*
- * STATUS_BYTE, STATUS_WORD (lower)
- */
-#define PB_STATUS_NONE_ABOVE (1<<0)
-#define PB_STATUS_CML (1<<1)
-#define PB_STATUS_TEMPERATURE (1<<2)
-#define PB_STATUS_VIN_UV (1<<3)
-#define PB_STATUS_IOUT_OC (1<<4)
-#define PB_STATUS_VOUT_OV (1<<5)
-#define PB_STATUS_OFF (1<<6)
-#define PB_STATUS_BUSY (1<<7)
-
-/*
- * STATUS_WORD (upper)
- */
-#define PB_STATUS_UNKNOWN (1<<8)
-#define PB_STATUS_OTHER (1<<9)
-#define PB_STATUS_FANS (1<<10)
-#define PB_STATUS_POWER_GOOD_N (1<<11)
-#define PB_STATUS_WORD_MFR (1<<12)
-#define PB_STATUS_INPUT (1<<13)
-#define PB_STATUS_IOUT_POUT (1<<14)
-#define PB_STATUS_VOUT (1<<15)
-
-/*
- * STATUS_IOUT
- */
-#define PB_POUT_OP_WARNING (1<<0)
-#define PB_POUT_OP_FAULT (1<<1)
-#define PB_POWER_LIMITING (1<<2)
-#define PB_CURRENT_SHARE_FAULT (1<<3)
-#define PB_IOUT_UC_FAULT (1<<4)
-#define PB_IOUT_OC_WARNING (1<<5)
-#define PB_IOUT_OC_LV_FAULT (1<<6)
-#define PB_IOUT_OC_FAULT (1<<7)
-
-/*
- * STATUS_VOUT, STATUS_INPUT
- */
-#define PB_VOLTAGE_UV_FAULT (1<<4)
-#define PB_VOLTAGE_UV_WARNING (1<<5)
-#define PB_VOLTAGE_OV_WARNING (1<<6)
-#define PB_VOLTAGE_OV_FAULT (1<<7)
-
-/*
- * STATUS_INPUT
- */
-#define PB_PIN_OP_WARNING (1<<0)
-#define PB_IIN_OC_WARNING (1<<1)
-#define PB_IIN_OC_FAULT (1<<2)
-
-/*
- * STATUS_TEMPERATURE
- */
-#define PB_TEMP_UT_FAULT (1<<4)
-#define PB_TEMP_UT_WARNING (1<<5)
-#define PB_TEMP_OT_WARNING (1<<6)
-#define PB_TEMP_OT_FAULT (1<<7)
-
-/*
- * STATUS_FAN
- */
-#define PB_FAN_AIRFLOW_WARNING (1<<0)
-#define PB_FAN_AIRFLOW_FAULT (1<<1)
-#define PB_FAN_FAN2_SPEED_OVERRIDE (1<<2)
-#define PB_FAN_FAN1_SPEED_OVERRIDE (1<<3)
-#define PB_FAN_FAN2_WARNING (1<<4)
-#define PB_FAN_FAN1_WARNING (1<<5)
-#define PB_FAN_FAN2_FAULT (1<<6)
-#define PB_FAN_FAN1_FAULT (1<<7)
-
-/*
- * CML_FAULT_STATUS
- */
-#define PB_CML_FAULT_OTHER_MEM_LOGIC (1<<0)
-#define PB_CML_FAULT_OTHER_COMM (1<<1)
-#define PB_CML_FAULT_PROCESSOR (1<<3)
-#define PB_CML_FAULT_MEMORY (1<<4)
-#define PB_CML_FAULT_PACKET_ERROR (1<<5)
-#define PB_CML_FAULT_INVALID_DATA (1<<6)
-#define PB_CML_FAULT_INVALID_COMMAND (1<<7)
-
-enum pmbus_sensor_classes {
- PSC_VOLTAGE_IN = 0,
- PSC_VOLTAGE_OUT,
- PSC_CURRENT_IN,
- PSC_CURRENT_OUT,
- PSC_POWER,
- PSC_TEMPERATURE,
- PSC_FAN,
- PSC_NUM_CLASSES /* Number of power sensor classes */
-};
-
-#define PMBUS_PAGES 32 /* Per PMBus specification */
-
-/* Functionality bit mask */
-#define PMBUS_HAVE_VIN (1 << 0)
-#define PMBUS_HAVE_VCAP (1 << 1)
-#define PMBUS_HAVE_VOUT (1 << 2)
-#define PMBUS_HAVE_IIN (1 << 3)
-#define PMBUS_HAVE_IOUT (1 << 4)
-#define PMBUS_HAVE_PIN (1 << 5)
-#define PMBUS_HAVE_POUT (1 << 6)
-#define PMBUS_HAVE_FAN12 (1 << 7)
-#define PMBUS_HAVE_FAN34 (1 << 8)
-#define PMBUS_HAVE_TEMP (1 << 9)
-#define PMBUS_HAVE_TEMP2 (1 << 10)
-#define PMBUS_HAVE_TEMP3 (1 << 11)
-#define PMBUS_HAVE_STATUS_VOUT (1 << 12)
-#define PMBUS_HAVE_STATUS_IOUT (1 << 13)
-#define PMBUS_HAVE_STATUS_INPUT (1 << 14)
-#define PMBUS_HAVE_STATUS_TEMP (1 << 15)
-#define PMBUS_HAVE_STATUS_FAN12 (1 << 16)
-#define PMBUS_HAVE_STATUS_FAN34 (1 << 17)
-
-enum pmbus_data_format { linear = 0, direct, vid };
-
-struct pmbus_driver_info {
- int pages; /* Total number of pages */
- enum pmbus_data_format format[PSC_NUM_CLASSES];
- /*
- * Support one set of coefficients for each sensor type
- * Used for chips providing data in direct mode.
- */
- int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */
- int b[PSC_NUM_CLASSES]; /* offset */
- int R[PSC_NUM_CLASSES]; /* exponent */
-
- u32 func[PMBUS_PAGES]; /* Functionality, per page */
- /*
- * The following functions map manufacturing specific register values
- * to PMBus standard register values. Specify only if mapping is
- * necessary.
- * Functions return the register value (read) or zero (write) if
- * successful. A return value of -ENODATA indicates that there is no
- * manufacturer specific register, but that a standard PMBus register
- * may exist. Any other negative return value indicates that the
- * register does not exist, and that no attempt should be made to read
- * the standard register.
- */
- int (*read_byte_data)(struct i2c_client *client, int page, int reg);
- int (*read_word_data)(struct i2c_client *client, int page, int reg);
- int (*write_word_data)(struct i2c_client *client, int page, int reg,
- u16 word);
- int (*write_byte)(struct i2c_client *client, int page, u8 value);
- /*
- * The identify function determines supported PMBus functionality.
- * This function is only necessary if a chip driver supports multiple
- * chips, and the chip functionality is not pre-determined.
- */
- int (*identify)(struct i2c_client *client,
- struct pmbus_driver_info *info);
-};
-
-/* Function declarations */
-
-int pmbus_set_page(struct i2c_client *client, u8 page);
-int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg);
-int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word);
-int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
-int pmbus_write_byte(struct i2c_client *client, int page, u8 value);
-void pmbus_clear_faults(struct i2c_client *client);
-bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
-bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
-int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
- struct pmbus_driver_info *info);
-int pmbus_do_remove(struct i2c_client *client);
-const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client
- *client);
-
-#endif /* PMBUS_H */
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus_core.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus_core.c
deleted file mode 100644
index 29b319db..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus_core.c
+++ /dev/null
@@ -1,1811 +0,0 @@
-/*
- * Hardware monitoring driver for PMBus devices
- *
- * Copyright (c) 2010, 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/hwmon.h>
-#include <linux/hwmon-sysfs.h>
-#include <linux/delay.h>
-#include <linux/i2c/pmbus.h>
-#include "pmbus.h"
-
-/*
- * Constants needed to determine number of sensors, booleans, and labels.
- */
-#define PMBUS_MAX_INPUT_SENSORS 22 /* 10*volt, 7*curr, 5*power */
-#define PMBUS_VOUT_SENSORS_PER_PAGE 9 /* input, min, max, lcrit,
- crit, lowest, highest, avg,
- reset */
-#define PMBUS_IOUT_SENSORS_PER_PAGE 8 /* input, min, max, crit,
- lowest, highest, avg,
- reset */
-#define PMBUS_POUT_SENSORS_PER_PAGE 7 /* input, cap, max, crit,
- * highest, avg, reset
- */
-#define PMBUS_MAX_SENSORS_PER_FAN 1 /* input */
-#define PMBUS_MAX_SENSORS_PER_TEMP 9 /* input, min, max, lcrit,
- * crit, lowest, highest, avg,
- * reset
- */
-
-#define PMBUS_MAX_INPUT_BOOLEANS 7 /* v: min_alarm, max_alarm,
- lcrit_alarm, crit_alarm;
- c: alarm, crit_alarm;
- p: crit_alarm */
-#define PMBUS_VOUT_BOOLEANS_PER_PAGE 4 /* min_alarm, max_alarm,
- lcrit_alarm, crit_alarm */
-#define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm,
- crit_alarm */
-#define PMBUS_POUT_BOOLEANS_PER_PAGE 3 /* cap_alarm, alarm, crit_alarm
- */
-#define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */
-#define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm,
- lcrit_alarm, crit_alarm */
-
-#define PMBUS_MAX_INPUT_LABELS 4 /* vin, vcap, iin, pin */
-
-/*
- * status, status_vout, status_iout, status_fans, status_fan34, and status_temp
- * are paged. status_input is unpaged.
- */
-#define PB_NUM_STATUS_REG (PMBUS_PAGES * 6 + 1)
-
-/*
- * Index into status register array, per status register group
- */
-#define PB_STATUS_BASE 0
-#define PB_STATUS_VOUT_BASE (PB_STATUS_BASE + PMBUS_PAGES)
-#define PB_STATUS_IOUT_BASE (PB_STATUS_VOUT_BASE + PMBUS_PAGES)
-#define PB_STATUS_FAN_BASE (PB_STATUS_IOUT_BASE + PMBUS_PAGES)
-#define PB_STATUS_FAN34_BASE (PB_STATUS_FAN_BASE + PMBUS_PAGES)
-#define PB_STATUS_INPUT_BASE (PB_STATUS_FAN34_BASE + PMBUS_PAGES)
-#define PB_STATUS_TEMP_BASE (PB_STATUS_INPUT_BASE + 1)
-
-#define PMBUS_NAME_SIZE 24
-
-struct pmbus_sensor {
- char name[PMBUS_NAME_SIZE]; /* sysfs sensor name */
- struct sensor_device_attribute attribute;
- u8 page; /* page number */
- u16 reg; /* register */
- enum pmbus_sensor_classes class; /* sensor class */
- bool update; /* runtime sensor update needed */
- int data; /* Sensor data.
- Negative if there was a read error */
-};
-
-struct pmbus_boolean {
- char name[PMBUS_NAME_SIZE]; /* sysfs boolean name */
- struct sensor_device_attribute attribute;
-};
-
-struct pmbus_label {
- char name[PMBUS_NAME_SIZE]; /* sysfs label name */
- struct sensor_device_attribute attribute;
- char label[PMBUS_NAME_SIZE]; /* label */
-};
-
-struct pmbus_data {
- struct device *hwmon_dev;
-
- u32 flags; /* from platform data */
-
- int exponent; /* linear mode: exponent for output voltages */
-
- const struct pmbus_driver_info *info;
-
- int max_attributes;
- int num_attributes;
- struct attribute **attributes;
- struct attribute_group group;
-
- /*
- * Sensors cover both sensor and limit registers.
- */
- int max_sensors;
- int num_sensors;
- struct pmbus_sensor *sensors;
- /*
- * Booleans are used for alarms.
- * Values are determined from status registers.
- */
- int max_booleans;
- int num_booleans;
- struct pmbus_boolean *booleans;
- /*
- * Labels are used to map generic names (e.g., "in1")
- * to PMBus specific names (e.g., "vin" or "vout1").
- */
- int max_labels;
- int num_labels;
- struct pmbus_label *labels;
-
- struct mutex update_lock;
- bool valid;
- unsigned long last_updated; /* in jiffies */
-
- /*
- * A single status register covers multiple attributes,
- * so we keep them all together.
- */
- u8 status[PB_NUM_STATUS_REG];
-
- u8 currpage;
-};
-
-int pmbus_set_page(struct i2c_client *client, u8 page)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- int rv = 0;
- int newpage;
-
- if (page != data->currpage) {
- rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
- newpage = i2c_smbus_read_byte_data(client, PMBUS_PAGE);
- if (newpage != page)
- rv = -EIO;
- else
- data->currpage = page;
- }
- return rv;
-}
-EXPORT_SYMBOL_GPL(pmbus_set_page);
-
-int pmbus_write_byte(struct i2c_client *client, int page, u8 value)
-{
- int rv;
-
- if (page >= 0) {
- rv = pmbus_set_page(client, page);
- if (rv < 0)
- return rv;
- }
-
- return i2c_smbus_write_byte(client, value);
-}
-EXPORT_SYMBOL_GPL(pmbus_write_byte);
-
-/*
- * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if
- * a device specific mapping funcion exists and calls it if necessary.
- */
-static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- const struct pmbus_driver_info *info = data->info;
- int status;
-
- if (info->write_byte) {
- status = info->write_byte(client, page, value);
- if (status != -ENODATA)
- return status;
- }
- return pmbus_write_byte(client, page, value);
-}
-
-int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word)
-{
- int rv;
-
- rv = pmbus_set_page(client, page);
- if (rv < 0)
- return rv;
-
- return i2c_smbus_write_word_data(client, reg, word);
-}
-EXPORT_SYMBOL_GPL(pmbus_write_word_data);
-
-/*
- * _pmbus_write_word_data() is similar to pmbus_write_word_data(), but checks if
- * a device specific mapping function exists and calls it if necessary.
- */
-static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg,
- u16 word)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- const struct pmbus_driver_info *info = data->info;
- int status;
-
- if (info->write_word_data) {
- status = info->write_word_data(client, page, reg, word);
- if (status != -ENODATA)
- return status;
- }
- if (reg >= PMBUS_VIRT_BASE)
- return -ENXIO;
- return pmbus_write_word_data(client, page, reg, word);
-}
-
-int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg)
-{
- int rv;
-
- rv = pmbus_set_page(client, page);
- if (rv < 0)
- return rv;
-
- return i2c_smbus_read_word_data(client, reg);
-}
-EXPORT_SYMBOL_GPL(pmbus_read_word_data);
-
-/*
- * _pmbus_read_word_data() is similar to pmbus_read_word_data(), but checks if
- * a device specific mapping function exists and calls it if necessary.
- */
-static int _pmbus_read_word_data(struct i2c_client *client, int page, int reg)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- const struct pmbus_driver_info *info = data->info;
- int status;
-
- if (info->read_word_data) {
- status = info->read_word_data(client, page, reg);
- if (status != -ENODATA)
- return status;
- }
- if (reg >= PMBUS_VIRT_BASE)
- return -ENXIO;
- return pmbus_read_word_data(client, page, reg);
-}
-
-int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
-{
- int rv;
-
- if (page >= 0) {
- rv = pmbus_set_page(client, page);
- if (rv < 0)
- return rv;
- }
-
- return i2c_smbus_read_byte_data(client, reg);
-}
-EXPORT_SYMBOL_GPL(pmbus_read_byte_data);
-
-/*
- * _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
- * a device specific mapping function exists and calls it if necessary.
- */
-static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- const struct pmbus_driver_info *info = data->info;
- int status;
-
- if (info->read_byte_data) {
- status = info->read_byte_data(client, page, reg);
- if (status != -ENODATA)
- return status;
- }
- return pmbus_read_byte_data(client, page, reg);
-}
-
-static void pmbus_clear_fault_page(struct i2c_client *client, int page)
-{
- _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
-}
-
-void pmbus_clear_faults(struct i2c_client *client)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- int i;
-
- for (i = 0; i < data->info->pages; i++)
- pmbus_clear_fault_page(client, i);
-}
-EXPORT_SYMBOL_GPL(pmbus_clear_faults);
-
-static int pmbus_check_status_cml(struct i2c_client *client)
-{
- int status, status2;
-
- status = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_BYTE);
- if (status < 0 || (status & PB_STATUS_CML)) {
- status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML);
- if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND))
- return -EIO;
- }
- return 0;
-}
-
-bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)
-{
- int rv;
- struct pmbus_data *data = i2c_get_clientdata(client);
-
- rv = _pmbus_read_byte_data(client, page, reg);
- if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
- rv = pmbus_check_status_cml(client);
- pmbus_clear_fault_page(client, -1);
- return rv >= 0;
-}
-EXPORT_SYMBOL_GPL(pmbus_check_byte_register);
-
-bool pmbus_check_word_register(struct i2c_client *client, int page, int reg)
-{
- int rv;
- struct pmbus_data *data = i2c_get_clientdata(client);
-
- rv = _pmbus_read_word_data(client, page, reg);
- if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
- rv = pmbus_check_status_cml(client);
- pmbus_clear_fault_page(client, -1);
- return rv >= 0;
-}
-EXPORT_SYMBOL_GPL(pmbus_check_word_register);
-
-const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
-
- return data->info;
-}
-EXPORT_SYMBOL_GPL(pmbus_get_driver_info);
-
-static struct pmbus_data *pmbus_update_device(struct device *dev)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct pmbus_data *data = i2c_get_clientdata(client);
- const struct pmbus_driver_info *info = data->info;
-
- mutex_lock(&data->update_lock);
- if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
- int i;
-
- for (i = 0; i < info->pages; i++)
- data->status[PB_STATUS_BASE + i]
- = _pmbus_read_byte_data(client, i,
- PMBUS_STATUS_BYTE);
- for (i = 0; i < info->pages; i++) {
- if (!(info->func[i] & PMBUS_HAVE_STATUS_VOUT))
- continue;
- data->status[PB_STATUS_VOUT_BASE + i]
- = _pmbus_read_byte_data(client, i, PMBUS_STATUS_VOUT);
- }
- for (i = 0; i < info->pages; i++) {
- if (!(info->func[i] & PMBUS_HAVE_STATUS_IOUT))
- continue;
- data->status[PB_STATUS_IOUT_BASE + i]
- = _pmbus_read_byte_data(client, i, PMBUS_STATUS_IOUT);
- }
- for (i = 0; i < info->pages; i++) {
- if (!(info->func[i] & PMBUS_HAVE_STATUS_TEMP))
- continue;
- data->status[PB_STATUS_TEMP_BASE + i]
- = _pmbus_read_byte_data(client, i,
- PMBUS_STATUS_TEMPERATURE);
- }
- for (i = 0; i < info->pages; i++) {
- if (!(info->func[i] & PMBUS_HAVE_STATUS_FAN12))
- continue;
- data->status[PB_STATUS_FAN_BASE + i]
- = _pmbus_read_byte_data(client, i,
- PMBUS_STATUS_FAN_12);
- }
-
- for (i = 0; i < info->pages; i++) {
- if (!(info->func[i] & PMBUS_HAVE_STATUS_FAN34))
- continue;
- data->status[PB_STATUS_FAN34_BASE + i]
- = _pmbus_read_byte_data(client, i,
- PMBUS_STATUS_FAN_34);
- }
-
- if (info->func[0] & PMBUS_HAVE_STATUS_INPUT)
- data->status[PB_STATUS_INPUT_BASE]
- = _pmbus_read_byte_data(client, 0,
- PMBUS_STATUS_INPUT);
-
- for (i = 0; i < data->num_sensors; i++) {
- struct pmbus_sensor *sensor = &data->sensors[i];
-
- if (!data->valid || sensor->update)
- sensor->data
- = _pmbus_read_word_data(client,
- sensor->page,
- sensor->reg);
- }
- pmbus_clear_faults(client);
- data->last_updated = jiffies;
- data->valid = 1;
- }
- mutex_unlock(&data->update_lock);
- return data;
-}
-
-/*
- * Convert linear sensor values to milli- or micro-units
- * depending on sensor type.
- */
-static long pmbus_reg2data_linear(struct pmbus_data *data,
- struct pmbus_sensor *sensor)
-{
- s16 exponent;
- s32 mantissa;
- long val;
-
- if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
- exponent = data->exponent;
- mantissa = (u16) sensor->data;
- } else { /* LINEAR11 */
- exponent = ((s16)sensor->data) >> 11;
- mantissa = ((s16)((sensor->data & 0x7ff) << 5)) >> 5;
- }
-
- val = mantissa;
-
- /* scale result to milli-units for all sensors except fans */
- if (sensor->class != PSC_FAN)
- val = val * 1000L;
-
- /* scale result to micro-units for power sensors */
- if (sensor->class == PSC_POWER)
- val = val * 1000L;
-
- if (exponent >= 0)
- val <<= exponent;
- else
- val >>= -exponent;
-
- return val;
-}
-
-/*
- * Convert direct sensor values to milli- or micro-units
- * depending on sensor type.
- */
-static long pmbus_reg2data_direct(struct pmbus_data *data,
- struct pmbus_sensor *sensor)
-{
- long val = (s16) sensor->data;
- long m, b, R;
-
- m = data->info->m[sensor->class];
- b = data->info->b[sensor->class];
- R = data->info->R[sensor->class];
-
- if (m == 0)
- return 0;
-
- /* X = 1/m * (Y * 10^-R - b) */
- R = -R;
- /* scale result to milli-units for everything but fans */
- if (sensor->class != PSC_FAN) {
- R += 3;
- b *= 1000;
- }
-
- /* scale result to micro-units for power sensors */
- if (sensor->class == PSC_POWER) {
- R += 3;
- b *= 1000;
- }
-
- while (R > 0) {
- val *= 10;
- R--;
- }
- while (R < 0) {
- val = DIV_ROUND_CLOSEST(val, 10);
- R++;
- }
-
- return (val - b) / m;
-}
-
-/*
- * Convert VID sensor values to milli- or micro-units
- * depending on sensor type.
- * We currently only support VR11.
- */
-static long pmbus_reg2data_vid(struct pmbus_data *data,
- struct pmbus_sensor *sensor)
-{
- long val = sensor->data;
-
- if (val < 0x02 || val > 0xb2)
- return 0;
- return DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
-}
-
-static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
-{
- long val;
-
- switch (data->info->format[sensor->class]) {
- case direct:
- val = pmbus_reg2data_direct(data, sensor);
- break;
- case vid:
- val = pmbus_reg2data_vid(data, sensor);
- break;
- case linear:
- default:
- val = pmbus_reg2data_linear(data, sensor);
- break;
- }
- return val;
-}
-
-#define MAX_MANTISSA (1023 * 1000)
-#define MIN_MANTISSA (511 * 1000)
-
-static u16 pmbus_data2reg_linear(struct pmbus_data *data,
- enum pmbus_sensor_classes class, long val)
-{
- s16 exponent = 0, mantissa;
- bool negative = false;
-
- /* simple case */
- if (val == 0)
- return 0;
-
- if (class == PSC_VOLTAGE_OUT) {
- /* LINEAR16 does not support negative voltages */
- if (val < 0)
- return 0;
-
- /*
- * For a static exponents, we don't have a choice
- * but to adjust the value to it.
- */
- if (data->exponent < 0)
- val <<= -data->exponent;
- else
- val >>= data->exponent;
- val = DIV_ROUND_CLOSEST(val, 1000);
- return val & 0xffff;
- }
-
- if (val < 0) {
- negative = true;
- val = -val;
- }
-
- /* Power is in uW. Convert to mW before converting. */
- if (class == PSC_POWER)
- val = DIV_ROUND_CLOSEST(val, 1000L);
-
- /*
- * For simplicity, convert fan data to milli-units
- * before calculating the exponent.
- */
- if (class == PSC_FAN)
- val = val * 1000;
-
- /* Reduce large mantissa until it fits into 10 bit */
- while (val >= MAX_MANTISSA && exponent < 15) {
- exponent++;
- val >>= 1;
- }
- /* Increase small mantissa to improve precision */
- while (val < MIN_MANTISSA && exponent > -15) {
- exponent--;
- val <<= 1;
- }
-
- /* Convert mantissa from milli-units to units */
- mantissa = DIV_ROUND_CLOSEST(val, 1000);
-
- /* Ensure that resulting number is within range */
- if (mantissa > 0x3ff)
- mantissa = 0x3ff;
-
- /* restore sign */
- if (negative)
- mantissa = -mantissa;
-
- /* Convert to 5 bit exponent, 11 bit mantissa */
- return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800);
-}
-
-static u16 pmbus_data2reg_direct(struct pmbus_data *data,
- enum pmbus_sensor_classes class, long val)
-{
- long m, b, R;
-
- m = data->info->m[class];
- b = data->info->b[class];
- R = data->info->R[class];
-
- /* Power is in uW. Adjust R and b. */
- if (class == PSC_POWER) {
- R -= 3;
- b *= 1000;
- }
-
- /* Calculate Y = (m * X + b) * 10^R */
- if (class != PSC_FAN) {
- R -= 3; /* Adjust R and b for data in milli-units */
- b *= 1000;
- }
- val = val * m + b;
-
- while (R > 0) {
- val *= 10;
- R--;
- }
- while (R < 0) {
- val = DIV_ROUND_CLOSEST(val, 10);
- R++;
- }
-
- return val;
-}
-
-static u16 pmbus_data2reg_vid(struct pmbus_data *data,
- enum pmbus_sensor_classes class, long val)
-{
- val = SENSORS_LIMIT(val, 500, 1600);
-
- return 2 + DIV_ROUND_CLOSEST((1600 - val) * 100, 625);
-}
-
-static u16 pmbus_data2reg(struct pmbus_data *data,
- enum pmbus_sensor_classes class, long val)
-{
- u16 regval;
-
- switch (data->info->format[class]) {
- case direct:
- regval = pmbus_data2reg_direct(data, class, val);
- break;
- case vid:
- regval = pmbus_data2reg_vid(data, class, val);
- break;
- case linear:
- default:
- regval = pmbus_data2reg_linear(data, class, val);
- break;
- }
- return regval;
-}
-
-/*
- * Return boolean calculated from converted data.
- * <index> defines a status register index and mask, and optionally
- * two sensor indexes.
- * The upper half-word references the two sensors,
- * two sensor indices.
- * The upper half-word references the two optional sensors,
- * the lower half word references status register and mask.
- * The function returns true if (status[reg] & mask) is true and,
- * if specified, if v1 >= v2.
- * To determine if an object exceeds upper limits, specify <v, limit>.
- * To determine if an object exceeds lower limits, specify <limit, v>.
- *
- * For booleans created with pmbus_add_boolean_reg(), only the lower 16 bits of
- * index are set. s1 and s2 (the sensor index values) are zero in this case.
- * The function returns true if (status[reg] & mask) is true.
- *
- * If the boolean was created with pmbus_add_boolean_cmp(), a comparison against
- * a specified limit has to be performed to determine the boolean result.
- * In this case, the function returns true if v1 >= v2 (where v1 and v2 are
- * sensor values referenced by sensor indices s1 and s2).
- *
- * To determine if an object exceeds upper limits, specify <s1,s2> = <v,limit>.
- * To determine if an object exceeds lower limits, specify <s1,s2> = <limit,v>.
- *
- * If a negative value is stored in any of the referenced registers, this value
- * reflects an error code which will be returned.
- */
-static int pmbus_get_boolean(struct pmbus_data *data, int index)
-{
- u8 s1 = (index >> 24) & 0xff;
- u8 s2 = (index >> 16) & 0xff;
- u8 reg = (index >> 8) & 0xff;
- u8 mask = index & 0xff;
- int ret, status;
- u8 regval;
-
- status = data->status[reg];
- if (status < 0)
- return status;
-
- regval = status & mask;
- if (!s1 && !s2)
- ret = !!regval;
- else {
- long v1, v2;
- struct pmbus_sensor *sensor1, *sensor2;
-
- sensor1 = &data->sensors[s1];
- if (sensor1->data < 0)
- return sensor1->data;
- sensor2 = &data->sensors[s2];
- if (sensor2->data < 0)
- return sensor2->data;
-
- v1 = pmbus_reg2data(data, sensor1);
- v2 = pmbus_reg2data(data, sensor2);
- ret = !!(regval && v1 >= v2);
- }
- return ret;
-}
-
-static ssize_t pmbus_show_boolean(struct device *dev,
- struct device_attribute *da, char *buf)
-{
- struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
- struct pmbus_data *data = pmbus_update_device(dev);
- int val;
-
- val = pmbus_get_boolean(data, attr->index);
- if (val < 0)
- return val;
- return snprintf(buf, PAGE_SIZE, "%d\n", val);
-}
-
-static ssize_t pmbus_show_sensor(struct device *dev,
- struct device_attribute *da, char *buf)
-{
- struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
- struct pmbus_data *data = pmbus_update_device(dev);
- struct pmbus_sensor *sensor;
-
- sensor = &data->sensors[attr->index];
- if (sensor->data < 0)
- return sensor->data;
-
- return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor));
-}
-
-static ssize_t pmbus_set_sensor(struct device *dev,
- struct device_attribute *devattr,
- const char *buf, size_t count)
-{
- struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
- struct i2c_client *client = to_i2c_client(dev);
- struct pmbus_data *data = i2c_get_clientdata(client);
- struct pmbus_sensor *sensor = &data->sensors[attr->index];
- ssize_t rv = count;
- long val = 0;
- int ret;
- u16 regval;
-
- if (kstrtol(buf, 10, &val) < 0)
- return -EINVAL;
-
- mutex_lock(&data->update_lock);
- regval = pmbus_data2reg(data, sensor->class, val);
- ret = _pmbus_write_word_data(client, sensor->page, sensor->reg, regval);
- if (ret < 0)
- rv = ret;
- else
- data->sensors[attr->index].data = regval;
- mutex_unlock(&data->update_lock);
- return rv;
-}
-
-static ssize_t pmbus_show_label(struct device *dev,
- struct device_attribute *da, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct pmbus_data *data = i2c_get_clientdata(client);
- struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
-
- return snprintf(buf, PAGE_SIZE, "%s\n",
- data->labels[attr->index].label);
-}
-
-#define PMBUS_ADD_ATTR(data, _name, _idx, _mode, _type, _show, _set) \
-do { \
- struct sensor_device_attribute *a \
- = &data->_type##s[data->num_##_type##s].attribute; \
- BUG_ON(data->num_attributes >= data->max_attributes); \
- sysfs_attr_init(&a->dev_attr.attr); \
- a->dev_attr.attr.name = _name; \
- a->dev_attr.attr.mode = _mode; \
- a->dev_attr.show = _show; \
- a->dev_attr.store = _set; \
- a->index = _idx; \
- data->attributes[data->num_attributes] = &a->dev_attr.attr; \
- data->num_attributes++; \
-} while (0)
-
-#define PMBUS_ADD_GET_ATTR(data, _name, _type, _idx) \
- PMBUS_ADD_ATTR(data, _name, _idx, S_IRUGO, _type, \
- pmbus_show_##_type, NULL)
-
-#define PMBUS_ADD_SET_ATTR(data, _name, _type, _idx) \
- PMBUS_ADD_ATTR(data, _name, _idx, S_IWUSR | S_IRUGO, _type, \
- pmbus_show_##_type, pmbus_set_##_type)
-
-static void pmbus_add_boolean(struct pmbus_data *data,
- const char *name, const char *type, int seq,
- int idx)
-{
- struct pmbus_boolean *boolean;
-
- BUG_ON(data->num_booleans >= data->max_booleans);
-
- boolean = &data->booleans[data->num_booleans];
-
- snprintf(boolean->name, sizeof(boolean->name), "%s%d_%s",
- name, seq, type);
- PMBUS_ADD_GET_ATTR(data, boolean->name, boolean, idx);
- data->num_booleans++;
-}
-
-static void pmbus_add_boolean_reg(struct pmbus_data *data,
- const char *name, const char *type,
- int seq, int reg, int bit)
-{
- pmbus_add_boolean(data, name, type, seq, (reg << 8) | bit);
-}
-
-static void pmbus_add_boolean_cmp(struct pmbus_data *data,
- const char *name, const char *type,
- int seq, int i1, int i2, int reg, int mask)
-{
- pmbus_add_boolean(data, name, type, seq,
- (i1 << 24) | (i2 << 16) | (reg << 8) | mask);
-}
-
-static void pmbus_add_sensor(struct pmbus_data *data,
- const char *name, const char *type, int seq,
- int page, int reg, enum pmbus_sensor_classes class,
- bool update, bool readonly)
-{
- struct pmbus_sensor *sensor;
-
- BUG_ON(data->num_sensors >= data->max_sensors);
-
- sensor = &data->sensors[data->num_sensors];
- snprintf(sensor->name, sizeof(sensor->name), "%s%d_%s",
- name, seq, type);
- sensor->page = page;
- sensor->reg = reg;
- sensor->class = class;
- sensor->update = update;
- if (readonly)
- PMBUS_ADD_GET_ATTR(data, sensor->name, sensor,
- data->num_sensors);
- else
- PMBUS_ADD_SET_ATTR(data, sensor->name, sensor,
- data->num_sensors);
- data->num_sensors++;
-}
-
-static void pmbus_add_label(struct pmbus_data *data,
- const char *name, int seq,
- const char *lstring, int index)
-{
- struct pmbus_label *label;
-
- BUG_ON(data->num_labels >= data->max_labels);
-
- label = &data->labels[data->num_labels];
- snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq);
- if (!index)
- strncpy(label->label, lstring, sizeof(label->label) - 1);
- else
- snprintf(label->label, sizeof(label->label), "%s%d", lstring,
- index);
-
- PMBUS_ADD_GET_ATTR(data, label->name, label, data->num_labels);
- data->num_labels++;
-}
-
-/*
- * Determine maximum number of sensors, booleans, and labels.
- * To keep things simple, only make a rough high estimate.
- */
-static void pmbus_find_max_attr(struct i2c_client *client,
- struct pmbus_data *data)
-{
- const struct pmbus_driver_info *info = data->info;
- int page, max_sensors, max_booleans, max_labels;
-
- max_sensors = PMBUS_MAX_INPUT_SENSORS;
- max_booleans = PMBUS_MAX_INPUT_BOOLEANS;
- max_labels = PMBUS_MAX_INPUT_LABELS;
-
- for (page = 0; page < info->pages; page++) {
- if (info->func[page] & PMBUS_HAVE_VOUT) {
- max_sensors += PMBUS_VOUT_SENSORS_PER_PAGE;
- max_booleans += PMBUS_VOUT_BOOLEANS_PER_PAGE;
- max_labels++;
- }
- if (info->func[page] & PMBUS_HAVE_IOUT) {
- max_sensors += PMBUS_IOUT_SENSORS_PER_PAGE;
- max_booleans += PMBUS_IOUT_BOOLEANS_PER_PAGE;
- max_labels++;
- }
- if (info->func[page] & PMBUS_HAVE_POUT) {
- max_sensors += PMBUS_POUT_SENSORS_PER_PAGE;
- max_booleans += PMBUS_POUT_BOOLEANS_PER_PAGE;
- max_labels++;
- }
- if (info->func[page] & PMBUS_HAVE_FAN12) {
- max_sensors += 2 * PMBUS_MAX_SENSORS_PER_FAN;
- max_booleans += 2 * PMBUS_MAX_BOOLEANS_PER_FAN;
- }
- if (info->func[page] & PMBUS_HAVE_FAN34) {
- max_sensors += 2 * PMBUS_MAX_SENSORS_PER_FAN;
- max_booleans += 2 * PMBUS_MAX_BOOLEANS_PER_FAN;
- }
- if (info->func[page] & PMBUS_HAVE_TEMP) {
- max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
- max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
- }
- if (info->func[page] & PMBUS_HAVE_TEMP2) {
- max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
- max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
- }
- if (info->func[page] & PMBUS_HAVE_TEMP3) {
- max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
- max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
- }
- }
- data->max_sensors = max_sensors;
- data->max_booleans = max_booleans;
- data->max_labels = max_labels;
- data->max_attributes = max_sensors + max_booleans + max_labels;
-}
-
-/*
- * Search for attributes. Allocate sensors, booleans, and labels as needed.
- */
-
-/*
- * The pmbus_limit_attr structure describes a single limit attribute
- * and its associated alarm attribute.
- */
-struct pmbus_limit_attr {
- u16 reg; /* Limit register */
- bool update; /* True if register needs updates */
- bool low; /* True if low limit; for limits with compare
- functions only */
- const char *attr; /* Attribute name */
- const char *alarm; /* Alarm attribute name */
- u32 sbit; /* Alarm attribute status bit */
-};
-
-/*
- * The pmbus_sensor_attr structure describes one sensor attribute. This
- * description includes a reference to the associated limit attributes.
- */
-struct pmbus_sensor_attr {
- u8 reg; /* sensor register */
- enum pmbus_sensor_classes class;/* sensor class */
- const char *label; /* sensor label */
- bool paged; /* true if paged sensor */
- bool update; /* true if update needed */
- bool compare; /* true if compare function needed */
- u32 func; /* sensor mask */
- u32 sfunc; /* sensor status mask */
- int sbase; /* status base register */
- u32 gbit; /* generic status bit */
- const struct pmbus_limit_attr *limit;/* limit registers */
- int nlimit; /* # of limit registers */
-};
-
-/*
- * Add a set of limit attributes and, if supported, the associated
- * alarm attributes.
- */
-static bool pmbus_add_limit_attrs(struct i2c_client *client,
- struct pmbus_data *data,
- const struct pmbus_driver_info *info,
- const char *name, int index, int page,
- int cbase,
- const struct pmbus_sensor_attr *attr)
-{
- const struct pmbus_limit_attr *l = attr->limit;
- int nlimit = attr->nlimit;
- bool have_alarm = false;
- int i, cindex;
-
- for (i = 0; i < nlimit; i++) {
- if (pmbus_check_word_register(client, page, l->reg)) {
- cindex = data->num_sensors;
- pmbus_add_sensor(data, name, l->attr, index, page,
- l->reg, attr->class,
- attr->update || l->update,
- false);
- if (l->sbit && (info->func[page] & attr->sfunc)) {
- if (attr->compare) {
- pmbus_add_boolean_cmp(data, name,
- l->alarm, index,
- l->low ? cindex : cbase,
- l->low ? cbase : cindex,
- attr->sbase + page, l->sbit);
- } else {
- pmbus_add_boolean_reg(data, name,
- l->alarm, index,
- attr->sbase + page, l->sbit);
- }
- have_alarm = true;
- }
- }
- l++;
- }
- return have_alarm;
-}
-
-static void pmbus_add_sensor_attrs_one(struct i2c_client *client,
- struct pmbus_data *data,
- const struct pmbus_driver_info *info,
- const char *name,
- int index, int page,
- const struct pmbus_sensor_attr *attr)
-{
- bool have_alarm;
- int cbase = data->num_sensors;
-
- if (attr->label)
- pmbus_add_label(data, name, index, attr->label,
- attr->paged ? page + 1 : 0);
- pmbus_add_sensor(data, name, "input", index, page, attr->reg,
- attr->class, true, true);
- if (attr->sfunc) {
- have_alarm = pmbus_add_limit_attrs(client, data, info, name,
- index, page, cbase, attr);
- /*
- * Add generic alarm attribute only if there are no individual
- * alarm attributes, if there is a global alarm bit, and if
- * the generic status register for this page is accessible.
- */
- if (!have_alarm && attr->gbit &&
- pmbus_check_byte_register(client, page, PMBUS_STATUS_BYTE))
- pmbus_add_boolean_reg(data, name, "alarm", index,
- PB_STATUS_BASE + page,
- attr->gbit);
- }
-}
-
-static void pmbus_add_sensor_attrs(struct i2c_client *client,
- struct pmbus_data *data,
- const char *name,
- const struct pmbus_sensor_attr *attrs,
- int nattrs)
-{
- const struct pmbus_driver_info *info = data->info;
- int index, i;
-
- index = 1;
- for (i = 0; i < nattrs; i++) {
- int page, pages;
-
- pages = attrs->paged ? info->pages : 1;
- for (page = 0; page < pages; page++) {
- if (!(info->func[page] & attrs->func))
- continue;
- pmbus_add_sensor_attrs_one(client, data, info, name,
- index, page, attrs);
- index++;
- }
- attrs++;
- }
-}
-
-static const struct pmbus_limit_attr vin_limit_attrs[] = {
- {
- .reg = PMBUS_VIN_UV_WARN_LIMIT,
- .attr = "min",
- .alarm = "min_alarm",
- .sbit = PB_VOLTAGE_UV_WARNING,
- }, {
- .reg = PMBUS_VIN_UV_FAULT_LIMIT,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_VOLTAGE_UV_FAULT,
- }, {
- .reg = PMBUS_VIN_OV_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_VOLTAGE_OV_WARNING,
- }, {
- .reg = PMBUS_VIN_OV_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_VOLTAGE_OV_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_VIN_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_VIN_MIN,
- .update = true,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_VIN_MAX,
- .update = true,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_VIN_HISTORY,
- .attr = "reset_history",
- },
-};
-
-static const struct pmbus_limit_attr vout_limit_attrs[] = {
- {
- .reg = PMBUS_VOUT_UV_WARN_LIMIT,
- .attr = "min",
- .alarm = "min_alarm",
- .sbit = PB_VOLTAGE_UV_WARNING,
- }, {
- .reg = PMBUS_VOUT_UV_FAULT_LIMIT,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_VOLTAGE_UV_FAULT,
- }, {
- .reg = PMBUS_VOUT_OV_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_VOLTAGE_OV_WARNING,
- }, {
- .reg = PMBUS_VOUT_OV_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_VOLTAGE_OV_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_VOUT_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_VOUT_MIN,
- .update = true,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_VOUT_MAX,
- .update = true,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_VOUT_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_sensor_attr voltage_attributes[] = {
- {
- .reg = PMBUS_READ_VIN,
- .class = PSC_VOLTAGE_IN,
- .label = "vin",
- .func = PMBUS_HAVE_VIN,
- .sfunc = PMBUS_HAVE_STATUS_INPUT,
- .sbase = PB_STATUS_INPUT_BASE,
- .gbit = PB_STATUS_VIN_UV,
- .limit = vin_limit_attrs,
- .nlimit = ARRAY_SIZE(vin_limit_attrs),
- }, {
- .reg = PMBUS_READ_VCAP,
- .class = PSC_VOLTAGE_IN,
- .label = "vcap",
- .func = PMBUS_HAVE_VCAP,
- }, {
- .reg = PMBUS_READ_VOUT,
- .class = PSC_VOLTAGE_OUT,
- .label = "vout",
- .paged = true,
- .func = PMBUS_HAVE_VOUT,
- .sfunc = PMBUS_HAVE_STATUS_VOUT,
- .sbase = PB_STATUS_VOUT_BASE,
- .gbit = PB_STATUS_VOUT_OV,
- .limit = vout_limit_attrs,
- .nlimit = ARRAY_SIZE(vout_limit_attrs),
- }
-};
-
-/* Current attributes */
-
-static const struct pmbus_limit_attr iin_limit_attrs[] = {
- {
- .reg = PMBUS_IIN_OC_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_IIN_OC_WARNING,
- }, {
- .reg = PMBUS_IIN_OC_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_IIN_OC_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_IIN_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_IIN_MIN,
- .update = true,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_IIN_MAX,
- .update = true,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_IIN_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_limit_attr iout_limit_attrs[] = {
- {
- .reg = PMBUS_IOUT_OC_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_IOUT_OC_WARNING,
- }, {
- .reg = PMBUS_IOUT_UC_FAULT_LIMIT,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_IOUT_UC_FAULT,
- }, {
- .reg = PMBUS_IOUT_OC_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_IOUT_OC_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_IOUT_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_IOUT_MIN,
- .update = true,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_IOUT_MAX,
- .update = true,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_IOUT_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_sensor_attr current_attributes[] = {
- {
- .reg = PMBUS_READ_IIN,
- .class = PSC_CURRENT_IN,
- .label = "iin",
- .func = PMBUS_HAVE_IIN,
- .sfunc = PMBUS_HAVE_STATUS_INPUT,
- .sbase = PB_STATUS_INPUT_BASE,
- .limit = iin_limit_attrs,
- .nlimit = ARRAY_SIZE(iin_limit_attrs),
- }, {
- .reg = PMBUS_READ_IOUT,
- .class = PSC_CURRENT_OUT,
- .label = "iout",
- .paged = true,
- .func = PMBUS_HAVE_IOUT,
- .sfunc = PMBUS_HAVE_STATUS_IOUT,
- .sbase = PB_STATUS_IOUT_BASE,
- .gbit = PB_STATUS_IOUT_OC,
- .limit = iout_limit_attrs,
- .nlimit = ARRAY_SIZE(iout_limit_attrs),
- }
-};
-
-/* Power attributes */
-
-static const struct pmbus_limit_attr pin_limit_attrs[] = {
- {
- .reg = PMBUS_PIN_OP_WARN_LIMIT,
- .attr = "max",
- .alarm = "alarm",
- .sbit = PB_PIN_OP_WARNING,
- }, {
- .reg = PMBUS_VIRT_READ_PIN_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_PIN_MAX,
- .update = true,
- .attr = "input_highest",
- }, {
- .reg = PMBUS_VIRT_RESET_PIN_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_limit_attr pout_limit_attrs[] = {
- {
- .reg = PMBUS_POUT_MAX,
- .attr = "cap",
- .alarm = "cap_alarm",
- .sbit = PB_POWER_LIMITING,
- }, {
- .reg = PMBUS_POUT_OP_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_POUT_OP_WARNING,
- }, {
- .reg = PMBUS_POUT_OP_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_POUT_OP_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_POUT_AVG,
- .update = true,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_POUT_MAX,
- .update = true,
- .attr = "input_highest",
- }, {
- .reg = PMBUS_VIRT_RESET_POUT_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_sensor_attr power_attributes[] = {
- {
- .reg = PMBUS_READ_PIN,
- .class = PSC_POWER,
- .label = "pin",
- .func = PMBUS_HAVE_PIN,
- .sfunc = PMBUS_HAVE_STATUS_INPUT,
- .sbase = PB_STATUS_INPUT_BASE,
- .limit = pin_limit_attrs,
- .nlimit = ARRAY_SIZE(pin_limit_attrs),
- }, {
- .reg = PMBUS_READ_POUT,
- .class = PSC_POWER,
- .label = "pout",
- .paged = true,
- .func = PMBUS_HAVE_POUT,
- .sfunc = PMBUS_HAVE_STATUS_IOUT,
- .sbase = PB_STATUS_IOUT_BASE,
- .limit = pout_limit_attrs,
- .nlimit = ARRAY_SIZE(pout_limit_attrs),
- }
-};
-
-/* Temperature atributes */
-
-static const struct pmbus_limit_attr temp_limit_attrs[] = {
- {
- .reg = PMBUS_UT_WARN_LIMIT,
- .low = true,
- .attr = "min",
- .alarm = "min_alarm",
- .sbit = PB_TEMP_UT_WARNING,
- }, {
- .reg = PMBUS_UT_FAULT_LIMIT,
- .low = true,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_TEMP_UT_FAULT,
- }, {
- .reg = PMBUS_OT_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_TEMP_OT_WARNING,
- }, {
- .reg = PMBUS_OT_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_TEMP_OT_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_TEMP_MIN,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_TEMP_AVG,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_TEMP_MAX,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_TEMP_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_limit_attr temp_limit_attrs2[] = {
- {
- .reg = PMBUS_UT_WARN_LIMIT,
- .low = true,
- .attr = "min",
- .alarm = "min_alarm",
- .sbit = PB_TEMP_UT_WARNING,
- }, {
- .reg = PMBUS_UT_FAULT_LIMIT,
- .low = true,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_TEMP_UT_FAULT,
- }, {
- .reg = PMBUS_OT_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_TEMP_OT_WARNING,
- }, {
- .reg = PMBUS_OT_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_TEMP_OT_FAULT,
- }, {
- .reg = PMBUS_VIRT_READ_TEMP2_MIN,
- .attr = "lowest",
- }, {
- .reg = PMBUS_VIRT_READ_TEMP2_AVG,
- .attr = "average",
- }, {
- .reg = PMBUS_VIRT_READ_TEMP2_MAX,
- .attr = "highest",
- }, {
- .reg = PMBUS_VIRT_RESET_TEMP2_HISTORY,
- .attr = "reset_history",
- }
-};
-
-static const struct pmbus_limit_attr temp_limit_attrs3[] = {
- {
- .reg = PMBUS_UT_WARN_LIMIT,
- .low = true,
- .attr = "min",
- .alarm = "min_alarm",
- .sbit = PB_TEMP_UT_WARNING,
- }, {
- .reg = PMBUS_UT_FAULT_LIMIT,
- .low = true,
- .attr = "lcrit",
- .alarm = "lcrit_alarm",
- .sbit = PB_TEMP_UT_FAULT,
- }, {
- .reg = PMBUS_OT_WARN_LIMIT,
- .attr = "max",
- .alarm = "max_alarm",
- .sbit = PB_TEMP_OT_WARNING,
- }, {
- .reg = PMBUS_OT_FAULT_LIMIT,
- .attr = "crit",
- .alarm = "crit_alarm",
- .sbit = PB_TEMP_OT_FAULT,
- }
-};
-
-static const struct pmbus_sensor_attr temp_attributes[] = {
- {
- .reg = PMBUS_READ_TEMPERATURE_1,
- .class = PSC_TEMPERATURE,
- .paged = true,
- .update = true,
- .compare = true,
- .func = PMBUS_HAVE_TEMP,
- .sfunc = PMBUS_HAVE_STATUS_TEMP,
- .sbase = PB_STATUS_TEMP_BASE,
- .gbit = PB_STATUS_TEMPERATURE,
- .limit = temp_limit_attrs,
- .nlimit = ARRAY_SIZE(temp_limit_attrs),
- }, {
- .reg = PMBUS_READ_TEMPERATURE_2,
- .class = PSC_TEMPERATURE,
- .paged = true,
- .update = true,
- .compare = true,
- .func = PMBUS_HAVE_TEMP2,
- .sfunc = PMBUS_HAVE_STATUS_TEMP,
- .sbase = PB_STATUS_TEMP_BASE,
- .gbit = PB_STATUS_TEMPERATURE,
- .limit = temp_limit_attrs2,
- .nlimit = ARRAY_SIZE(temp_limit_attrs2),
- }, {
- .reg = PMBUS_READ_TEMPERATURE_3,
- .class = PSC_TEMPERATURE,
- .paged = true,
- .update = true,
- .compare = true,
- .func = PMBUS_HAVE_TEMP3,
- .sfunc = PMBUS_HAVE_STATUS_TEMP,
- .sbase = PB_STATUS_TEMP_BASE,
- .gbit = PB_STATUS_TEMPERATURE,
- .limit = temp_limit_attrs3,
- .nlimit = ARRAY_SIZE(temp_limit_attrs3),
- }
-};
-
-static const int pmbus_fan_registers[] = {
- PMBUS_READ_FAN_SPEED_1,
- PMBUS_READ_FAN_SPEED_2,
- PMBUS_READ_FAN_SPEED_3,
- PMBUS_READ_FAN_SPEED_4
-};
-
-static const int pmbus_fan_config_registers[] = {
- PMBUS_FAN_CONFIG_12,
- PMBUS_FAN_CONFIG_12,
- PMBUS_FAN_CONFIG_34,
- PMBUS_FAN_CONFIG_34
-};
-
-static const int pmbus_fan_status_registers[] = {
- PMBUS_STATUS_FAN_12,
- PMBUS_STATUS_FAN_12,
- PMBUS_STATUS_FAN_34,
- PMBUS_STATUS_FAN_34
-};
-
-static const u32 pmbus_fan_flags[] = {
- PMBUS_HAVE_FAN12,
- PMBUS_HAVE_FAN12,
- PMBUS_HAVE_FAN34,
- PMBUS_HAVE_FAN34
-};
-
-static const u32 pmbus_fan_status_flags[] = {
- PMBUS_HAVE_STATUS_FAN12,
- PMBUS_HAVE_STATUS_FAN12,
- PMBUS_HAVE_STATUS_FAN34,
- PMBUS_HAVE_STATUS_FAN34
-};
-
-/* Fans */
-static void pmbus_add_fan_attributes(struct i2c_client *client,
- struct pmbus_data *data)
-{
- const struct pmbus_driver_info *info = data->info;
- int index = 1;
- int page;
-
- for (page = 0; page < info->pages; page++) {
- int f;
-
- for (f = 0; f < ARRAY_SIZE(pmbus_fan_registers); f++) {
- int regval;
-
- if (!(info->func[page] & pmbus_fan_flags[f]))
- break;
-
- if (!pmbus_check_word_register(client, page,
- pmbus_fan_registers[f]))
- break;
-
- /*
- * Skip fan if not installed.
- * Each fan configuration register covers multiple fans,
- * so we have to do some magic.
- */
- regval = _pmbus_read_byte_data(client, page,
- pmbus_fan_config_registers[f]);
- if (regval < 0 ||
- (!(regval & (PB_FAN_1_INSTALLED >> ((f & 1) * 4)))))
- continue;
-
- pmbus_add_sensor(data, "fan", "input", index, page,
- pmbus_fan_registers[f], PSC_FAN, true,
- true);
-
- /*
- * Each fan status register covers multiple fans,
- * so we have to do some magic.
- */
- if ((info->func[page] & pmbus_fan_status_flags[f]) &&
- pmbus_check_byte_register(client,
- page, pmbus_fan_status_registers[f])) {
- int base;
-
- if (f > 1) /* fan 3, 4 */
- base = PB_STATUS_FAN34_BASE + page;
- else
- base = PB_STATUS_FAN_BASE + page;
- pmbus_add_boolean_reg(data, "fan", "alarm",
- index, base,
- PB_FAN_FAN1_WARNING >> (f & 1));
- pmbus_add_boolean_reg(data, "fan", "fault",
- index, base,
- PB_FAN_FAN1_FAULT >> (f & 1));
- }
- index++;
- }
- }
-}
-
-static void pmbus_find_attributes(struct i2c_client *client,
- struct pmbus_data *data)
-{
- /* Voltage sensors */
- pmbus_add_sensor_attrs(client, data, "in", voltage_attributes,
- ARRAY_SIZE(voltage_attributes));
-
- /* Current sensors */
- pmbus_add_sensor_attrs(client, data, "curr", current_attributes,
- ARRAY_SIZE(current_attributes));
-
- /* Power sensors */
- pmbus_add_sensor_attrs(client, data, "power", power_attributes,
- ARRAY_SIZE(power_attributes));
-
- /* Temperature sensors */
- pmbus_add_sensor_attrs(client, data, "temp", temp_attributes,
- ARRAY_SIZE(temp_attributes));
-
- /* Fans */
- pmbus_add_fan_attributes(client, data);
-}
-
-/*
- * Identify chip parameters.
- * This function is called for all chips.
- */
-static int pmbus_identify_common(struct i2c_client *client,
- struct pmbus_data *data)
-{
- int vout_mode = -1;
-
- if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE))
- vout_mode = _pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
- if (vout_mode >= 0 && vout_mode != 0xff) {
- /*
- * Not all chips support the VOUT_MODE command,
- * so a failure to read it is not an error.
- */
- switch (vout_mode >> 5) {
- case 0: /* linear mode */
- if (data->info->format[PSC_VOLTAGE_OUT] != linear)
- return -ENODEV;
-
- data->exponent = ((s8)(vout_mode << 3)) >> 3;
- break;
- case 1: /* VID mode */
- if (data->info->format[PSC_VOLTAGE_OUT] != vid)
- return -ENODEV;
- break;
- case 2: /* direct mode */
- if (data->info->format[PSC_VOLTAGE_OUT] != direct)
- return -ENODEV;
- break;
- default:
- return -ENODEV;
- }
- }
-
- /* Determine maximum number of sensors, booleans, and labels */
- pmbus_find_max_attr(client, data);
- pmbus_clear_fault_page(client, 0);
- return 0;
-}
-
-int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
- struct pmbus_driver_info *info)
-{
- const struct pmbus_platform_data *pdata = client->dev.platform_data;
- struct pmbus_data *data;
- int ret;
-
- if (!info) {
- dev_err(&client->dev, "Missing chip information");
- return -ENODEV;
- }
-
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE
- | I2C_FUNC_SMBUS_BYTE_DATA
- | I2C_FUNC_SMBUS_WORD_DATA))
- return -ENODEV;
-
- data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
- if (!data) {
- dev_err(&client->dev, "No memory to allocate driver data\n");
- return -ENOMEM;
- }
-
- i2c_set_clientdata(client, data);
- mutex_init(&data->update_lock);
-
- /* Bail out if PMBus status register does not exist. */
- if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0) {
- dev_err(&client->dev, "PMBus status register not found\n");
- return -ENODEV;
- }
-
- if (pdata)
- data->flags = pdata->flags;
- data->info = info;
-
- pmbus_clear_faults(client);
-
- if (info->identify) {
- ret = (*info->identify)(client, info);
- if (ret < 0) {
- dev_err(&client->dev, "Chip identification failed\n");
- return ret;
- }
- }
-
- if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
- dev_err(&client->dev, "Bad number of PMBus pages: %d\n",
- info->pages);
- return -ENODEV;
- }
-
- ret = pmbus_identify_common(client, data);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to identify chip capabilities\n");
- return ret;
- }
-
- ret = -ENOMEM;
- data->sensors = devm_kzalloc(&client->dev, sizeof(struct pmbus_sensor)
- * data->max_sensors, GFP_KERNEL);
- if (!data->sensors) {
- dev_err(&client->dev, "No memory to allocate sensor data\n");
- return -ENOMEM;
- }
-
- data->booleans = devm_kzalloc(&client->dev, sizeof(struct pmbus_boolean)
- * data->max_booleans, GFP_KERNEL);
- if (!data->booleans) {
- dev_err(&client->dev, "No memory to allocate boolean data\n");
- return -ENOMEM;
- }
-
- data->labels = devm_kzalloc(&client->dev, sizeof(struct pmbus_label)
- * data->max_labels, GFP_KERNEL);
- if (!data->labels) {
- dev_err(&client->dev, "No memory to allocate label data\n");
- return -ENOMEM;
- }
-
- data->attributes = devm_kzalloc(&client->dev, sizeof(struct attribute *)
- * data->max_attributes, GFP_KERNEL);
- if (!data->attributes) {
- dev_err(&client->dev, "No memory to allocate attribute data\n");
- return -ENOMEM;
- }
-
- pmbus_find_attributes(client, data);
-
- /*
- * If there are no attributes, something is wrong.
- * Bail out instead of trying to register nothing.
- */
- if (!data->num_attributes) {
- dev_err(&client->dev, "No attributes found\n");
- return -ENODEV;
- }
-
- /* Register sysfs hooks */
- data->group.attrs = data->attributes;
- ret = sysfs_create_group(&client->dev.kobj, &data->group);
- if (ret) {
- dev_err(&client->dev, "Failed to create sysfs entries\n");
- return ret;
- }
- data->hwmon_dev = hwmon_device_register(&client->dev);
- if (IS_ERR(data->hwmon_dev)) {
- ret = PTR_ERR(data->hwmon_dev);
- dev_err(&client->dev, "Failed to register hwmon device\n");
- goto out_hwmon_device_register;
- }
- return 0;
-
-out_hwmon_device_register:
- sysfs_remove_group(&client->dev.kobj, &data->group);
- return ret;
-}
-EXPORT_SYMBOL_GPL(pmbus_do_probe);
-
-int pmbus_do_remove(struct i2c_client *client)
-{
- struct pmbus_data *data = i2c_get_clientdata(client);
- hwmon_device_unregister(data->hwmon_dev);
- sysfs_remove_group(&client->dev.kobj, &data->group);
- return 0;
-}
-EXPORT_SYMBOL_GPL(pmbus_do_remove);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus core driver");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9000.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9000.c
deleted file mode 100644
index fbb1479d..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9000.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Hardware monitoring driver for UCD90xxx Sequencer and System Health
- * Controller series
- *
- * Copyright (C) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/i2c/pmbus.h>
-#include "pmbus.h"
-
-enum chips { ucd9000, ucd90120, ucd90124, ucd9090, ucd90910 };
-
-#define UCD9000_MONITOR_CONFIG 0xd5
-#define UCD9000_NUM_PAGES 0xd6
-#define UCD9000_FAN_CONFIG_INDEX 0xe7
-#define UCD9000_FAN_CONFIG 0xe8
-#define UCD9000_DEVICE_ID 0xfd
-
-#define UCD9000_MON_TYPE(x) (((x) >> 5) & 0x07)
-#define UCD9000_MON_PAGE(x) ((x) & 0x0f)
-
-#define UCD9000_MON_VOLTAGE 1
-#define UCD9000_MON_TEMPERATURE 2
-#define UCD9000_MON_CURRENT 3
-#define UCD9000_MON_VOLTAGE_HW 4
-
-#define UCD9000_NUM_FAN 4
-
-struct ucd9000_data {
- u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX];
- struct pmbus_driver_info info;
-};
-#define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info)
-
-static int ucd9000_get_fan_config(struct i2c_client *client, int fan)
-{
- int fan_config = 0;
- struct ucd9000_data *data
- = to_ucd9000_data(pmbus_get_driver_info(client));
-
- if (data->fan_data[fan][3] & 1)
- fan_config |= PB_FAN_2_INSTALLED; /* Use lower bit position */
-
- /* Pulses/revolution */
- fan_config |= (data->fan_data[fan][3] & 0x06) >> 1;
-
- return fan_config;
-}
-
-static int ucd9000_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- int ret = 0;
- int fan_config;
-
- switch (reg) {
- case PMBUS_FAN_CONFIG_12:
- if (page > 0)
- return -ENXIO;
-
- ret = ucd9000_get_fan_config(client, 0);
- if (ret < 0)
- return ret;
- fan_config = ret << 4;
- ret = ucd9000_get_fan_config(client, 1);
- if (ret < 0)
- return ret;
- fan_config |= ret;
- ret = fan_config;
- break;
- case PMBUS_FAN_CONFIG_34:
- if (page > 0)
- return -ENXIO;
-
- ret = ucd9000_get_fan_config(client, 2);
- if (ret < 0)
- return ret;
- fan_config = ret << 4;
- ret = ucd9000_get_fan_config(client, 3);
- if (ret < 0)
- return ret;
- fan_config |= ret;
- ret = fan_config;
- break;
- default:
- ret = -ENODATA;
- break;
- }
- return ret;
-}
-
-static const struct i2c_device_id ucd9000_id[] = {
- {"ucd9000", ucd9000},
- {"ucd90120", ucd90120},
- {"ucd90124", ucd90124},
- {"ucd9090", ucd9090},
- {"ucd90910", ucd90910},
- {}
-};
-MODULE_DEVICE_TABLE(i2c, ucd9000_id);
-
-static int ucd9000_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
- struct ucd9000_data *data;
- struct pmbus_driver_info *info;
- const struct i2c_device_id *mid;
- int i, ret;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_BYTE_DATA |
- I2C_FUNC_SMBUS_BLOCK_DATA))
- return -ENODEV;
-
- ret = i2c_smbus_read_block_data(client, UCD9000_DEVICE_ID,
- block_buffer);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read device ID\n");
- return ret;
- }
- block_buffer[ret] = '\0';
- dev_info(&client->dev, "Device ID %s\n", block_buffer);
-
- for (mid = ucd9000_id; mid->name[0]; mid++) {
- if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
- break;
- }
- if (!mid->name[0]) {
- dev_err(&client->dev, "Unsupported device\n");
- return -ENODEV;
- }
-
- if (id->driver_data != ucd9000 && id->driver_data != mid->driver_data)
- dev_notice(&client->dev,
- "Device mismatch: Configured %s, detected %s\n",
- id->name, mid->name);
-
- data = devm_kzalloc(&client->dev, sizeof(struct ucd9000_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
- info = &data->info;
-
- ret = i2c_smbus_read_byte_data(client, UCD9000_NUM_PAGES);
- if (ret < 0) {
- dev_err(&client->dev,
- "Failed to read number of active pages\n");
- return ret;
- }
- info->pages = ret;
- if (!info->pages) {
- dev_err(&client->dev, "No pages configured\n");
- return -ENODEV;
- }
-
- /* The internal temperature sensor is always active */
- info->func[0] = PMBUS_HAVE_TEMP;
-
- /* Everything else is configurable */
- ret = i2c_smbus_read_block_data(client, UCD9000_MONITOR_CONFIG,
- block_buffer);
- if (ret <= 0) {
- dev_err(&client->dev, "Failed to read configuration data\n");
- return -ENODEV;
- }
- for (i = 0; i < ret; i++) {
- int page = UCD9000_MON_PAGE(block_buffer[i]);
-
- if (page >= info->pages)
- continue;
-
- switch (UCD9000_MON_TYPE(block_buffer[i])) {
- case UCD9000_MON_VOLTAGE:
- case UCD9000_MON_VOLTAGE_HW:
- info->func[page] |= PMBUS_HAVE_VOUT
- | PMBUS_HAVE_STATUS_VOUT;
- break;
- case UCD9000_MON_TEMPERATURE:
- info->func[page] |= PMBUS_HAVE_TEMP2
- | PMBUS_HAVE_STATUS_TEMP;
- break;
- case UCD9000_MON_CURRENT:
- info->func[page] |= PMBUS_HAVE_IOUT
- | PMBUS_HAVE_STATUS_IOUT;
- break;
- default:
- break;
- }
- }
-
- /* Fan configuration */
- if (mid->driver_data == ucd90124) {
- for (i = 0; i < UCD9000_NUM_FAN; i++) {
- i2c_smbus_write_byte_data(client,
- UCD9000_FAN_CONFIG_INDEX, i);
- ret = i2c_smbus_read_block_data(client,
- UCD9000_FAN_CONFIG,
- data->fan_data[i]);
- if (ret < 0)
- return ret;
- }
- i2c_smbus_write_byte_data(client, UCD9000_FAN_CONFIG_INDEX, 0);
-
- info->read_byte_data = ucd9000_read_byte_data;
- info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12
- | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34;
- }
-
- return pmbus_do_probe(client, mid, info);
-}
-
-/* This is the driver that will be inserted */
-static struct i2c_driver ucd9000_driver = {
- .driver = {
- .name = "ucd9000",
- },
- .probe = ucd9000_probe,
- .remove = pmbus_do_remove,
- .id_table = ucd9000_id,
-};
-
-module_i2c_driver(ucd9000_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for TI UCD90xxx");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9200.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9200.c
deleted file mode 100644
index 033d6aca..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9200.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Hardware monitoring driver for ucd9200 series Digital PWM System Controllers
- *
- * Copyright (C) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/i2c/pmbus.h>
-#include "pmbus.h"
-
-#define UCD9200_PHASE_INFO 0xd2
-#define UCD9200_DEVICE_ID 0xfd
-
-enum chips { ucd9200, ucd9220, ucd9222, ucd9224, ucd9240, ucd9244, ucd9246,
- ucd9248 };
-
-static const struct i2c_device_id ucd9200_id[] = {
- {"ucd9200", ucd9200},
- {"ucd9220", ucd9220},
- {"ucd9222", ucd9222},
- {"ucd9224", ucd9224},
- {"ucd9240", ucd9240},
- {"ucd9244", ucd9244},
- {"ucd9246", ucd9246},
- {"ucd9248", ucd9248},
- {}
-};
-MODULE_DEVICE_TABLE(i2c, ucd9200_id);
-
-static int ucd9200_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
- struct pmbus_driver_info *info;
- const struct i2c_device_id *mid;
- int i, j, ret;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_BYTE_DATA |
- I2C_FUNC_SMBUS_BLOCK_DATA))
- return -ENODEV;
-
- ret = i2c_smbus_read_block_data(client, UCD9200_DEVICE_ID,
- block_buffer);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read device ID\n");
- return ret;
- }
- block_buffer[ret] = '\0';
- dev_info(&client->dev, "Device ID %s\n", block_buffer);
-
- for (mid = ucd9200_id; mid->name[0]; mid++) {
- if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
- break;
- }
- if (!mid->name[0]) {
- dev_err(&client->dev, "Unsupported device\n");
- return -ENODEV;
- }
- if (id->driver_data != ucd9200 && id->driver_data != mid->driver_data)
- dev_notice(&client->dev,
- "Device mismatch: Configured %s, detected %s\n",
- id->name, mid->name);
-
- info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info),
- GFP_KERNEL);
- if (!info)
- return -ENOMEM;
-
- ret = i2c_smbus_read_block_data(client, UCD9200_PHASE_INFO,
- block_buffer);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read phase information\n");
- return ret;
- }
-
- /*
- * Calculate number of configured pages (rails) from PHASE_INFO
- * register.
- * Rails have to be sequential, so we can abort after finding
- * the first unconfigured rail.
- */
- info->pages = 0;
- for (i = 0; i < ret; i++) {
- if (!block_buffer[i])
- break;
- info->pages++;
- }
- if (!info->pages) {
- dev_err(&client->dev, "No rails configured\n");
- return -ENODEV;
- }
- dev_info(&client->dev, "%d rails configured\n", info->pages);
-
- /*
- * Set PHASE registers on all pages to 0xff to ensure that phase
- * specific commands will apply to all phases of a given page (rail).
- * This only affects the READ_IOUT and READ_TEMPERATURE2 registers.
- * READ_IOUT will return the sum of currents of all phases of a rail,
- * and READ_TEMPERATURE2 will return the maximum temperature detected
- * for the the phases of the rail.
- */
- for (i = 0; i < info->pages; i++) {
- /*
- * Setting PAGE & PHASE fails once in a while for no obvious
- * reason, so we need to retry a couple of times.
- */
- for (j = 0; j < 3; j++) {
- ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, i);
- if (ret < 0)
- continue;
- ret = i2c_smbus_write_byte_data(client, PMBUS_PHASE,
- 0xff);
- if (ret < 0)
- continue;
- break;
- }
- if (ret < 0) {
- dev_err(&client->dev,
- "Failed to initialize PHASE registers\n");
- return ret;
- }
- }
- if (info->pages > 1)
- i2c_smbus_write_byte_data(client, PMBUS_PAGE, 0);
-
- info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT |
- PMBUS_HAVE_IIN | PMBUS_HAVE_PIN |
- PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
- PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
- PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP |
- PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
-
- for (i = 1; i < info->pages; i++)
- info->func[i] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
- PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
- PMBUS_HAVE_POUT |
- PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
-
- /* ucd9240 supports a single fan */
- if (mid->driver_data == ucd9240)
- info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12;
-
- return pmbus_do_probe(client, mid, info);
-}
-
-/* This is the driver that will be inserted */
-static struct i2c_driver ucd9200_driver = {
- .driver = {
- .name = "ucd9200",
- },
- .probe = ucd9200_probe,
- .remove = pmbus_do_remove,
- .id_table = ucd9200_id,
-};
-
-module_i2c_driver(ucd9200_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for TI UCD922x, UCD924x");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/hwmon/pmbus/zl6100.c b/ANDROID_3.4.5/drivers/hwmon/pmbus/zl6100.c
deleted file mode 100644
index fc5eed8e..00000000
--- a/ANDROID_3.4.5/drivers/hwmon/pmbus/zl6100.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Hardware monitoring driver for ZL6100 and compatibles
- *
- * Copyright (c) 2011 Ericsson AB.
- *
- * 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.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/ktime.h>
-#include <linux/delay.h>
-#include "pmbus.h"
-
-enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105,
- zl9101, zl9117 };
-
-struct zl6100_data {
- int id;
- ktime_t access; /* chip access time */
- int delay; /* Delay between chip accesses in uS */
- struct pmbus_driver_info info;
-};
-
-#define to_zl6100_data(x) container_of(x, struct zl6100_data, info)
-
-#define ZL6100_MFR_CONFIG 0xd0
-#define ZL6100_DEVICE_ID 0xe4
-
-#define ZL6100_MFR_XTEMP_ENABLE (1 << 7)
-
-#define ZL6100_WAIT_TIME 1000 /* uS */
-
-static ushort delay = ZL6100_WAIT_TIME;
-module_param(delay, ushort, 0644);
-MODULE_PARM_DESC(delay, "Delay between chip accesses in uS");
-
-/* Some chips need a delay between accesses */
-static inline void zl6100_wait(const struct zl6100_data *data)
-{
- if (data->delay) {
- s64 delta = ktime_us_delta(ktime_get(), data->access);
- if (delta < data->delay)
- udelay(data->delay - delta);
- }
-}
-
-static int zl6100_read_word_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct zl6100_data *data = to_zl6100_data(info);
- int ret;
-
- if (page || reg >= PMBUS_VIRT_BASE)
- return -ENXIO;
-
- if (data->id == zl2005) {
- /*
- * Limit register detection is not reliable on ZL2005.
- * Make sure registers are not erroneously detected.
- */
- switch (reg) {
- case PMBUS_VOUT_OV_WARN_LIMIT:
- case PMBUS_VOUT_UV_WARN_LIMIT:
- case PMBUS_IOUT_OC_WARN_LIMIT:
- return -ENXIO;
- }
- }
-
- zl6100_wait(data);
- ret = pmbus_read_word_data(client, page, reg);
- data->access = ktime_get();
-
- return ret;
-}
-
-static int zl6100_read_byte_data(struct i2c_client *client, int page, int reg)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct zl6100_data *data = to_zl6100_data(info);
- int ret;
-
- if (page > 0)
- return -ENXIO;
-
- zl6100_wait(data);
- ret = pmbus_read_byte_data(client, page, reg);
- data->access = ktime_get();
-
- return ret;
-}
-
-static int zl6100_write_word_data(struct i2c_client *client, int page, int reg,
- u16 word)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct zl6100_data *data = to_zl6100_data(info);
- int ret;
-
- if (page || reg >= PMBUS_VIRT_BASE)
- return -ENXIO;
-
- zl6100_wait(data);
- ret = pmbus_write_word_data(client, page, reg, word);
- data->access = ktime_get();
-
- return ret;
-}
-
-static int zl6100_write_byte(struct i2c_client *client, int page, u8 value)
-{
- const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
- struct zl6100_data *data = to_zl6100_data(info);
- int ret;
-
- if (page > 0)
- return -ENXIO;
-
- zl6100_wait(data);
- ret = pmbus_write_byte(client, page, value);
- data->access = ktime_get();
-
- return ret;
-}
-
-static const struct i2c_device_id zl6100_id[] = {
- {"bmr450", zl2005},
- {"bmr451", zl2005},
- {"bmr462", zl2008},
- {"bmr463", zl2008},
- {"bmr464", zl2008},
- {"zl2004", zl2004},
- {"zl2005", zl2005},
- {"zl2006", zl2006},
- {"zl2008", zl2008},
- {"zl2105", zl2105},
- {"zl2106", zl2106},
- {"zl6100", zl6100},
- {"zl6105", zl6105},
- {"zl9101", zl9101},
- {"zl9117", zl9117},
- { }
-};
-MODULE_DEVICE_TABLE(i2c, zl6100_id);
-
-static int zl6100_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- int ret;
- struct zl6100_data *data;
- struct pmbus_driver_info *info;
- u8 device_id[I2C_SMBUS_BLOCK_MAX + 1];
- const struct i2c_device_id *mid;
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_READ_WORD_DATA
- | I2C_FUNC_SMBUS_READ_BLOCK_DATA))
- return -ENODEV;
-
- ret = i2c_smbus_read_block_data(client, ZL6100_DEVICE_ID,
- device_id);
- if (ret < 0) {
- dev_err(&client->dev, "Failed to read device ID\n");
- return ret;
- }
- device_id[ret] = '\0';
- dev_info(&client->dev, "Device ID %s\n", device_id);
-
- mid = NULL;
- for (mid = zl6100_id; mid->name[0]; mid++) {
- if (!strncasecmp(mid->name, device_id, strlen(mid->name)))
- break;
- }
- if (!mid->name[0]) {
- dev_err(&client->dev, "Unsupported device\n");
- return -ENODEV;
- }
- if (id->driver_data != mid->driver_data)
- dev_notice(&client->dev,
- "Device mismatch: Configured %s, detected %s\n",
- id->name, mid->name);
-
- data = devm_kzalloc(&client->dev, sizeof(struct zl6100_data),
- GFP_KERNEL);
- if (!data)
- return -ENOMEM;
-
- data->id = mid->driver_data;
-
- /*
- * According to information from the chip vendor, all currently
- * supported chips are known to require a wait time between I2C
- * accesses.
- */
- data->delay = delay;
-
- /*
- * Since there was a direct I2C device access above, wait before
- * accessing the chip again.
- */
- data->access = ktime_get();
- zl6100_wait(data);
-
- info = &data->info;
-
- info->pages = 1;
- info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
- | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
- | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
- | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
-
- ret = i2c_smbus_read_word_data(client, ZL6100_MFR_CONFIG);
- if (ret < 0)
- return ret;
-
- if (ret & ZL6100_MFR_XTEMP_ENABLE)
- info->func[0] |= PMBUS_HAVE_TEMP2;
-
- data->access = ktime_get();
- zl6100_wait(data);
-
- info->read_word_data = zl6100_read_word_data;
- info->read_byte_data = zl6100_read_byte_data;
- info->write_word_data = zl6100_write_word_data;
- info->write_byte = zl6100_write_byte;
-
- return pmbus_do_probe(client, mid, info);
-}
-
-static struct i2c_driver zl6100_driver = {
- .driver = {
- .name = "zl6100",
- },
- .probe = zl6100_probe,
- .remove = pmbus_do_remove,
- .id_table = zl6100_id,
-};
-
-module_i2c_driver(zl6100_driver);
-
-MODULE_AUTHOR("Guenter Roeck");
-MODULE_DESCRIPTION("PMBus driver for ZL6100 and compatibles");
-MODULE_LICENSE("GPL");