diff options
Diffstat (limited to 'drivers/misc/nct1008.c')
-rw-r--r-- | drivers/misc/nct1008.c | 89 |
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); |