summaryrefslogtreecommitdiff
path: root/drivers/misc/nct1008.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/nct1008.c')
-rw-r--r--drivers/misc/nct1008.c89
1 files changed, 53 insertions, 36 deletions
diff --git a/drivers/misc/nct1008.c b/drivers/misc/nct1008.c
index 56678a795497..a2714698d00d 100644
--- a/drivers/misc/nct1008.c
+++ b/drivers/misc/nct1008.c
@@ -3,7 +3,7 @@
*
* Driver for NCT1008, temperature monitoring device from ON Semiconductors
*
- * Copyright (c) 2010-2011, NVIDIA Corporation.
+ * Copyright (c) 2010-2012, NVIDIA Corporation.
*
* 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
@@ -32,8 +32,6 @@
#include <linux/delay.h>
#include <linux/regulator/consumer.h>
-#define DRIVER_NAME "nct1008"
-
/* Register Addresses */
#define LOCAL_TEMP_RD 0x00
#define EXT_TEMP_RD_HI 0x01
@@ -94,7 +92,7 @@ static inline u8 temperature_to_value(bool extended, s8 temp)
return extended ? (u8)(temp + EXTENDED_RANGE_OFFSET) : (u8)temp;
}
-static int nct1008_get_temp(struct device *dev, long *pTemp)
+static int nct1008_get_temp(struct device *dev, long *etemp, long *itemp)
{
struct i2c_client *client = to_i2c_client(dev);
struct nct1008_platform_data *pdata = client->dev.platform_data;
@@ -106,30 +104,34 @@ static int nct1008_get_temp(struct device *dev, long *pTemp)
u8 value;
/* Read Local Temp */
- value = i2c_smbus_read_byte_data(client, LOCAL_TEMP_RD);
- if (value < 0)
- goto error;
- temp_local = value_to_temperature(pdata->ext_range, value);
- temp_local_milli = CELSIUS_TO_MILLICELSIUS(temp_local);
+ if (itemp) {
+ value = i2c_smbus_read_byte_data(client, LOCAL_TEMP_RD);
+ if (value < 0)
+ goto error;
+ temp_local = value_to_temperature(pdata->ext_range, value);
+ temp_local_milli = CELSIUS_TO_MILLICELSIUS(temp_local);
+
+ *itemp = temp_local_milli;
+ }
/* Read External Temp */
- value = i2c_smbus_read_byte_data(client, EXT_TEMP_RD_LO);
- if (value < 0)
- goto error;
- temp_ext_lo = (value >> 6);
+ if (etemp) {
+ value = i2c_smbus_read_byte_data(client, EXT_TEMP_RD_LO);
+ if (value < 0)
+ goto error;
+ temp_ext_lo = (value >> 6);
- value = i2c_smbus_read_byte_data(client, EXT_TEMP_RD_HI);
- if (value < 0)
- goto error;
- temp_ext_hi = value_to_temperature(pdata->ext_range, value);
+ value = i2c_smbus_read_byte_data(client, EXT_TEMP_RD_HI);
+ if (value < 0)
+ goto error;
+ temp_ext_hi = value_to_temperature(pdata->ext_range, value);
- temp_ext_milli = CELSIUS_TO_MILLICELSIUS(temp_ext_hi) +
- temp_ext_lo * 250;
+ temp_ext_milli = CELSIUS_TO_MILLICELSIUS(temp_ext_hi) +
+ temp_ext_lo * 250;
- /* Return max between Local and External Temp */
- *pTemp = max(temp_local_milli, temp_ext_milli);
+ *etemp = temp_ext_milli;
+ }
- dev_dbg(dev, "\n %s: ret temp=%ldC ", __func__, *pTemp);
return 0;
error:
dev_err(&client->dev, "\n error in file=: %s %s() line=%d: "
@@ -225,7 +227,7 @@ static ssize_t nct1008_set_temp_overheat(struct device *dev,
return -EINVAL;
}
/* check for system power down */
- err = nct1008_get_temp(dev, &currTemp);
+ err = nct1008_get_temp(dev, &currTemp, NULL);
if (err)
goto error;
@@ -403,7 +405,7 @@ static void print_reg(const char *reg_name, struct seq_file *s,
static int dbg_nct1008_show(struct seq_file *s, void *unused)
{
- seq_printf(s, "nct1008 Registers\n");
+ seq_printf(s, "nct1008 nct72 Registers\n");
seq_printf(s, "------------------\n");
print_reg("Local Temp Value ", s, 0x00);
print_reg("Ext Temp Value Hi ", s, 0x01);
@@ -442,8 +444,12 @@ static int __init nct1008_debuginit(struct nct1008_data *nct)
{
int err = 0;
struct dentry *d;
- d = debugfs_create_file("nct1008", S_IRUGO, NULL,
- (void *)nct, &debug_fops);
+ if (nct->chip == NCT72)
+ d = debugfs_create_file("nct72", S_IRUGO, NULL,
+ (void *)nct, &debug_fops);
+ else
+ d = debugfs_create_file("nct1008", S_IRUGO, NULL,
+ (void *)nct, &debug_fops);
if ((!d) || IS_ERR(d)) {
dev_err(&nct->client->dev, "Error: %s debugfs_create_file"
" returned an error\n", __func__);
@@ -563,12 +569,14 @@ static void nct1008_power_control(struct nct1008_data *data, bool is_enable)
ret = regulator_disable(data->nct_reg);
if (ret < 0)
- dev_err(&data->client->dev, "Error in %s rail vdd_nct1008, "
+ dev_err(&data->client->dev, "Error in %s rail vdd_nct%s, "
"error %d\n", (is_enable) ? "enabling" : "disabling",
+ (data->chip == NCT72) ? "72" : "1008",
ret);
else
- dev_info(&data->client->dev, "success in %s rail vdd_nct1008\n",
- (is_enable) ? "enabling" : "disabling");
+ dev_info(&data->client->dev, "success in %s rail vdd_nct%s\n",
+ (is_enable) ? "enabling" : "disabling",
+ (data->chip == NCT72) ? "72" : "1008");
}
static int __devinit nct1008_configure_sensor(struct nct1008_data* data)
@@ -692,7 +700,8 @@ error:
static int __devinit nct1008_configure_irq(struct nct1008_data *data)
{
- data->workqueue = create_singlethread_workqueue("nct1008");
+ data->workqueue = create_singlethread_workqueue((data->chip == NCT72) \
+ ? "nct72" : "nct1008");
INIT_WORK(&data->work, nct1008_work_func);
@@ -701,12 +710,18 @@ static int __devinit nct1008_configure_irq(struct nct1008_data *data)
else
return request_irq(data->client->irq, nct1008_irq,
IRQF_TRIGGER_LOW,
- DRIVER_NAME, data);
+ (data->chip == NCT72) ? "nct72" : "nct1008",
+ data);
}
int nct1008_thermal_get_temp(struct nct1008_data *data, long *temp)
{
- return nct1008_get_temp(&data->client->dev, temp);
+ return nct1008_get_temp(&data->client->dev, temp, NULL);
+}
+
+int nct1008_thermal_get_temps(struct nct1008_data *data, long *etemp, long *itemp)
+{
+ return nct1008_get_temp(&data->client->dev, etemp, itemp);
}
int nct1008_thermal_get_temp_low(struct nct1008_data *data, long *temp)
@@ -816,6 +831,7 @@ static int __devinit nct1008_probe(struct i2c_client *client,
return -ENOMEM;
data->client = client;
+ data->chip = id->driver_data;
memcpy(&data->plat_data, client->dev.platform_data,
sizeof(struct nct1008_platform_data));
i2c_set_clientdata(client, data);
@@ -911,14 +927,15 @@ static int nct1008_resume(struct i2c_client *client)
#endif
static const struct i2c_device_id nct1008_id[] = {
- { DRIVER_NAME, 0 },
- { }
+ { "nct1008", NCT1008 },
+ { "nct72", NCT72},
+ {}
};
MODULE_DEVICE_TABLE(i2c, nct1008_id);
static struct i2c_driver nct1008_driver = {
.driver = {
- .name = DRIVER_NAME,
+ .name = "nct1008_nct72",
},
.probe = nct1008_probe,
.remove = __devexit_p(nct1008_remove),
@@ -939,7 +956,7 @@ static void __exit nct1008_exit(void)
i2c_del_driver(&nct1008_driver);
}
-MODULE_DESCRIPTION("Temperature sensor driver for OnSemi NCT1008");
+MODULE_DESCRIPTION("Temperature sensor driver for OnSemi NCT1008/NCT72");
MODULE_LICENSE("GPL");
module_init(nct1008_init);