]> git.sur5r.net Git - groeck-nct6775/blobdiff - nct6775.c
Convert to use SIMPLE_DEV_PM_OPS
[groeck-nct6775] / nct6775.c
index 79633230369ad0fdce8a8ea0514c1ba795ca015b..f847ba529ddbcad83dcda4a56c445c61f1d0865b 100644 (file)
--- a/nct6775.c
+++ b/nct6775.c
@@ -5,7 +5,7 @@
  * Copyright (C) 2012  Guenter Roeck <linux@roeck-us.net>
  *
  * Derived from w83627ehf driver
- * Copyright (C) 2005-2012  Jean Delvare <khali@linux-fr.org>
+ * Copyright (C) 2005-2012  Jean Delvare <jdelvare@suse.de>
  * Copyright (C) 2006  Yuan Mu (Winbond),
  *                    Rudolf Marek <r.marek@assembler.cz>
  *                    David Hubbard <david.c.hubbard@gmail.com>
@@ -533,6 +533,12 @@ static const s8 NCT6791_ALARM_BITS[] = {
        4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
        12, 9 };                        /* intrusion0, intrusion1 */
 
+/* NCT6792 specific data */
+
+static const u16 NCT6792_REG_TEMP_MON[] = {
+       0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
+static const u16 NCT6792_REG_BEEP[NUM_REG_BEEP] = {
+       0xb2, 0xb3, 0xb4, 0xb5, 0xbf };
 
 /* NCT6102D/NCT6106D specific data */
 
@@ -743,7 +749,6 @@ struct nct6775_data {
        struct device *hwmon_dev;
 #endif
 
-       int num_attr_groups;
        const struct attribute_group *groups[6];
 
        u16 reg_temp[5][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst,
@@ -880,12 +885,11 @@ struct nct6775_data {
        u16 have_temp;
        u16 have_temp_fixed;
        u16 have_in;
-#ifdef CONFIG_PM
+
        /* Remember extra register values over suspend/resume */
        u8 vbat;
        u8 fandiv1;
        u8 fandiv2;
-#endif
 };
 
 struct nct6775_sio_data {
@@ -1059,7 +1063,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
                  reg == 0x63a || reg == 0x63c || reg == 0x63e ||
                  reg == 0x640 || reg == 0x642 ||
                  reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
-                 reg == 0x7b;
+                 reg == 0x7b || reg == 0x7d;
        }
        return false;
 }
@@ -1073,6 +1077,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg)
 {
        u8 bank = reg >> 8;
+
        if (data->bank != bank) {
                outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET);
                outb_p(bank, data->addr + DATA_REG_OFFSET);
@@ -1310,6 +1315,7 @@ static void nct6775_update_pwm(struct device *dev)
                if (!data->target_speed_tolerance[i] ||
                    data->pwm_enable[i] == speed_cruise) {
                        u8 t = fanmodecfg & 0x0f;
+
                        if (data->REG_TOLERANCE_H) {
                                t |= (nct6775_read_value(data,
                                      data->REG_TOLERANCE_H[i]) & 0x70) >> 1;
@@ -1484,6 +1490,7 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
                data->alarms = 0;
                for (i = 0; i < NUM_REG_ALARM; i++) {
                        u8 alarm;
+
                        if (!data->REG_ALARM[i])
                                continue;
                        alarm = nct6775_read_value(data, data->REG_ALARM[i]);
@@ -1493,6 +1500,7 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
                data->beeps = 0;
                for (i = 0; i < NUM_REG_BEEP; i++) {
                        u8 beep;
+
                        if (!data->REG_BEEP[i])
                                continue;
                        beep = nct6775_read_value(data, data->REG_BEEP[i]);
@@ -1515,8 +1523,9 @@ show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
-       int nr = sattr->nr;
        int index = sattr->index;
+       int nr = sattr->nr;
+
        return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr));
 }
 
@@ -1526,10 +1535,12 @@ store_in_reg(struct device *dev, struct device_attribute *attr, const char *buf,
 {
        struct nct6775_data *data = dev_get_drvdata(dev);
        struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
-       int nr = sattr->nr;
        int index = sattr->index;
+       int nr = sattr->nr;
        unsigned long val;
-       int err = kstrtoul(buf, 10, &val);
+       int err;
+
+       err = kstrtoul(buf, 10, &val);
        if (err < 0)
                return err;
        mutex_lock(&data->update_lock);
@@ -1546,6 +1557,7 @@ show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = data->ALARM_BITS[sattr->index];
+
        return sprintf(buf, "%u\n",
                       (unsigned int)((data->alarms >> nr) & 0x01));
 }
@@ -1581,6 +1593,7 @@ show_temp_alarm(struct device *dev, struct device_attribute *attr, char *buf)
        nr = find_temp_source(data, sattr->index, data->num_temp_alarms);
        if (nr >= 0) {
                int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE];
+
                alarm = (data->alarms >> bit) & 0x01;
        }
        return sprintf(buf, "%u\n", alarm);
@@ -1606,8 +1619,9 @@ store_beep(struct device *dev, struct device_attribute *attr, const char *buf,
        int nr = data->BEEP_BITS[sattr->index];
        int regindex = nr >> 3;
        unsigned long val;
+       int err;
 
-       int err = kstrtoul(buf, 10, &val);
+       err = kstrtoul(buf, 10, &val);
        if (err < 0)
                return err;
        if (val > 1)
@@ -1640,6 +1654,7 @@ show_temp_beep(struct device *dev, struct device_attribute *attr, char *buf)
        nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
        if (nr >= 0) {
                int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
+
                beep = (data->beeps >> bit) & 0x01;
        }
        return sprintf(buf, "%u\n", beep);
@@ -1653,8 +1668,9 @@ store_temp_beep(struct device *dev, struct device_attribute *attr,
        struct nct6775_data *data = dev_get_drvdata(dev);
        int nr, bit, regindex;
        unsigned long val;
+       int err;
 
-       int err = kstrtoul(buf, 10, &val);
+       err = kstrtoul(buf, 10, &val);
        if (err < 0)
                return err;
        if (val > 1)
@@ -1726,6 +1742,7 @@ show_fan(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
+
        return sprintf(buf, "%d\n", data->rpm[nr]);
 }
 
@@ -1735,6 +1752,7 @@ show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
+
        return sprintf(buf, "%d\n",
                       data->fan_from_reg_min(data->fan_min[nr],
                                              data->fan_div[nr]));
@@ -1746,6 +1764,7 @@ show_fan_div(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
+
        return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
 }
 
@@ -1757,9 +1776,9 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
        unsigned long val;
-       int err;
        unsigned int reg;
        u8 new_div;
+       int err;
 
        err = kstrtoul(buf, 10, &val);
        if (err < 0)
@@ -1943,6 +1962,7 @@ show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
+
        return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]);
 }
 
@@ -2019,6 +2039,7 @@ show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
        struct nct6775_data *data = nct6775_update_device(dev);
        struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
        int nr = sattr->index;
+
        return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
 }
 
@@ -3007,6 +3028,7 @@ static struct sensor_device_template *nct6775_attributes_pwm_template[] = {
        &sensor_dev_template_pwm_auto_point6_temp,
        &sensor_dev_template_pwm_auto_point7_pwm,
        &sensor_dev_template_pwm_auto_point7_temp,      /* 35 */
+
        NULL
 };
 
@@ -3020,6 +3042,7 @@ static ssize_t
 show_vid(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct nct6775_data *data = dev_get_drvdata(dev);
+
        return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
 }
 
@@ -3300,6 +3323,7 @@ static int nct6775_probe(struct platform_device *pdev)
        u8 cr2a;
        struct attribute_group *group;
        struct device *hwmon_dev;
+       int num_attr_groups = 0;
 
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
        if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH,
@@ -3675,12 +3699,20 @@ static int nct6775_probe(struct platform_device *pdev)
                data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL;
                data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE;
                data->REG_ALARM = NCT6791_REG_ALARM;
-               data->REG_BEEP = NCT6776_REG_BEEP;
+               if (data->kind == nct6791)
+                       data->REG_BEEP = NCT6776_REG_BEEP;
+               else
+                       data->REG_BEEP = NCT6792_REG_BEEP;
 
                reg_temp = NCT6779_REG_TEMP;
-               reg_temp_mon = NCT6779_REG_TEMP_MON;
                num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
-               num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
+               if (data->kind == nct6791) {
+                       reg_temp_mon = NCT6779_REG_TEMP_MON;
+                       num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
+               } else {
+                       reg_temp_mon = NCT6792_REG_TEMP_MON;
+                       num_reg_temp_mon = ARRAY_SIZE(NCT6792_REG_TEMP_MON);
+               }
                reg_temp_over = NCT6779_REG_TEMP_OVER;
                reg_temp_hyst = NCT6779_REG_TEMP_HYST;
                reg_temp_config = NCT6779_REG_TEMP_CONFIG;
@@ -3934,34 +3966,34 @@ static int nct6775_probe(struct platform_device *pdev)
        if (IS_ERR(group))
                return PTR_ERR(group);
 
-       data->groups[data->num_attr_groups++] = group;
+       data->groups[num_attr_groups++] = group;
 
        group = nct6775_create_attr_group(dev, &nct6775_in_template_group,
                                          fls(data->have_in));
        if (IS_ERR(group))
                return PTR_ERR(group);
 
-       data->groups[data->num_attr_groups++] = group;
+       data->groups[num_attr_groups++] = group;
 
        group = nct6775_create_attr_group(dev, &nct6775_fan_template_group,
                                          fls(data->has_fan));
        if (IS_ERR(group))
                return PTR_ERR(group);
 
-       data->groups[data->num_attr_groups++] = group;
+       data->groups[num_attr_groups++] = group;
 
        group = nct6775_create_attr_group(dev, &nct6775_temp_template_group,
                                          fls(data->have_temp));
        if (IS_ERR(group))
                return PTR_ERR(group);
 
-       data->groups[data->num_attr_groups++] = group;
-       data->groups[data->num_attr_groups++] = &nct6775_group_other;
+       data->groups[num_attr_groups++] = group;
+       data->groups[num_attr_groups++] = &nct6775_group_other;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
        err = sysfs_create_groups(&dev->kobj, data->groups);
        if (err < 0)
-               return err;
+               return err;
        hwmon_dev = hwmon_device_register(dev);
        if (IS_ERR(hwmon_dev)) {
                sysfs_remove_groups(&dev->kobj, data->groups);
@@ -3998,8 +4030,7 @@ static void nct6791_enable_io_mapping(int sioaddr)
        }
 }
 
-#ifdef CONFIG_PM
-static int nct6775_suspend(struct device *dev)
+static int __maybe_unused nct6775_suspend(struct device *dev)
 {
        struct nct6775_data *data = nct6775_update_device(dev);
 
@@ -4014,7 +4045,7 @@ static int nct6775_suspend(struct device *dev)
        return 0;
 }
 
-static int nct6775_resume(struct device *dev)
+static int __maybe_unused nct6775_resume(struct device *dev)
 {
        struct nct6775_data *data = dev_get_drvdata(dev);
        int i, j, err = 0;
@@ -4075,23 +4106,13 @@ abort:
        return err;
 }
 
-static const struct dev_pm_ops nct6775_dev_pm_ops = {
-       .suspend = nct6775_suspend,
-       .resume = nct6775_resume,
-       .freeze = nct6775_suspend,
-       .restore = nct6775_resume,
-};
-
-#define NCT6775_DEV_PM_OPS     (&nct6775_dev_pm_ops)
-#else
-#define NCT6775_DEV_PM_OPS     NULL
-#endif /* CONFIG_PM */
+static SIMPLE_DEV_PM_OPS(nct6775_dev_pm_ops, nct6775_suspend, nct6775_resume);
 
 static struct platform_driver nct6775_driver = {
        .driver = {
                .owner  = THIS_MODULE,
                .name   = DRVNAME,
-               .pm     = NCT6775_DEV_PM_OPS,
+               .pm     = &nct6775_dev_pm_ops,
        },
        .probe          = nct6775_probe,
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
@@ -4217,7 +4238,7 @@ static int __init sensors_nct6775_init(void)
                pdev[i] = platform_device_alloc(DRVNAME, address);
                if (!pdev[i]) {
                        err = -ENOMEM;
-                       goto exit_device_put;
+                       goto exit_device_unregister;
                }
 
                err = platform_device_add_data(pdev[i], &sio_data,
@@ -4255,9 +4276,11 @@ static int __init sensors_nct6775_init(void)
        return 0;
 
 exit_device_put:
-       for (i = 0; i < ARRAY_SIZE(pdev); i++) {
+       platform_device_put(pdev[i]);
+exit_device_unregister:
+       while (--i >= 0) {
                if (pdev[i])
-                       platform_device_put(pdev[i]);
+                       platform_device_unregister(pdev[i]);
        }
 exit_unregister:
        platform_driver_unregister(&nct6775_driver);
@@ -4276,7 +4299,7 @@ static void __exit sensors_nct6775_exit(void)
 }
 
 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
-MODULE_DESCRIPTION("NCT6775F/NCT6776F/NCT6779D driver");
+MODULE_DESCRIPTION("NCT6106D/NCT6775F/NCT6776F/NCT6779D/NCT6791D/NCT6792D driver");
 MODULE_LICENSE("GPL");
 
 module_init(sensors_nct6775_init);