Lines Matching +full:hardware +full:- +full:wise

1 // SPDX-License-Identifier: GPL-2.0+
3 * Hardware monitoring driver for EMC2305 fan controller
59 * struct emc2305_cdev_data - device-specific cooling device state
67 * according to some system wise considerations, like absence of some replaceable units (PSU or
75 * From other side, fan speed is to be updated in hardware through 'pwm' only in case the
87 * struct emc2305_data - device-specific data
117 return data->pwm_num; in emc2305_get_max_channel()
122 struct emc2305_data *data = cdev->devdata; in emc2305_get_cdev_idx()
123 size_t len = strlen(cdev->type); in emc2305_get_cdev_idx()
127 return -EINVAL; in emc2305_get_cdev_idx()
138 if (!data->pwm_separate) in emc2305_get_cdev_idx()
141 ret = cdev->type[len - 1]; in emc2305_get_cdev_idx()
144 return ret - '1'; in emc2305_get_cdev_idx()
148 return -EINVAL; in emc2305_get_cdev_idx()
154 struct emc2305_data *data = cdev->devdata; in emc2305_get_cur_state()
160 *state = data->cdev_data[cdev_idx].cur_state; in emc2305_get_cur_state()
166 struct emc2305_data *data = cdev->devdata; in emc2305_get_max_state()
167 *state = data->max_state; in emc2305_get_max_state()
174 struct i2c_client *client = data->client; in __emc2305_set_cur_state()
177 state = max_t(unsigned long, state, data->cdev_data[cdev_idx].last_hwmon_state); in __emc2305_set_cur_state()
179 val = EMC2305_PWM_STATE2DUTY(state, data->max_state, EMC2305_FAN_MAX); in __emc2305_set_cur_state()
181 data->cdev_data[cdev_idx].cur_state = state; in __emc2305_set_cur_state()
182 if (data->pwm_separate) { in __emc2305_set_cur_state()
191 for (i = 0; i < data->pwm_num; i++) { in __emc2305_set_cur_state()
204 struct emc2305_data *data = cdev->devdata; in emc2305_set_cur_state()
206 if (state > data->max_state) in emc2305_set_cur_state()
207 return -EINVAL; in emc2305_set_cur_state()
214 data->cdev_data[cdev_idx].last_thermal_state = state; in emc2305_set_cur_state()
231 struct i2c_client *client = data->client; in emc2305_show_fault()
244 struct i2c_client *client = data->client; in emc2305_show_fan()
262 struct i2c_client *client = data->client; in emc2305_show_pwm()
270 struct i2c_client *client = data->client; in emc2305_set_pwm()
273 if (val < data->pwm_min[channel] || val > EMC2305_FAN_MAX) in emc2305_set_pwm()
274 return -EINVAL; in emc2305_set_pwm()
279 data->cdev_data[channel].cur_state = EMC2305_PWM_DUTY2STATE(val, data->max_state, in emc2305_set_pwm()
290 cdev_idx = (idx) ? idx - 1 : 0; in emc2305_set_single_tz()
291 pwm = data->pwm_min[cdev_idx]; in emc2305_set_single_tz()
293 data->cdev_data[cdev_idx].cdev = in emc2305_set_single_tz()
294 devm_thermal_of_cooling_device_register(dev, dev->of_node, in emc2305_set_single_tz()
298 if (IS_ERR(data->cdev_data[cdev_idx].cdev)) { in emc2305_set_single_tz()
300 return PTR_ERR(data->cdev_data[cdev_idx].cdev); in emc2305_set_single_tz()
303 if (data->pwm_separate) { in emc2305_set_single_tz()
308 for (i = 0; i < data->pwm_num; i++) { in emc2305_set_single_tz()
314 data->cdev_data[cdev_idx].cur_state = in emc2305_set_single_tz()
315 EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state, in emc2305_set_single_tz()
317 data->cdev_data[cdev_idx].last_hwmon_state = in emc2305_set_single_tz()
318 EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state, in emc2305_set_single_tz()
328 if (!data->pwm_separate) in emc2305_set_tz()
331 for (i = 0; i < data->pwm_num; i++) { in emc2305_set_tz()
383 /* If thermal is configured - handle PWM limit setting. */ in emc2305_write()
385 if (data->pwm_separate) in emc2305_write()
389 data->cdev_data[cdev_idx].last_hwmon_state = in emc2305_write()
390 EMC2305_PWM_DUTY2STATE(val, data->max_state, in emc2305_write()
396 if (data->cdev_data[cdev_idx].last_hwmon_state >= in emc2305_write()
397 data->cdev_data[cdev_idx].last_thermal_state) in emc2305_write()
399 data->cdev_data[cdev_idx].last_hwmon_state); in emc2305_write()
411 return -EOPNOTSUPP; in emc2305_write()
454 return -EOPNOTSUPP; in emc2305_read()
496 data->pwm_num = 5; in emc2305_identify()
499 data->pwm_num = 3; in emc2305_identify()
502 data->pwm_num = 2; in emc2305_identify()
505 data->pwm_num = 1; in emc2305_identify()
508 return -ENODEV; in emc2305_identify()
516 struct i2c_adapter *adapter = client->adapter; in emc2305_probe()
517 struct device *dev = &client->dev; in emc2305_probe()
525 return -ENODEV; in emc2305_probe()
529 return -ENODEV; in emc2305_probe()
533 return -ENOMEM; in emc2305_probe()
536 data->client = client; in emc2305_probe()
542 pdata = dev_get_platdata(&client->dev); in emc2305_probe()
544 if (!pdata->max_state || pdata->max_state > EMC2305_FAN_MAX_STATE) in emc2305_probe()
545 return -EINVAL; in emc2305_probe()
546 data->max_state = pdata->max_state; in emc2305_probe()
552 if (!pdata->pwm_num || pdata->pwm_num > EMC2305_PWM_MAX) in emc2305_probe()
553 return -EINVAL; in emc2305_probe()
554 data->pwm_num = pdata->pwm_num; in emc2305_probe()
555 data->pwm_separate = pdata->pwm_separate; in emc2305_probe()
557 data->pwm_min[i] = pdata->pwm_min[i]; in emc2305_probe()
559 data->max_state = EMC2305_FAN_MAX_STATE; in emc2305_probe()
560 data->pwm_separate = false; in emc2305_probe()
562 data->pwm_min[i] = EMC2305_FAN_MIN; in emc2305_probe()
565 data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "emc2305", data, in emc2305_probe()
567 if (IS_ERR(data->hwmon_dev)) in emc2305_probe()
568 return PTR_ERR(data->hwmon_dev); in emc2305_probe()
576 for (i = 0; i < data->pwm_num; i++) { in emc2305_probe()
578 data->pwm_min[i]); in emc2305_probe()