Lines Matching +full:fan +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0+
34 /* Controller status (speeds) report offsets */
40 /* Controller duty report offsets */
74 "Internal fan speed",
75 "Controller fan 1 speed",
76 "Controller fan 2 speed",
77 "Controller fan 3 speed",
78 "Controller fan 4 speed",
99 u16 speed_input[6]; /* Pump, internal fan and four controller fan speeds in RPM */
100 u8 duty_input[3]; /* Pump, internal fan and controller fan duty in PWM */
158 mutex_lock(&priv->buffer_lock); in rog_ryujin_write_expanded()
160 memcpy_and_pad(priv->buffer, MAX_REPORT_LENGTH, cmd, cmd_length, 0x00); in rog_ryujin_write_expanded()
161 ret = hid_hw_output_report(priv->hdev, priv->buffer, MAX_REPORT_LENGTH); in rog_ryujin_write_expanded()
163 mutex_unlock(&priv->buffer_lock); in rog_ryujin_write_expanded()
167 /* Assumes priv->status_report_request_mutex is locked */
178 spin_lock_bh(&priv->status_report_request_lock); in rog_ryujin_execute_cmd()
180 spin_unlock_bh(&priv->status_report_request_lock); in rog_ryujin_execute_cmd()
190 return -ETIMEDOUT; in rog_ryujin_execute_cmd()
199 int ret = mutex_lock_interruptible(&priv->status_report_request_mutex); in rog_ryujin_get_status()
204 if (!time_after(jiffies, priv->updated + msecs_to_jiffies(STATUS_VALIDITY))) { in rog_ryujin_get_status()
212 &priv->cooler_status_received); in rog_ryujin_get_status()
216 /* Retrieve controller status (speeds) */ in rog_ryujin_get_status()
219 &priv->controller_status_received); in rog_ryujin_get_status()
226 &priv->cooler_duty_received); in rog_ryujin_get_status()
230 /* Retrieve controller duty */ in rog_ryujin_get_status()
233 &priv->controller_duty_received); in rog_ryujin_get_status()
237 priv->updated = jiffies; in rog_ryujin_get_status()
240 mutex_unlock(&priv->status_report_request_mutex); in rog_ryujin_get_status()
258 *val = priv->temp_input[channel]; in rog_ryujin_read()
261 *val = priv->speed_input[channel]; in rog_ryujin_read()
266 *val = priv->duty_input[channel]; in rog_ryujin_read()
269 return -EOPNOTSUPP; in rog_ryujin_read()
273 return -EOPNOTSUPP; /* unreachable */ in rog_ryujin_read()
290 return -EOPNOTSUPP; /* unreachable */ in rog_ryujin_read_string()
303 * Retrieve cooler duty since both pump and internal fan are set in rog_ryujin_write_fixed_duty()
306 ret = mutex_lock_interruptible(&priv->status_report_request_mutex); in rog_ryujin_write_fixed_duty()
311 &priv->cooler_duty_received); in rog_ryujin_write_fixed_duty()
317 /* Cooler duties are set as 0-100% */ in rog_ryujin_write_fixed_duty()
324 rog_ryujin_pwm_to_percent(priv->duty_input[1]); in rog_ryujin_write_fixed_duty()
326 /* Cooler internal fan duty */ in rog_ryujin_write_fixed_duty()
328 rog_ryujin_pwm_to_percent(priv->duty_input[0]); in rog_ryujin_write_fixed_duty()
332 ret = rog_ryujin_execute_cmd(priv, set_cmd, SET_CMD_LENGTH, &priv->cooler_duty_set); in rog_ryujin_write_fixed_duty()
334 mutex_unlock(&priv->status_report_request_mutex); in rog_ryujin_write_fixed_duty()
339 * Controller fan duty (channel == 2). No need to retrieve current in rog_ryujin_write_fixed_duty()
347 &priv->controller_duty_set); in rog_ryujin_write_fixed_duty()
353 priv->duty_input[channel] = val; in rog_ryujin_write_fixed_duty()
369 return -EINVAL; in rog_ryujin_write()
376 return -EOPNOTSUPP; in rog_ryujin_write()
380 return -EOPNOTSUPP; in rog_ryujin_write()
396 HWMON_CHANNEL_INFO(fan,
424 /* Received coolant temp and speeds of pump and internal fan */ in rog_ryujin_raw_event()
425 priv->temp_input[0] = in rog_ryujin_raw_event()
427 priv->speed_input[0] = get_unaligned_le16(data + RYUJIN_PUMP_SPEED); in rog_ryujin_raw_event()
428 priv->speed_input[1] = get_unaligned_le16(data + RYUJIN_INTERNAL_FAN_SPEED); in rog_ryujin_raw_event()
430 if (!completion_done(&priv->cooler_status_received)) in rog_ryujin_raw_event()
431 complete_all(&priv->cooler_status_received); in rog_ryujin_raw_event()
433 /* Received speeds of four fans attached to the controller */ in rog_ryujin_raw_event()
434 priv->speed_input[2] = get_unaligned_le16(data + RYUJIN_CONTROLLER_SPEED_1); in rog_ryujin_raw_event()
435 priv->speed_input[3] = get_unaligned_le16(data + RYUJIN_CONTROLLER_SPEED_2); in rog_ryujin_raw_event()
436 priv->speed_input[4] = get_unaligned_le16(data + RYUJIN_CONTROLLER_SPEED_3); in rog_ryujin_raw_event()
437 priv->speed_input[5] = get_unaligned_le16(data + RYUJIN_CONTROLLER_SPEED_4); in rog_ryujin_raw_event()
439 if (!completion_done(&priv->controller_status_received)) in rog_ryujin_raw_event()
440 complete_all(&priv->controller_status_received); in rog_ryujin_raw_event()
442 /* Received report for pump and internal fan duties (in %) */ in rog_ryujin_raw_event()
449 if (!completion_done(&priv->cooler_duty_set)) in rog_ryujin_raw_event()
450 complete_all(&priv->cooler_duty_set); in rog_ryujin_raw_event()
451 else if (!completion_done(&priv->cooler_duty_received)) in rog_ryujin_raw_event()
462 priv->duty_input[0] = rog_ryujin_percent_to_pwm(data[RYUJIN_PUMP_DUTY]); in rog_ryujin_raw_event()
463 priv->duty_input[1] = rog_ryujin_percent_to_pwm(data[RYUJIN_INTERNAL_FAN_DUTY]); in rog_ryujin_raw_event()
465 if (!completion_done(&priv->cooler_duty_received)) in rog_ryujin_raw_event()
466 complete_all(&priv->cooler_duty_received); in rog_ryujin_raw_event()
468 /* Received report for controller duty for fans (in PWM) */ in rog_ryujin_raw_event()
472 * a confirmation that setting the controller duty value was successful. in rog_ryujin_raw_event()
475 if (!completion_done(&priv->controller_duty_set)) in rog_ryujin_raw_event()
476 complete_all(&priv->controller_duty_set); in rog_ryujin_raw_event()
477 else if (!completion_done(&priv->controller_duty_received)) in rog_ryujin_raw_event()
488 priv->duty_input[2] = data[RYUJIN_CONTROLLER_DUTY]; in rog_ryujin_raw_event()
490 if (!completion_done(&priv->controller_duty_received)) in rog_ryujin_raw_event()
491 complete_all(&priv->controller_duty_received); in rog_ryujin_raw_event()
502 priv = devm_kzalloc(&hdev->dev, sizeof(*priv), GFP_KERNEL); in rog_ryujin_probe()
504 return -ENOMEM; in rog_ryujin_probe()
506 priv->hdev = hdev; in rog_ryujin_probe()
510 * Initialize priv->updated to STATUS_VALIDITY seconds in the past, making in rog_ryujin_probe()
514 priv->updated = jiffies - msecs_to_jiffies(STATUS_VALIDITY); in rog_ryujin_probe()
522 /* Enable hidraw so existing user-space tools can continue to work */ in rog_ryujin_probe()
535 priv->buffer = devm_kzalloc(&hdev->dev, MAX_REPORT_LENGTH, GFP_KERNEL); in rog_ryujin_probe()
536 if (!priv->buffer) { in rog_ryujin_probe()
537 ret = -ENOMEM; in rog_ryujin_probe()
541 mutex_init(&priv->status_report_request_mutex); in rog_ryujin_probe()
542 mutex_init(&priv->buffer_lock); in rog_ryujin_probe()
543 spin_lock_init(&priv->status_report_request_lock); in rog_ryujin_probe()
544 init_completion(&priv->cooler_status_received); in rog_ryujin_probe()
545 init_completion(&priv->controller_status_received); in rog_ryujin_probe()
546 init_completion(&priv->cooler_duty_received); in rog_ryujin_probe()
547 init_completion(&priv->controller_duty_received); in rog_ryujin_probe()
548 init_completion(&priv->cooler_duty_set); in rog_ryujin_probe()
549 init_completion(&priv->controller_duty_set); in rog_ryujin_probe()
551 priv->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, "rog_ryujin", in rog_ryujin_probe()
553 if (IS_ERR(priv->hwmon_dev)) { in rog_ryujin_probe()
554 ret = PTR_ERR(priv->hwmon_dev); in rog_ryujin_probe()
572 hwmon_device_unregister(priv->hwmon_dev); in rog_ryujin_remove()