diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-07-16 11:10:46 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2014-08-04 10:01:39 -0400 |
commit | 573bfe67ca1057febc6a0ccd8caff9a9fdb01994 (patch) | |
tree | f1444b948775b9d4205c77c515fb674449c80d67 | |
parent | a2cc242823399bcb64dcd487f8b51c061844165c (diff) |
hwmon: (adt7462) Convert to devm_hwmon_device_register_with_groups
Use ATTRIBUTE_GROUPS macro and devm_hwmon_device_register_with_groups() to
simplify the code a bit.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/adt7462.c | 106 |
1 files changed, 42 insertions, 64 deletions
diff --git a/drivers/hwmon/adt7462.c b/drivers/hwmon/adt7462.c index c4a1784e3f2b..5929e126da63 100644 --- a/drivers/hwmon/adt7462.c +++ b/drivers/hwmon/adt7462.c | |||
@@ -202,8 +202,7 @@ static const unsigned short normal_i2c[] = { 0x58, 0x5C, I2C_CLIENT_END }; | |||
202 | (((value) & prefix##_MASK) >> prefix##_SHIFT) | 202 | (((value) & prefix##_MASK) >> prefix##_SHIFT) |
203 | 203 | ||
204 | struct adt7462_data { | 204 | struct adt7462_data { |
205 | struct device *hwmon_dev; | 205 | struct i2c_client *client; |
206 | struct attribute_group attrs; | ||
207 | struct mutex lock; | 206 | struct mutex lock; |
208 | char sensors_valid; | 207 | char sensors_valid; |
209 | char limits_valid; | 208 | char limits_valid; |
@@ -681,8 +680,8 @@ static int find_trange_value(int trange) | |||
681 | 680 | ||
682 | static struct adt7462_data *adt7462_update_device(struct device *dev) | 681 | static struct adt7462_data *adt7462_update_device(struct device *dev) |
683 | { | 682 | { |
684 | struct i2c_client *client = to_i2c_client(dev); | 683 | struct adt7462_data *data = dev_get_drvdata(dev); |
685 | struct adt7462_data *data = i2c_get_clientdata(client); | 684 | struct i2c_client *client = data->client; |
686 | unsigned long local_jiffies = jiffies; | 685 | unsigned long local_jiffies = jiffies; |
687 | int i; | 686 | int i; |
688 | 687 | ||
@@ -804,8 +803,8 @@ static ssize_t set_temp_min(struct device *dev, | |||
804 | size_t count) | 803 | size_t count) |
805 | { | 804 | { |
806 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 805 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
807 | struct i2c_client *client = to_i2c_client(dev); | 806 | struct adt7462_data *data = dev_get_drvdata(dev); |
808 | struct adt7462_data *data = i2c_get_clientdata(client); | 807 | struct i2c_client *client = data->client; |
809 | long temp; | 808 | long temp; |
810 | 809 | ||
811 | if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) | 810 | if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) |
@@ -842,8 +841,8 @@ static ssize_t set_temp_max(struct device *dev, | |||
842 | size_t count) | 841 | size_t count) |
843 | { | 842 | { |
844 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 843 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
845 | struct i2c_client *client = to_i2c_client(dev); | 844 | struct adt7462_data *data = dev_get_drvdata(dev); |
846 | struct adt7462_data *data = i2c_get_clientdata(client); | 845 | struct i2c_client *client = data->client; |
847 | long temp; | 846 | long temp; |
848 | 847 | ||
849 | if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) | 848 | if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index)) |
@@ -905,8 +904,8 @@ static ssize_t set_volt_max(struct device *dev, | |||
905 | size_t count) | 904 | size_t count) |
906 | { | 905 | { |
907 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 906 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
908 | struct i2c_client *client = to_i2c_client(dev); | 907 | struct adt7462_data *data = dev_get_drvdata(dev); |
909 | struct adt7462_data *data = i2c_get_clientdata(client); | 908 | struct i2c_client *client = data->client; |
910 | int x = voltage_multiplier(data, attr->index); | 909 | int x = voltage_multiplier(data, attr->index); |
911 | long temp; | 910 | long temp; |
912 | 911 | ||
@@ -947,8 +946,8 @@ static ssize_t set_volt_min(struct device *dev, | |||
947 | size_t count) | 946 | size_t count) |
948 | { | 947 | { |
949 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 948 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
950 | struct i2c_client *client = to_i2c_client(dev); | 949 | struct adt7462_data *data = dev_get_drvdata(dev); |
951 | struct adt7462_data *data = i2c_get_clientdata(client); | 950 | struct i2c_client *client = data->client; |
952 | int x = voltage_multiplier(data, attr->index); | 951 | int x = voltage_multiplier(data, attr->index); |
953 | long temp; | 952 | long temp; |
954 | 953 | ||
@@ -1037,8 +1036,8 @@ static ssize_t set_fan_min(struct device *dev, | |||
1037 | const char *buf, size_t count) | 1036 | const char *buf, size_t count) |
1038 | { | 1037 | { |
1039 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1038 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1040 | struct i2c_client *client = to_i2c_client(dev); | 1039 | struct adt7462_data *data = dev_get_drvdata(dev); |
1041 | struct adt7462_data *data = i2c_get_clientdata(client); | 1040 | struct i2c_client *client = data->client; |
1042 | long temp; | 1041 | long temp; |
1043 | 1042 | ||
1044 | if (kstrtol(buf, 10, &temp) || !temp || | 1043 | if (kstrtol(buf, 10, &temp) || !temp || |
@@ -1085,8 +1084,8 @@ static ssize_t set_force_pwm_max(struct device *dev, | |||
1085 | const char *buf, | 1084 | const char *buf, |
1086 | size_t count) | 1085 | size_t count) |
1087 | { | 1086 | { |
1088 | struct i2c_client *client = to_i2c_client(dev); | 1087 | struct adt7462_data *data = dev_get_drvdata(dev); |
1089 | struct adt7462_data *data = i2c_get_clientdata(client); | 1088 | struct i2c_client *client = data->client; |
1090 | long temp; | 1089 | long temp; |
1091 | u8 reg; | 1090 | u8 reg; |
1092 | 1091 | ||
@@ -1118,8 +1117,8 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, | |||
1118 | const char *buf, size_t count) | 1117 | const char *buf, size_t count) |
1119 | { | 1118 | { |
1120 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1119 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1121 | struct i2c_client *client = to_i2c_client(dev); | 1120 | struct adt7462_data *data = dev_get_drvdata(dev); |
1122 | struct adt7462_data *data = i2c_get_clientdata(client); | 1121 | struct i2c_client *client = data->client; |
1123 | long temp; | 1122 | long temp; |
1124 | 1123 | ||
1125 | if (kstrtol(buf, 10, &temp)) | 1124 | if (kstrtol(buf, 10, &temp)) |
@@ -1148,8 +1147,8 @@ static ssize_t set_pwm_max(struct device *dev, | |||
1148 | const char *buf, | 1147 | const char *buf, |
1149 | size_t count) | 1148 | size_t count) |
1150 | { | 1149 | { |
1151 | struct i2c_client *client = to_i2c_client(dev); | 1150 | struct adt7462_data *data = dev_get_drvdata(dev); |
1152 | struct adt7462_data *data = i2c_get_clientdata(client); | 1151 | struct i2c_client *client = data->client; |
1153 | long temp; | 1152 | long temp; |
1154 | 1153 | ||
1155 | if (kstrtol(buf, 10, &temp)) | 1154 | if (kstrtol(buf, 10, &temp)) |
@@ -1180,8 +1179,8 @@ static ssize_t set_pwm_min(struct device *dev, | |||
1180 | size_t count) | 1179 | size_t count) |
1181 | { | 1180 | { |
1182 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1181 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1183 | struct i2c_client *client = to_i2c_client(dev); | 1182 | struct adt7462_data *data = dev_get_drvdata(dev); |
1184 | struct adt7462_data *data = i2c_get_clientdata(client); | 1183 | struct i2c_client *client = data->client; |
1185 | long temp; | 1184 | long temp; |
1186 | 1185 | ||
1187 | if (kstrtol(buf, 10, &temp)) | 1186 | if (kstrtol(buf, 10, &temp)) |
@@ -1214,8 +1213,8 @@ static ssize_t set_pwm_hyst(struct device *dev, | |||
1214 | size_t count) | 1213 | size_t count) |
1215 | { | 1214 | { |
1216 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1215 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1217 | struct i2c_client *client = to_i2c_client(dev); | 1216 | struct adt7462_data *data = dev_get_drvdata(dev); |
1218 | struct adt7462_data *data = i2c_get_clientdata(client); | 1217 | struct i2c_client *client = data->client; |
1219 | long temp; | 1218 | long temp; |
1220 | 1219 | ||
1221 | if (kstrtol(buf, 10, &temp)) | 1220 | if (kstrtol(buf, 10, &temp)) |
@@ -1259,8 +1258,8 @@ static ssize_t set_pwm_tmax(struct device *dev, | |||
1259 | { | 1258 | { |
1260 | int temp; | 1259 | int temp; |
1261 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1260 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1262 | struct i2c_client *client = to_i2c_client(dev); | 1261 | struct adt7462_data *data = dev_get_drvdata(dev); |
1263 | struct adt7462_data *data = i2c_get_clientdata(client); | 1262 | struct i2c_client *client = data->client; |
1264 | int tmin, trange_value; | 1263 | int tmin, trange_value; |
1265 | long trange; | 1264 | long trange; |
1266 | 1265 | ||
@@ -1300,8 +1299,8 @@ static ssize_t set_pwm_tmin(struct device *dev, | |||
1300 | size_t count) | 1299 | size_t count) |
1301 | { | 1300 | { |
1302 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1301 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1303 | struct i2c_client *client = to_i2c_client(dev); | 1302 | struct adt7462_data *data = dev_get_drvdata(dev); |
1304 | struct adt7462_data *data = i2c_get_clientdata(client); | 1303 | struct i2c_client *client = data->client; |
1305 | long temp; | 1304 | long temp; |
1306 | 1305 | ||
1307 | if (kstrtol(buf, 10, &temp)) | 1306 | if (kstrtol(buf, 10, &temp)) |
@@ -1357,8 +1356,8 @@ static ssize_t set_pwm_auto(struct device *dev, | |||
1357 | size_t count) | 1356 | size_t count) |
1358 | { | 1357 | { |
1359 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1358 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1360 | struct i2c_client *client = to_i2c_client(dev); | 1359 | struct adt7462_data *data = dev_get_drvdata(dev); |
1361 | struct adt7462_data *data = i2c_get_clientdata(client); | 1360 | struct i2c_client *client = data->client; |
1362 | long temp; | 1361 | long temp; |
1363 | 1362 | ||
1364 | if (kstrtol(buf, 10, &temp)) | 1363 | if (kstrtol(buf, 10, &temp)) |
@@ -1416,8 +1415,8 @@ static ssize_t set_pwm_auto_temp(struct device *dev, | |||
1416 | size_t count) | 1415 | size_t count) |
1417 | { | 1416 | { |
1418 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 1417 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
1419 | struct i2c_client *client = to_i2c_client(dev); | 1418 | struct adt7462_data *data = dev_get_drvdata(dev); |
1420 | struct adt7462_data *data = i2c_get_clientdata(client); | 1419 | struct i2c_client *client = data->client; |
1421 | long temp; | 1420 | long temp; |
1422 | 1421 | ||
1423 | if (kstrtol(buf, 10, &temp)) | 1422 | if (kstrtol(buf, 10, &temp)) |
@@ -1701,7 +1700,7 @@ static SENSOR_DEVICE_ATTR(pwm3_auto_channels_temp, S_IWUSR | S_IRUGO, | |||
1701 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, | 1700 | static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, |
1702 | show_pwm_auto_temp, set_pwm_auto_temp, 3); | 1701 | show_pwm_auto_temp, set_pwm_auto_temp, 3); |
1703 | 1702 | ||
1704 | static struct attribute *adt7462_attr[] = { | 1703 | static struct attribute *adt7462_attrs[] = { |
1705 | &sensor_dev_attr_temp1_max.dev_attr.attr, | 1704 | &sensor_dev_attr_temp1_max.dev_attr.attr, |
1706 | &sensor_dev_attr_temp2_max.dev_attr.attr, | 1705 | &sensor_dev_attr_temp2_max.dev_attr.attr, |
1707 | &sensor_dev_attr_temp3_max.dev_attr.attr, | 1706 | &sensor_dev_attr_temp3_max.dev_attr.attr, |
@@ -1872,6 +1871,8 @@ static struct attribute *adt7462_attr[] = { | |||
1872 | NULL | 1871 | NULL |
1873 | }; | 1872 | }; |
1874 | 1873 | ||
1874 | ATTRIBUTE_GROUPS(adt7462); | ||
1875 | |||
1875 | /* Return 0 if detection is successful, -ENODEV otherwise */ | 1876 | /* Return 0 if detection is successful, -ENODEV otherwise */ |
1876 | static int adt7462_detect(struct i2c_client *client, | 1877 | static int adt7462_detect(struct i2c_client *client, |
1877 | struct i2c_board_info *info) | 1878 | struct i2c_board_info *info) |
@@ -1902,45 +1903,23 @@ static int adt7462_detect(struct i2c_client *client, | |||
1902 | static int adt7462_probe(struct i2c_client *client, | 1903 | static int adt7462_probe(struct i2c_client *client, |
1903 | const struct i2c_device_id *id) | 1904 | const struct i2c_device_id *id) |
1904 | { | 1905 | { |
1906 | struct device *dev = &client->dev; | ||
1905 | struct adt7462_data *data; | 1907 | struct adt7462_data *data; |
1906 | int err; | 1908 | struct device *hwmon_dev; |
1907 | 1909 | ||
1908 | data = devm_kzalloc(&client->dev, sizeof(struct adt7462_data), | 1910 | data = devm_kzalloc(dev, sizeof(struct adt7462_data), GFP_KERNEL); |
1909 | GFP_KERNEL); | ||
1910 | if (!data) | 1911 | if (!data) |
1911 | return -ENOMEM; | 1912 | return -ENOMEM; |
1912 | 1913 | ||
1913 | i2c_set_clientdata(client, data); | 1914 | data->client = client; |
1914 | mutex_init(&data->lock); | 1915 | mutex_init(&data->lock); |
1915 | 1916 | ||
1916 | dev_info(&client->dev, "%s chip found\n", client->name); | 1917 | dev_info(&client->dev, "%s chip found\n", client->name); |
1917 | 1918 | ||
1918 | /* Register sysfs hooks */ | 1919 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
1919 | data->attrs.attrs = adt7462_attr; | 1920 | data, |
1920 | err = sysfs_create_group(&client->dev.kobj, &data->attrs); | 1921 | adt7462_groups); |
1921 | if (err) | 1922 | return PTR_ERR_OR_ZERO(hwmon_dev); |
1922 | return err; | ||
1923 | |||
1924 | data->hwmon_dev = hwmon_device_register(&client->dev); | ||
1925 | if (IS_ERR(data->hwmon_dev)) { | ||
1926 | err = PTR_ERR(data->hwmon_dev); | ||
1927 | goto exit_remove; | ||
1928 | } | ||
1929 | |||
1930 | return 0; | ||
1931 | |||
1932 | exit_remove: | ||
1933 | sysfs_remove_group(&client->dev.kobj, &data->attrs); | ||
1934 | return err; | ||
1935 | } | ||
1936 | |||
1937 | static int adt7462_remove(struct i2c_client *client) | ||
1938 | { | ||
1939 | struct adt7462_data *data = i2c_get_clientdata(client); | ||
1940 | |||
1941 | hwmon_device_unregister(data->hwmon_dev); | ||
1942 | sysfs_remove_group(&client->dev.kobj, &data->attrs); | ||
1943 | return 0; | ||
1944 | } | 1923 | } |
1945 | 1924 | ||
1946 | static const struct i2c_device_id adt7462_id[] = { | 1925 | static const struct i2c_device_id adt7462_id[] = { |
@@ -1955,7 +1934,6 @@ static struct i2c_driver adt7462_driver = { | |||
1955 | .name = "adt7462", | 1934 | .name = "adt7462", |
1956 | }, | 1935 | }, |
1957 | .probe = adt7462_probe, | 1936 | .probe = adt7462_probe, |
1958 | .remove = adt7462_remove, | ||
1959 | .id_table = adt7462_id, | 1937 | .id_table = adt7462_id, |
1960 | .detect = adt7462_detect, | 1938 | .detect = adt7462_detect, |
1961 | .address_list = normal_i2c, | 1939 | .address_list = normal_i2c, |