Lines Matching refs:hwmon

4 #include <linux/hwmon.h>
10 #include "hwmon.h"
18 /* All temperatures retrieved in units of 0.125C. hwmon framework expect
86 struct mlx5_hwmon *hwmon = dev_get_drvdata(dev);
93 err = mlx5_hwmon_query_mtmp(hwmon->mdev, hwmon->temp_channel_desc[channel].sensor_index,
116 struct mlx5_hwmon *hwmon = dev_get_drvdata(dev);
121 return mlx5_hwmon_reset_max_temp(hwmon->mdev,
122 hwmon->temp_channel_desc[channel].sensor_index);
147 struct mlx5_hwmon *hwmon = dev_get_drvdata(dev);
152 *str = (const char *)hwmon->temp_channel_desc[channel].sensor_name;
163 static int mlx5_hwmon_init_channels_names(struct mlx5_hwmon *hwmon)
167 for (i = 0; i < hwmon->asic_platform_scount + hwmon->module_scount; i++) {
172 err = mlx5_hwmon_query_mtmp(hwmon->mdev, hwmon->temp_channel_desc[i].sensor_index,
179 snprintf(hwmon->temp_channel_desc[i].sensor_name,
180 sizeof(hwmon->temp_channel_desc[i].sensor_name), "sensor%u",
181 hwmon->temp_channel_desc[i].sensor_index);
185 memcpy(&hwmon->temp_channel_desc[i].sensor_name, sensor_name,
207 static int mlx5_hwmon_init_sensors_indexes(struct mlx5_hwmon *hwmon, u64 sensor_map)
217 hwmon->temp_channel_desc[i].sensor_index = bit_pos;
221 if (hwmon->module_scount)
222 err = mlx5_hwmon_get_module_sensor_index(hwmon->mdev,
223 &hwmon->temp_channel_desc[i].sensor_index);
228 static void mlx5_hwmon_channel_info_init(struct mlx5_hwmon *hwmon)
232 hwmon->channel_info[0] = &hwmon->chip_info;
233 hwmon->channel_info[1] = &hwmon->temp_info;
235 hwmon->chip_channel_config[0] = HWMON_C_REGISTER_TZ;
236 hwmon->chip_info.config = (const u32 *)hwmon->chip_channel_config;
237 hwmon->chip_info.type = hwmon_chip;
239 for (i = 0; i < hwmon->asic_platform_scount + hwmon->module_scount; i++)
240 hwmon->temp_channel_config[i] = HWMON_T_INPUT | HWMON_T_HIGHEST | HWMON_T_CRIT |
243 hwmon->temp_info.config = (const u32 *)hwmon->temp_channel_config;
244 hwmon->temp_info.type = hwmon_temp;
284 static void mlx5_hwmon_free(struct mlx5_hwmon *hwmon)
286 if (!hwmon)
289 kfree(hwmon->temp_channel_config);
290 kfree(hwmon->temp_channel_desc);
291 kfree(hwmon);
296 struct mlx5_hwmon *hwmon;
301 hwmon = kzalloc(sizeof(*mdev->hwmon), GFP_KERNEL);
302 if (!hwmon)
305 err = mlx5_hwmon_get_sensors_count(mdev, &hwmon->asic_platform_scount);
314 hwmon->module_scount = mon_cap ? 1 : 0;
315 sensors_count = hwmon->asic_platform_scount + hwmon->module_scount;
316 hwmon->temp_channel_desc = kcalloc(sensors_count, sizeof(*hwmon->temp_channel_desc),
318 if (!hwmon->temp_channel_desc) {
324 hwmon->temp_channel_config = kcalloc(sensors_count + 1, sizeof(*hwmon->temp_channel_config),
326 if (!hwmon->temp_channel_config) {
331 hwmon->mdev = mdev;
333 return hwmon;
336 kfree(hwmon->temp_channel_desc);
338 kfree(hwmon);
342 static int mlx5_hwmon_dev_init(struct mlx5_hwmon *hwmon)
349 err = mlx5_core_access_reg(hwmon->mdev, mtcap_in, sizeof(mtcap_in),
355 mlx5_hwmon_channel_info_init(hwmon);
356 mlx5_hwmon_init_sensors_indexes(hwmon, MLX5_GET64(mtcap_reg, mtcap_out, sensor_map));
357 err = mlx5_hwmon_init_channels_names(hwmon);
361 for (i = 0; i < hwmon->asic_platform_scount + hwmon->module_scount; i++) {
362 err = mlx5_hwmon_enable_max_temp(hwmon->mdev,
363 hwmon->temp_channel_desc[i].sensor_index);
368 hwmon->chip.ops = &mlx5_hwmon_ops;
369 hwmon->chip.info = (const struct hwmon_channel_info **)hwmon->channel_info;
377 struct mlx5_hwmon *hwmon;
383 hwmon = mlx5_hwmon_alloc(mdev);
384 if (IS_ERR(hwmon))
385 return PTR_ERR(hwmon);
387 err = mlx5_hwmon_dev_init(hwmon);
391 hwmon->hwmon_dev = hwmon_device_register_with_info(dev, "mlx5",
392 hwmon,
393 &hwmon->chip,
395 if (IS_ERR(hwmon->hwmon_dev)) {
396 err = PTR_ERR(hwmon->hwmon_dev);
400 mdev->hwmon = hwmon;
404 mlx5_hwmon_free(hwmon);
410 struct mlx5_hwmon *hwmon = mdev->hwmon;
412 if (!hwmon)
415 hwmon_device_unregister(hwmon->hwmon_dev);
416 mlx5_hwmon_free(hwmon);
417 mdev->hwmon = NULL;