Lines Matching +full:data +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0-only
3 * emc1403.c - SMSC Thermal Driver
17 #include <linux/hwmon-sysfs.h>
38 struct thermal_data *data = dev_get_drvdata(dev); in power_state_show() local
42 retval = regmap_read(data->regmap, 0x03, &val); in power_state_show()
51 struct thermal_data *data = dev_get_drvdata(dev); in power_state_store() local
56 return -EINVAL; in power_state_store()
58 retval = regmap_update_bits(data->regmap, 0x03, BIT(6), in power_state_store()
81 return -ENODEV; in emc1403_detect()
86 strscpy(info->type, "emc1402", I2C_NAME_SIZE); in emc1403_detect()
89 strscpy(info->type, "emc1403", I2C_NAME_SIZE); in emc1403_detect()
92 strscpy(info->type, "emc1422", I2C_NAME_SIZE); in emc1403_detect()
95 strscpy(info->type, "emc1423", I2C_NAME_SIZE); in emc1403_detect()
98 strscpy(info->type, "emc1404", I2C_NAME_SIZE); in emc1403_detect()
101 strscpy(info->type, "emc1424", I2C_NAME_SIZE); in emc1403_detect()
104 strscpy(info->type, "emc1428", I2C_NAME_SIZE); in emc1403_detect()
107 strscpy(info->type, "emc1438", I2C_NAME_SIZE); in emc1403_detect()
110 strscpy(info->type, "emc1442", I2C_NAME_SIZE); in emc1403_detect()
113 return -ENODEV; in emc1403_detect()
118 return -ENODEV; in emc1403_detect()
222 [temp_min] = -1,
223 [temp_max] = -1,
224 [temp_crit] = -1,
230 [temp_crit] = -1,
236 [temp_crit] = -1,
242 [temp_crit] = -1,
248 [temp_crit] = -1,
254 [temp_crit] = -1,
260 [temp_crit] = -1,
266 [temp_crit] = -1,
271 static int __emc1403_get_temp(struct thermal_data *data, int channel, in __emc1403_get_temp() argument
279 ret = regmap_read(data->regmap, emc1403_temp_regs[channel][map], &regvalh); in __emc1403_get_temp()
283 reg = emc1403_temp_regs_low[channel][map]; in __emc1403_get_temp()
285 ret = regmap_read(data->regmap, reg, &regvall); in __emc1403_get_temp()
290 if (data->chip == emc1428) in __emc1403_get_temp()
298 static int emc1403_get_temp(struct thermal_data *data, int channel, in emc1403_get_temp() argument
303 mutex_lock(&data->mutex); in emc1403_get_temp()
304 ret = __emc1403_get_temp(data, channel, map, val); in emc1403_get_temp()
305 mutex_unlock(&data->mutex); in emc1403_get_temp()
310 static int emc1403_get_hyst(struct thermal_data *data, int channel, in emc1403_get_hyst() argument
316 mutex_lock(&data->mutex); in emc1403_get_hyst()
317 ret = __emc1403_get_temp(data, channel, map, &limit); in emc1403_get_hyst()
320 ret = regmap_read(data->regmap, 0x21, &hyst); in emc1403_get_hyst()
326 *val = limit - hyst * 1000; in emc1403_get_hyst()
328 mutex_unlock(&data->mutex); in emc1403_get_hyst()
332 static int emc1403_temp_read(struct thermal_data *data, u32 attr, int channel, long *val) in emc1403_temp_read() argument
342 ret = emc1403_get_temp(data, channel, ema1403_temp_map[attr], val); in emc1403_temp_read()
345 ret = emc1403_get_hyst(data, channel, temp_min, val); in emc1403_temp_read()
348 ret = emc1403_get_hyst(data, channel, temp_max, val); in emc1403_temp_read()
351 ret = emc1403_get_hyst(data, channel, temp_crit, val); in emc1403_temp_read()
354 if (data->chip == emc1402) { in emc1403_temp_read()
355 ret = regmap_read(data->regmap, 0x02, &regval); in emc1403_temp_read()
358 *val = !!(regval & BIT(5 - 2 * channel)); in emc1403_temp_read()
360 ret = regmap_read(data->regmap, 0x36, &regval); in emc1403_temp_read()
363 *val = !!(regval & BIT(channel)); in emc1403_temp_read()
367 if (data->chip == emc1402) { in emc1403_temp_read()
368 ret = regmap_read(data->regmap, 0x02, &regval); in emc1403_temp_read()
371 *val = !!(regval & BIT(6 - 2 * channel)); in emc1403_temp_read()
373 ret = regmap_read(data->regmap, 0x35, &regval); in emc1403_temp_read()
376 *val = !!(regval & BIT(channel)); in emc1403_temp_read()
380 if (data->chip == emc1402) { in emc1403_temp_read()
381 ret = regmap_read(data->regmap, 0x02, &regval); in emc1403_temp_read()
384 *val = !!(regval & BIT(channel)); in emc1403_temp_read()
386 ret = regmap_read(data->regmap, 0x37, &regval); in emc1403_temp_read()
389 *val = !!(regval & BIT(channel)); in emc1403_temp_read()
393 ret = regmap_read(data->regmap, 0x1b, &regval); in emc1403_temp_read()
396 *val = !!(regval & BIT(channel)); in emc1403_temp_read()
399 return -EOPNOTSUPP; in emc1403_temp_read()
404 static int emc1403_get_convrate(struct thermal_data *data, long *val) in emc1403_get_convrate() argument
409 ret = regmap_read(data->regmap, 0x04, &convrate); in emc1403_get_convrate()
419 static int emc1403_chip_read(struct thermal_data *data, u32 attr, long *val) in emc1403_chip_read() argument
423 return emc1403_get_convrate(data, val); in emc1403_chip_read()
425 return -EOPNOTSUPP; in emc1403_chip_read()
430 u32 attr, int channel, long *val) in emc1403_read() argument
432 struct thermal_data *data = dev_get_drvdata(dev); in emc1403_read() local
436 return emc1403_temp_read(data, attr, channel, val); in emc1403_read()
438 return emc1403_chip_read(data, attr, val); in emc1403_read()
440 return -EOPNOTSUPP; in emc1403_read()
444 static int emc1403_set_hyst(struct thermal_data *data, long val) in emc1403_set_hyst() argument
449 if (data->chip == emc1428) in emc1403_set_hyst()
450 val = clamp_val(val, -128000, 127000); in emc1403_set_hyst()
454 mutex_lock(&data->mutex); in emc1403_set_hyst()
455 ret = __emc1403_get_temp(data, 0, temp_crit, &limit); in emc1403_set_hyst()
459 hyst = limit - val; in emc1403_set_hyst()
460 if (data->chip == emc1428) in emc1403_set_hyst()
464 ret = regmap_write(data->regmap, 0x21, hyst); in emc1403_set_hyst()
466 mutex_unlock(&data->mutex); in emc1403_set_hyst()
470 static int emc1403_set_temp(struct thermal_data *data, int channel, in emc1403_set_temp() argument
478 regh = emc1403_temp_regs[channel][map]; in emc1403_set_temp()
479 regl = emc1403_temp_regs_low[channel][map]; in emc1403_set_temp()
481 mutex_lock(&data->mutex); in emc1403_set_temp()
483 if (data->chip == emc1428) in emc1403_set_temp()
484 val = clamp_val(val, -128000, 127875); in emc1403_set_temp()
488 ret = regmap_write(data->regmap, regh, (regval >> 3) & 0xff); in emc1403_set_temp()
491 ret = regmap_write(data->regmap, regl, (regval & 0x07) << 5); in emc1403_set_temp()
493 if (data->chip == emc1428) in emc1403_set_temp()
494 val = clamp_val(val, -128000, 127000); in emc1403_set_temp()
498 ret = regmap_write(data->regmap, regh, regval); in emc1403_set_temp()
501 mutex_unlock(&data->mutex); in emc1403_set_temp()
505 static int emc1403_temp_write(struct thermal_data *data, u32 attr, int channel, long val) in emc1403_temp_write() argument
511 return emc1403_set_temp(data, channel, ema1403_temp_map[attr], val); in emc1403_temp_write()
513 return emc1403_set_hyst(data, val); in emc1403_temp_write()
515 return -EOPNOTSUPP; in emc1403_temp_write()
524 static int emc1403_set_convrate(struct thermal_data *data, unsigned int interval) in emc1403_set_convrate() argument
530 return regmap_write(data->regmap, 0x04, convrate); in emc1403_set_convrate()
533 static int emc1403_chip_write(struct thermal_data *data, u32 attr, long val) in emc1403_chip_write() argument
537 return emc1403_set_convrate(data, clamp_val(val, 0, 100000)); in emc1403_chip_write()
539 return -EOPNOTSUPP; in emc1403_chip_write()
544 u32 attr, int channel, long val) in emc1403_write() argument
546 struct thermal_data *data = dev_get_drvdata(dev); in emc1403_write() local
550 return emc1403_temp_write(data, attr, channel, val); in emc1403_write()
552 return emc1403_chip_write(data, attr, val); in emc1403_write()
554 return -EOPNOTSUPP; in emc1403_write()
558 static umode_t emc1403_temp_is_visible(const void *_data, u32 attr, int channel) in emc1403_temp_is_visible() argument
560 const struct thermal_data *data = _data; in emc1403_temp_is_visible() local
562 if (data->chip == emc1402 && channel > 1) in emc1403_temp_is_visible()
564 if (data->chip == emc1403 && channel > 2) in emc1403_temp_is_visible()
566 if (data->chip != emc1428 && channel > 3) in emc1403_temp_is_visible()
583 if (channel == 0) in emc1403_temp_is_visible()
601 static umode_t emc1403_is_visible(const void *data, enum hwmon_sensor_types type, in emc1403_is_visible() argument
602 u32 attr, int channel) in emc1403_is_visible() argument
606 return emc1403_temp_is_visible(data, attr, channel); in emc1403_is_visible()
608 return emc1403_chip_is_visible(data, attr); in emc1403_is_visible()
684 struct thermal_data *data; in emc1403_probe() local
688 data = devm_kzalloc(&client->dev, sizeof(struct thermal_data), in emc1403_probe()
690 if (!data) in emc1403_probe()
691 return -ENOMEM; in emc1403_probe()
693 data->chip = id->driver_data; in emc1403_probe()
694 data->regmap = devm_regmap_init_i2c(client, &emc1403_regmap_config); in emc1403_probe()
695 if (IS_ERR(data->regmap)) in emc1403_probe()
696 return PTR_ERR(data->regmap); in emc1403_probe()
698 mutex_init(&data->mutex); in emc1403_probe()
700 hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, in emc1403_probe()
701 client->name, data, in emc1403_probe()