aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/hih6130.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/hih6130.c')
-rw-r--r--drivers/hwmon/hih6130.c85
1 files changed, 23 insertions, 62 deletions
diff --git a/drivers/hwmon/hih6130.c b/drivers/hwmon/hih6130.c
index 7d68a08baaa8..7b73d2002d3e 100644
--- a/drivers/hwmon/hih6130.c
+++ b/drivers/hwmon/hih6130.c
@@ -46,7 +46,7 @@
46 * @write_length: length for I2C measurement request 46 * @write_length: length for I2C measurement request
47 */ 47 */
48struct hih6130 { 48struct hih6130 {
49 struct device *hwmon_dev; 49 struct i2c_client *client;
50 struct mutex lock; 50 struct mutex lock;
51 bool valid; 51 bool valid;
52 unsigned long last_update; 52 unsigned long last_update;
@@ -62,7 +62,6 @@ struct hih6130 {
62 */ 62 */
63static inline int hih6130_temp_ticks_to_millicelsius(int ticks) 63static inline int hih6130_temp_ticks_to_millicelsius(int ticks)
64{ 64{
65
66 ticks = ticks >> 2; 65 ticks = ticks >> 2;
67 /* 66 /*
68 * from data sheet section 5.0 67 * from data sheet section 5.0
@@ -78,7 +77,6 @@ static inline int hih6130_temp_ticks_to_millicelsius(int ticks)
78 */ 77 */
79static inline int hih6130_rh_ticks_to_per_cent_mille(int ticks) 78static inline int hih6130_rh_ticks_to_per_cent_mille(int ticks)
80{ 79{
81
82 ticks &= ~0xC000; /* clear status bits */ 80 ticks &= ~0xC000; /* clear status bits */
83 /* 81 /*
84 * from data sheet section 4.0 82 * from data sheet section 4.0
@@ -89,15 +87,16 @@ static inline int hih6130_rh_ticks_to_per_cent_mille(int ticks)
89 87
90/** 88/**
91 * hih6130_update_measurements() - get updated measurements from device 89 * hih6130_update_measurements() - get updated measurements from device
92 * @client: I2C client device 90 * @dev: device
93 * 91 *
94 * Returns 0 on success, else negative errno. 92 * Returns 0 on success, else negative errno.
95 */ 93 */
96static int hih6130_update_measurements(struct i2c_client *client) 94static int hih6130_update_measurements(struct device *dev)
97{ 95{
96 struct hih6130 *hih6130 = dev_get_drvdata(dev);
97 struct i2c_client *client = hih6130->client;
98 int ret = 0; 98 int ret = 0;
99 int t; 99 int t;
100 struct hih6130 *hih6130 = i2c_get_clientdata(client);
101 unsigned char tmp[4]; 100 unsigned char tmp[4];
102 struct i2c_msg msgs[1] = { 101 struct i2c_msg msgs[1] = {
103 { 102 {
@@ -176,9 +175,10 @@ static ssize_t hih6130_show_temperature(struct device *dev,
176 struct device_attribute *attr, 175 struct device_attribute *attr,
177 char *buf) 176 char *buf)
178{ 177{
179 struct i2c_client *client = to_i2c_client(dev); 178 struct hih6130 *hih6130 = dev_get_drvdata(dev);
180 struct hih6130 *hih6130 = i2c_get_clientdata(client); 179 int ret;
181 int ret = hih6130_update_measurements(client); 180
181 ret = hih6130_update_measurements(dev);
182 if (ret < 0) 182 if (ret < 0)
183 return ret; 183 return ret;
184 return sprintf(buf, "%d\n", hih6130->temperature); 184 return sprintf(buf, "%d\n", hih6130->temperature);
@@ -196,9 +196,10 @@ static ssize_t hih6130_show_temperature(struct device *dev,
196static ssize_t hih6130_show_humidity(struct device *dev, 196static ssize_t hih6130_show_humidity(struct device *dev,
197 struct device_attribute *attr, char *buf) 197 struct device_attribute *attr, char *buf)
198{ 198{
199 struct i2c_client *client = to_i2c_client(dev); 199 struct hih6130 *hih6130 = dev_get_drvdata(dev);
200 struct hih6130 *hih6130 = i2c_get_clientdata(client); 200 int ret;
201 int ret = hih6130_update_measurements(client); 201
202 ret = hih6130_update_measurements(dev);
202 if (ret < 0) 203 if (ret < 0)
203 return ret; 204 return ret;
204 return sprintf(buf, "%d\n", hih6130->humidity); 205 return sprintf(buf, "%d\n", hih6130->humidity);
@@ -210,79 +211,40 @@ static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, hih6130_show_temperature,
210static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO, hih6130_show_humidity, 211static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO, hih6130_show_humidity,
211 NULL, 0); 212 NULL, 0);
212 213
213static struct attribute *hih6130_attributes[] = { 214static struct attribute *hih6130_attrs[] = {
214 &sensor_dev_attr_temp1_input.dev_attr.attr, 215 &sensor_dev_attr_temp1_input.dev_attr.attr,
215 &sensor_dev_attr_humidity1_input.dev_attr.attr, 216 &sensor_dev_attr_humidity1_input.dev_attr.attr,
216 NULL 217 NULL
217}; 218};
218 219
219static const struct attribute_group hih6130_attr_group = { 220ATTRIBUTE_GROUPS(hih6130);
220 .attrs = hih6130_attributes,
221};
222 221
223/**
224 * hih6130_probe() - probe device
225 * @client: I2C client device
226 * @id: device ID
227 *
228 * Called by the I2C core when an entry in the ID table matches a
229 * device's name.
230 * Returns 0 on success.
231 */
232static int hih6130_probe(struct i2c_client *client, 222static int hih6130_probe(struct i2c_client *client,
233 const struct i2c_device_id *id) 223 const struct i2c_device_id *id)
234{ 224{
225 struct device *dev = &client->dev;
235 struct hih6130 *hih6130; 226 struct hih6130 *hih6130;
236 int err; 227 struct device *hwmon_dev;
237 228
238 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 229 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
239 dev_err(&client->dev, "adapter does not support true I2C\n"); 230 dev_err(&client->dev, "adapter does not support true I2C\n");
240 return -ENODEV; 231 return -ENODEV;
241 } 232 }
242 233
243 hih6130 = devm_kzalloc(&client->dev, sizeof(*hih6130), GFP_KERNEL); 234 hih6130 = devm_kzalloc(dev, sizeof(*hih6130), GFP_KERNEL);
244 if (!hih6130) 235 if (!hih6130)
245 return -ENOMEM; 236 return -ENOMEM;
246 237
247 i2c_set_clientdata(client, hih6130); 238 hih6130->client = client;
248
249 mutex_init(&hih6130->lock); 239 mutex_init(&hih6130->lock);
250 240
251 err = sysfs_create_group(&client->dev.kobj, &hih6130_attr_group);
252 if (err) {
253 dev_dbg(&client->dev, "could not create sysfs files\n");
254 return err;
255 }
256
257 hih6130->hwmon_dev = hwmon_device_register(&client->dev);
258 if (IS_ERR(hih6130->hwmon_dev)) {
259 dev_dbg(&client->dev, "unable to register hwmon device\n");
260 err = PTR_ERR(hih6130->hwmon_dev);
261 goto fail_remove_sysfs;
262 }
263
264 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_QUICK)) 241 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_QUICK))
265 hih6130->write_length = 1; 242 hih6130->write_length = 1;
266 243
267 return 0; 244 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
268 245 hih6130,
269fail_remove_sysfs: 246 hih6130_groups);
270 sysfs_remove_group(&client->dev.kobj, &hih6130_attr_group); 247 return PTR_ERR_OR_ZERO(hwmon_dev);
271 return err;
272}
273
274/**
275 * hih6130_remove() - remove device
276 * @client: I2C client device
277 */
278static int hih6130_remove(struct i2c_client *client)
279{
280 struct hih6130 *hih6130 = i2c_get_clientdata(client);
281
282 hwmon_device_unregister(hih6130->hwmon_dev);
283 sysfs_remove_group(&client->dev.kobj, &hih6130_attr_group);
284
285 return 0;
286} 248}
287 249
288/* Device ID table */ 250/* Device ID table */
@@ -295,7 +257,6 @@ MODULE_DEVICE_TABLE(i2c, hih6130_id);
295static struct i2c_driver hih6130_driver = { 257static struct i2c_driver hih6130_driver = {
296 .driver.name = "hih6130", 258 .driver.name = "hih6130",
297 .probe = hih6130_probe, 259 .probe = hih6130_probe,
298 .remove = hih6130_remove,
299 .id_table = hih6130_id, 260 .id_table = hih6130_id,
300}; 261};
301 262