Lines Matching +full:hardware +full:- +full:wise
1 // SPDX-License-Identifier: GPL-2.0+
3 * Hardware monitoring driver for EMC2305 fan controller
62 * struct emc2305_cdev_data - device-specific cooling device state
70 * according to some system wise considerations, like absence of some replaceable units (PSU or
78 * From other side, fan speed is to be updated in hardware through 'pwm' only in case the
90 * struct emc2305_data - device-specific data
122 return data->pwm_num; in emc2305_get_max_channel()
127 struct emc2305_data *data = cdev->devdata; in emc2305_get_cdev_idx()
128 size_t len = strlen(cdev->type); in emc2305_get_cdev_idx()
132 return -EINVAL; in emc2305_get_cdev_idx()
143 if (!data->pwm_separate) in emc2305_get_cdev_idx()
146 ret = cdev->type[len - 1]; in emc2305_get_cdev_idx()
149 return ret - '1'; in emc2305_get_cdev_idx()
153 return -EINVAL; in emc2305_get_cdev_idx()
159 struct emc2305_data *data = cdev->devdata; in emc2305_get_cur_state()
165 *state = data->cdev_data[cdev_idx].cur_state; in emc2305_get_cur_state()
171 struct emc2305_data *data = cdev->devdata; in emc2305_get_max_state()
172 *state = data->max_state; in emc2305_get_max_state()
179 struct i2c_client *client = data->client; in __emc2305_set_cur_state()
182 state = max_t(unsigned long, state, data->cdev_data[cdev_idx].last_hwmon_state); in __emc2305_set_cur_state()
184 val = EMC2305_PWM_STATE2DUTY(state, data->max_state, EMC2305_FAN_MAX); in __emc2305_set_cur_state()
186 data->cdev_data[cdev_idx].cur_state = state; in __emc2305_set_cur_state()
187 if (data->pwm_separate) { in __emc2305_set_cur_state()
196 for (i = 0; i < data->pwm_num; i++) { in __emc2305_set_cur_state()
209 struct emc2305_data *data = cdev->devdata; in emc2305_set_cur_state()
211 if (state > data->max_state) in emc2305_set_cur_state()
212 return -EINVAL; in emc2305_set_cur_state()
219 data->cdev_data[cdev_idx].last_thermal_state = state; in emc2305_set_cur_state()
236 struct i2c_client *client = data->client; in emc2305_show_fault()
249 struct i2c_client *client = data->client; in emc2305_show_fan()
267 struct i2c_client *client = data->client; in emc2305_show_pwm()
275 struct i2c_client *client = data->client; in emc2305_set_pwm()
278 if (val < data->pwm_min[channel] || val > EMC2305_FAN_MAX) in emc2305_set_pwm()
279 return -EINVAL; in emc2305_set_pwm()
284 data->cdev_data[channel].cur_state = EMC2305_PWM_DUTY2STATE(val, data->max_state, in emc2305_set_pwm()
295 cdev_idx = (idx) ? idx - 1 : 0; in emc2305_set_single_tz()
296 pwm = data->pwm_min[cdev_idx]; in emc2305_set_single_tz()
298 data->cdev_data[cdev_idx].cdev = in emc2305_set_single_tz()
302 if (IS_ERR(data->cdev_data[cdev_idx].cdev)) { in emc2305_set_single_tz()
304 return PTR_ERR(data->cdev_data[cdev_idx].cdev); in emc2305_set_single_tz()
307 if (data->pwm_separate) { in emc2305_set_single_tz()
312 for (i = 0; i < data->pwm_num; i++) { in emc2305_set_single_tz()
318 data->cdev_data[cdev_idx].cur_state = in emc2305_set_single_tz()
319 EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state, in emc2305_set_single_tz()
321 data->cdev_data[cdev_idx].last_hwmon_state = in emc2305_set_single_tz()
322 EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state, in emc2305_set_single_tz()
332 if (!data->pwm_separate) in emc2305_set_tz()
335 for (i = 0; i < data->pwm_num; i++) { in emc2305_set_tz()
354 if (data->cdev_data[i].cdev) in emc2305_unset_tz()
355 thermal_cooling_device_unregister(data->cdev_data[i].cdev); in emc2305_unset_tz()
402 /* If thermal is configured - handle PWM limit setting. */ in emc2305_write()
404 if (data->pwm_separate) in emc2305_write()
408 data->cdev_data[cdev_idx].last_hwmon_state = in emc2305_write()
409 EMC2305_PWM_DUTY2STATE(val, data->max_state, in emc2305_write()
415 if (data->cdev_data[cdev_idx].last_hwmon_state >= in emc2305_write()
416 data->cdev_data[cdev_idx].last_thermal_state) in emc2305_write()
418 data->cdev_data[cdev_idx].last_hwmon_state); in emc2305_write()
430 return -EOPNOTSUPP; in emc2305_write()
473 return -EOPNOTSUPP; in emc2305_read()
515 data->pwm_num = 5; in emc2305_identify()
518 data->pwm_num = 3; in emc2305_identify()
521 data->pwm_num = 2; in emc2305_identify()
524 data->pwm_num = 1; in emc2305_identify()
527 return -ENODEV; in emc2305_identify()
535 struct i2c_adapter *adapter = client->adapter; in emc2305_probe()
536 struct device *dev = &client->dev; in emc2305_probe()
544 return -ENODEV; in emc2305_probe()
548 return -ENODEV; in emc2305_probe()
552 return -ENOMEM; in emc2305_probe()
555 data->client = client; in emc2305_probe()
561 pdata = dev_get_platdata(&client->dev); in emc2305_probe()
563 if (!pdata->max_state || pdata->max_state > EMC2305_FAN_MAX_STATE) in emc2305_probe()
564 return -EINVAL; in emc2305_probe()
565 data->max_state = pdata->max_state; in emc2305_probe()
571 if (!pdata->pwm_num || pdata->pwm_num > EMC2305_PWM_MAX) in emc2305_probe()
572 return -EINVAL; in emc2305_probe()
573 data->pwm_num = pdata->pwm_num; in emc2305_probe()
574 data->pwm_separate = pdata->pwm_separate; in emc2305_probe()
576 data->pwm_min[i] = pdata->pwm_min[i]; in emc2305_probe()
578 data->max_state = EMC2305_FAN_MAX_STATE; in emc2305_probe()
579 data->pwm_separate = false; in emc2305_probe()
581 data->pwm_min[i] = EMC2305_FAN_MIN; in emc2305_probe()
584 data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "emc2305", data, in emc2305_probe()
586 if (IS_ERR(data->hwmon_dev)) in emc2305_probe()
587 return PTR_ERR(data->hwmon_dev); in emc2305_probe()
595 for (i = 0; i < data->pwm_num; i++) { in emc2305_probe()
597 data->pwm_min[i]); in emc2305_probe()
607 struct device *dev = &client->dev; in emc2305_remove()