Lines Matching +full:pulses +full:- +full:per +full:- +full:revolution

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * g762 - Driver for the Global Mixed-mode Technology Inc. fan speed
15 * http://natisbad.org/NAS/refs/GMT_EDS-762_763-080710-0.2.pdf
27 * http://www.gmt.com.tw/product/datasheet/EDS-762_3.pdf
36 #include <linux/hwmon-sysfs.h>
66 #define G762_REG_FAN_CMD1_FAN_MODE 0x10 /* fan mode: closed/open-loop */
70 #define G762_REG_FAN_CMD1_PULSE_PER_REV 0x01 /* pulse per fan revolution */
90 /* Register data is read (and cached) at most once per second. */
94 * Extract pulse count per fan revolution value (2 or 4) from given
130 u8 set_cnt; /* controls fan rotation speed in closed-loop mode */
137 u8 set_out; /* controls fan rotation speed in open-loop mode */
138 u8 fan_cmd1; /* 0: FG_PLS_ID0 FG pulses count per revolution
139 * 0: 2 counts per revolution
140 * 1: 4 counts per revolution
148 * 4: FAN_MODE 1:closed-loop, 0:open-loop
153 u8 fan_cmd2; /* 0,1: FAN_STARTV 0,1,2,3 -> 0,32,64,96 dac_code
194 /* helper to grab and cache data, at most one time per second */
198 struct i2c_client *client = data->client; in g762_update_client()
201 mutex_lock(&data->update_lock); in g762_update_client()
202 if (time_before(jiffies, data->last_updated + G762_UPDATE_INTERVAL) && in g762_update_client()
203 likely(data->valid)) in g762_update_client()
209 data->set_cnt = ret; in g762_update_client()
214 data->act_cnt = ret; in g762_update_client()
219 data->fan_sta = ret; in g762_update_client()
224 data->set_out = ret; in g762_update_client()
229 data->fan_cmd1 = ret; in g762_update_client()
234 data->fan_cmd2 = ret; in g762_update_client()
236 data->last_updated = jiffies; in g762_update_client()
237 data->valid = true; in g762_update_client()
239 mutex_unlock(&data->update_lock); in g762_update_client()
260 return -EINVAL; in do_set_clk_freq()
264 data->clk_freq = val; in do_set_clk_freq()
278 mutex_lock(&data->update_lock); in do_set_pwm_mode()
281 data->fan_cmd1 |= G762_REG_FAN_CMD1_OUT_MODE; in do_set_pwm_mode()
284 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_OUT_MODE; in do_set_pwm_mode()
287 ret = -EINVAL; in do_set_pwm_mode()
290 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_mode()
291 data->fan_cmd1); in do_set_pwm_mode()
292 data->valid = false; in do_set_pwm_mode()
294 mutex_unlock(&data->update_lock); in do_set_pwm_mode()
308 mutex_lock(&data->update_lock); in do_set_fan_div()
311 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
312 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
315 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
316 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
319 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
320 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
323 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID0; in do_set_fan_div()
324 data->fan_cmd1 |= G762_REG_FAN_CMD1_CLK_DIV_ID1; in do_set_fan_div()
327 ret = -EINVAL; in do_set_fan_div()
330 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_fan_div()
331 data->fan_cmd1); in do_set_fan_div()
332 data->valid = false; in do_set_fan_div()
334 mutex_unlock(&data->update_lock); in do_set_fan_div()
348 mutex_lock(&data->update_lock); in do_set_fan_gear_mode()
351 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
352 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
355 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
356 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
359 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_GEAR_MODE_0; in do_set_fan_gear_mode()
360 data->fan_cmd2 |= G762_REG_FAN_CMD2_GEAR_MODE_1; in do_set_fan_gear_mode()
363 ret = -EINVAL; in do_set_fan_gear_mode()
366 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, in do_set_fan_gear_mode()
367 data->fan_cmd2); in do_set_fan_gear_mode()
368 data->valid = false; in do_set_fan_gear_mode()
370 mutex_unlock(&data->update_lock); in do_set_fan_gear_mode()
375 /* Set number of fan pulses per revolution. Accepts either 2 or 4. */
384 mutex_lock(&data->update_lock); in do_set_fan_pulses()
387 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PULSE_PER_REV; in do_set_fan_pulses()
390 data->fan_cmd1 |= G762_REG_FAN_CMD1_PULSE_PER_REV; in do_set_fan_pulses()
393 ret = -EINVAL; in do_set_fan_pulses()
396 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_fan_pulses()
397 data->fan_cmd1); in do_set_fan_pulses()
398 data->valid = false; in do_set_fan_pulses()
400 mutex_unlock(&data->update_lock); in do_set_fan_pulses()
405 /* Set fan mode. Accepts either 1 (open-loop) or 2 (closed-loop). */
414 mutex_lock(&data->update_lock); in do_set_pwm_enable()
417 data->fan_cmd1 |= G762_REG_FAN_CMD1_FAN_MODE; in do_set_pwm_enable()
420 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_FAN_MODE; in do_set_pwm_enable()
426 * value of 254 if it is 255 when switching to open-loop. in do_set_pwm_enable()
428 if (data->set_cnt == 0xff) in do_set_pwm_enable()
429 i2c_smbus_write_byte_data(data->client, in do_set_pwm_enable()
433 ret = -EINVAL; in do_set_pwm_enable()
437 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_enable()
438 data->fan_cmd1); in do_set_pwm_enable()
439 data->valid = false; in do_set_pwm_enable()
441 mutex_unlock(&data->update_lock); in do_set_pwm_enable()
455 mutex_lock(&data->update_lock); in do_set_pwm_polarity()
458 data->fan_cmd1 &= ~G762_REG_FAN_CMD1_PWM_POLARITY; in do_set_pwm_polarity()
461 data->fan_cmd1 |= G762_REG_FAN_CMD1_PWM_POLARITY; in do_set_pwm_polarity()
464 ret = -EINVAL; in do_set_pwm_polarity()
467 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in do_set_pwm_polarity()
468 data->fan_cmd1); in do_set_pwm_polarity()
469 data->valid = false; in do_set_pwm_polarity()
471 mutex_unlock(&data->update_lock); in do_set_pwm_polarity()
478 * 255 (full speed). This only makes sense in open-loop mode.
483 struct i2c_client *client = data->client; in do_set_pwm()
487 return -EINVAL; in do_set_pwm()
489 mutex_lock(&data->update_lock); in do_set_pwm()
491 data->valid = false; in do_set_pwm()
492 mutex_unlock(&data->update_lock); in do_set_pwm()
498 * Set fan RPM value. Can be called both in closed and open-loop mode
499 * but effect will only be seen after closed-loop mode is configured.
509 mutex_lock(&data->update_lock); in do_set_fan_target()
510 data->set_cnt = cnt_from_rpm(val, data->clk_freq, in do_set_fan_target()
511 G762_PULSE_FROM_REG(data->fan_cmd1), in do_set_fan_target()
512 G762_CLKDIV_FROM_REG(data->fan_cmd1), in do_set_fan_target()
513 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in do_set_fan_target()
514 ret = i2c_smbus_write_byte_data(data->client, G762_REG_SET_CNT, in do_set_fan_target()
515 data->set_cnt); in do_set_fan_target()
516 data->valid = false; in do_set_fan_target()
517 mutex_unlock(&data->update_lock); in do_set_fan_target()
531 mutex_lock(&data->update_lock); in do_set_fan_startv()
534 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
535 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
538 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
539 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
542 data->fan_cmd2 &= ~G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
543 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
546 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_0; in do_set_fan_startv()
547 data->fan_cmd2 |= G762_REG_FAN_CMD2_FAN_STARTV_1; in do_set_fan_startv()
550 ret = -EINVAL; in do_set_fan_startv()
553 ret = i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD2, in do_set_fan_startv()
554 data->fan_cmd2); in do_set_fan_startv()
555 data->valid = false; in do_set_fan_startv()
557 mutex_unlock(&data->update_lock); in do_set_fan_startv()
586 clk_disable_unprepare(g762->clk); in g762_of_clock_disable()
587 clk_put(g762->clk); in g762_of_clock_disable()
597 if (!client->dev.of_node) in g762_of_clock_enable()
600 clk = of_clk_get(client->dev.of_node, 0); in g762_of_clock_enable()
602 dev_err(&client->dev, "failed to get clock\n"); in g762_of_clock_enable()
608 dev_err(&client->dev, "failed to enable clock\n"); in g762_of_clock_enable()
613 ret = do_set_clk_freq(&client->dev, clk_freq); in g762_of_clock_enable()
615 dev_err(&client->dev, "invalid clock freq %lu\n", clk_freq); in g762_of_clock_enable()
620 data->clk = clk; in g762_of_clock_enable()
622 ret = devm_add_action(&client->dev, g762_of_clock_disable, data); in g762_of_clock_enable()
624 dev_err(&client->dev, "failed to add disable clock action\n"); in g762_of_clock_enable()
647 if (of_property_read_u32(client->dev.of_node, pname, &pval)) in g762_of_prop_import_one()
650 dev_dbg(&client->dev, "found %s (%d)\n", pname, pval); in g762_of_prop_import_one()
651 ret = (*psetter)(&client->dev, pval); in g762_of_prop_import_one()
653 dev_err(&client->dev, "unable to set %s (%d)\n", pname, pval); in g762_of_prop_import_one()
662 if (!client->dev.of_node) in g762_of_prop_import()
698 struct g762_platform_data *pdata = dev_get_platdata(&client->dev); in g762_pdata_prop_import()
704 ret = do_set_fan_gear_mode(&client->dev, pdata->fan_gear_mode); in g762_pdata_prop_import()
708 ret = do_set_pwm_polarity(&client->dev, pdata->pwm_polarity); in g762_pdata_prop_import()
712 ret = do_set_fan_startv(&client->dev, pdata->fan_startv); in g762_pdata_prop_import()
716 return do_set_clk_freq(&client->dev, pdata->clk_freq); in g762_pdata_prop_import()
736 mutex_lock(&data->update_lock); in fan1_input_show()
738 if (data->fan_sta & G762_REG_FAN_STA_OOC) { in fan1_input_show()
739 rpm = rpm_from_cnt(data->act_cnt, data->clk_freq, in fan1_input_show()
740 G762_PULSE_FROM_REG(data->fan_cmd1), in fan1_input_show()
741 G762_CLKDIV_FROM_REG(data->fan_cmd1), in fan1_input_show()
742 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in fan1_input_show()
744 mutex_unlock(&data->update_lock); in fan1_input_show()
762 !!(data->fan_cmd1 & G762_REG_FAN_CMD1_OUT_MODE)); in pwm1_mode_show()
773 return -EINVAL; in pwm1_mode_store()
794 return sprintf(buf, "%d\n", G762_CLKDIV_FROM_REG(data->fan_cmd1)); in fan1_div_show()
804 return -EINVAL; in fan1_div_store()
815 * of tachometer pulses per fan revolution.
825 return sprintf(buf, "%d\n", G762_PULSE_FROM_REG(data->fan_cmd1)); in fan1_pulses_show()
836 return -EINVAL; in fan1_pulses_store()
847 * (i.e. closed or open-loop).
853 * 1 : manual fan speed control enabled (use pwm[1-*]) (open-loop)
854 * 2+: automatic fan speed control enabled (use fan[1-*]_target) (closed-loop)
857 * and it is not emulated by g762 driver. -EINVAL is returned in this case.
868 (!!(data->fan_cmd1 & G762_REG_FAN_CMD1_FAN_MODE)) + 1); in pwm1_enable_show()
879 return -EINVAL; in pwm1_enable_store()
890 * (which affects fan speed) in open-loop mode. 0 stops the fan and 255
901 return sprintf(buf, "%d\n", data->set_out); in pwm1_show()
911 return -EINVAL; in pwm1_store()
922 * closed-loop mode. Speed is given as a RPM value; then the chip will regulate
923 * the fan speed using pulses from fan tachometer.
940 mutex_lock(&data->update_lock); in fan1_target_show()
941 rpm = rpm_from_cnt(data->set_cnt, data->clk_freq, in fan1_target_show()
942 G762_PULSE_FROM_REG(data->fan_cmd1), in fan1_target_show()
943 G762_CLKDIV_FROM_REG(data->fan_cmd1), in fan1_target_show()
944 G762_GEARMULT_FROM_REG(data->fan_cmd2)); in fan1_target_show()
945 mutex_unlock(&data->update_lock); in fan1_target_show()
958 return -EINVAL; in fan1_target_store()
976 return sprintf(buf, "%u\n", !!(data->fan_sta & G762_REG_FAN_STA_FAIL)); in fan1_fault_show()
991 return sprintf(buf, "%u\n", !(data->fan_sta & G762_REG_FAN_STA_OOC)); in fan1_alarm_show()
1032 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_FAIL; in g762_fan_init()
1033 data->fan_cmd1 |= G762_REG_FAN_CMD1_DET_FAN_OOC; in g762_fan_init()
1034 data->valid = false; in g762_fan_init()
1036 return i2c_smbus_write_byte_data(data->client, G762_REG_FAN_CMD1, in g762_fan_init()
1037 data->fan_cmd1); in g762_fan_init()
1042 struct device *dev = &client->dev; in g762_probe()
1047 if (!i2c_check_functionality(client->adapter, in g762_probe()
1049 return -ENODEV; in g762_probe()
1053 return -ENOMEM; in g762_probe()
1056 data->client = client; in g762_probe()
1057 mutex_init(&data->update_lock); in g762_probe()
1076 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, in g762_probe()