diff options
Diffstat (limited to 'ANDROID_3.4.5/drivers/hwmon/pmbus')
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/Kconfig | 124 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/Makefile | 15 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/adm1275.c | 397 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/lm25066.c | 321 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/ltc2978.c | 378 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/max16064.c | 127 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/max34440.c | 364 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/max8688.c | 204 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.c | 217 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus.h | 376 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/pmbus_core.c | 1811 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9000.c | 246 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/ucd9200.c | 180 | ||||
-rw-r--r-- | ANDROID_3.4.5/drivers/hwmon/pmbus/zl6100.c | 259 |
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"); |